From e50ccc51af75eb55702c874f3d26adac9e1dfcf4 Mon Sep 17 00:00:00 2001 From: Jasper van der Heide <19666278+jaspervanderheide@users.noreply.github.com> Date: Mon, 6 Feb 2023 10:26:49 +0100 Subject: [PATCH 1/6] Update README.MD Added the goal of the Algorithm Register --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index ab8a3bcd..2df24588 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,11 @@ The Ministry of the Interior and Kingdom Relations is developing the Algorithm R The Algorithm Register (algoritmes.overheid.nl) is being developed with open source software. The source code can be viewed here on GitHub. It can be downloaded and reused. Github is a platform with transparent version control, where technology in development can be easily shared. ## Motivation The government increasingly works digitally and uses more and more algorithms when doing so. The government wants to work towards transparent and responsible use of these algorithms. Therefore, the government is making information about the algorithms used by the government available to everyone: citizens, their representatives, the media and (government) professionals. + +The aim is to make all information about algorithms centrally accessible for everyone. That allows everyone to see in which impactful processes these algorithms are used. The information on this website provides the ability to oversee algorithms. For example, discrimination or unlawfulness can be exposed, and whether the algorithm provides desirable outcomes can be checked. When someone does not agree with the use of algorithms, the Algorithm Register indicates how objections can be made. + See the Frequently Asked Questions on the Algorithm Register for more information. + ### Open source software Will you join us and add your thoughts? To contribute, create an account on GitHub (https://github.com/signup ) and read this readme and the code of conduct to get started. Once signed-up, you can provide feedback on the code of this website, on the algorithm 'standard', on the published description or on the user-friendliness of the website, etc. From d7ddd1bc64f589d40da3e9cdd58ddcddef717a33 Mon Sep 17 00:00:00 2001 From: datafluisteraar Date: Mon, 6 Feb 2023 13:37:47 +0100 Subject: [PATCH 2/6] amended description cf proposal PR #16 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2df24588..9701104f 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ The Algorithm Register (algoritmes.overheid.nl) is being developed with open sou ## Motivation The government increasingly works digitally and uses more and more algorithms when doing so. The government wants to work towards transparent and responsible use of these algorithms. Therefore, the government is making information about the algorithms used by the government available to everyone: citizens, their representatives, the media and (government) professionals. -The aim is to make all information about algorithms centrally accessible for everyone. That allows everyone to see in which impactful processes these algorithms are used. The information on this website provides the ability to oversee algorithms. For example, discrimination or unlawfulness can be exposed, and whether the algorithm provides desirable outcomes can be checked. When someone does not agree with the use of algorithms, the Algorithm Register indicates how objections can be made. +The aim is to make all information about algorithms required to demonstrate the algorithm doesn't unlawfully discriminate centrally accessible for everyone. That allows everyone to see in which impactful processes these algorithms are used. The information on this website provides the ability to oversee algorithms. For example, discrimination or unlawfulness can be exposed, and whether the algorithm provides desirable outcomes can be checked. When someone does not agree with the use of algorithms, the Algorithm Register indicates how objections can be made. See the Frequently Asked Questions on the Algorithm Register for more information. From 1d1edb70c1354ae90b860d78b4c7724b6041b040 Mon Sep 17 00:00:00 2001 From: "lars.musters@ictu.nl" Date: Tue, 9 May 2023 14:09:20 +0200 Subject: [PATCH 3/6] updated changes since last upload to github --- .gitignore | 15 +- .prettierrc.json | 5 + LICENSE.md | 2 +- README.md | 52 +- algoritmeregister.code-workspace | 20 +- backend/.coveragerc | 12 + backend/.env.dummy | 10 +- backend/.vscode/settings.json | 3 +- backend/Dockerfile | 58 +- backend/alembic/env.py | 8 +- ...59980_rename_schema_to_standard_version.py | 27 + .../0a0ff83803b0_add_action_history_table.py | 79 + .../0a1b6fc81205_remove_leverancier_id.py | 32 + .../versions/216e1a80d74b_initial_version.py | 28 - .../versions/4fa08b56de37_iama_column.py | 36 - .../6ce739d70f55_add_released_column.py | 27 + .../versions/845b0b6e654f_build_tables.py | 111 + .../8691fce44bf2_add_columns_for_0_3_1.py | 41 + .../8d57b6b9667f_create_algoritme_slug.py | 37 - ...ef924c_verwijder_algorimes_spoedverzoek.py | 27 - .../versions/995060402de4_algoritme_uuid.py | 51 - .../versions/9e7ff58ba2cd_upload_data.py | 29 - ...8_adjust_table_name_algemene_informatie.py | 23 - backend/app/api.py | 32 + backend/app/config/api.py | 95 + backend/app/config/resource.py | 103 +- backend/app/config/settings.py | 14 + backend/app/controllers/__init__.py | 2 + backend/app/controllers/action_history.py | 18 + .../controllers/algoritme_version/__init__.py | 23 + .../algoritme_version/endpoints.py | 267 + .../app/controllers/algoritme_version/util.py | 174 + .../app/data/text_loader/supporting_text.json | 50 + backend/app/database/database.py | 11 +- .../app/etl/config/excel_column_mapping.py | 4 +- backend/app/etl/config/main.py | 11 - .../data/Masterlijst_Algoritmeregister.xlsx | Bin 189122 -> 203829 bytes backend/app/etl/data/pub_data.json | 5735 +++++++++++++++++ backend/app/etl/load.py | 21 +- backend/app/etl/resources/loader.py | 148 +- backend/app/main.py | 58 +- backend/app/middleware/__init__.py | 3 + backend/app/middleware/decorators/__init__.py | 1 + backend/app/middleware/decorators/auth.py | 89 + .../app/middleware/keycloak_authenticator.py | 112 + backend/app/middleware/middleware.py | 1 - backend/app/models/__init__.py | 7 +- backend/app/models/action_history.py | 32 + backend/app/models/algoritme.py | 27 +- backend/app/models/algoritme_version.py | 76 + backend/app/models/inzet.py | 20 - backend/app/models/juridisch.py | 21 - backend/app/models/metadata.py | 21 - backend/app/models/toepassing.py | 20 - backend/app/models/toezicht.py | 18 - backend/app/queries/algoritme.sql | 41 - backend/app/routers/__init__.py | 1 + backend/app/routers/aggregations.py | 60 +- backend/app/routers/default.py | 217 +- backend/app/routers/text_loader.py | 42 + backend/app/routers/v0_1_0/__init__.py | 1 + backend/app/routers/v0_1_0/algoritme.py | 223 + backend/app/routers/v0_2_3/__init__.py | 1 + backend/app/routers/v0_2_3/algoritme.py | 223 + backend/app/routers/v0_3_1/__init__.py | 1 + backend/app/routers/v0_3_1/algoritme.py | 223 + backend/app/schemas/__init__.py | 5 +- backend/app/schemas/algoritme.py | 111 - backend/app/schemas/algoritme_version.py | 63 + backend/app/schemas/config/v0_1_0.json | 376 ++ backend/app/schemas/config/v0_2_3.json | 396 ++ backend/app/schemas/config/v0_3_1.json | 379 ++ backend/app/schemas/misc.py | 15 + backend/app/schemas/preditor.py | 6 + backend/app/schemas/util.py | 69 + backend/app/schemas/versions.py | 130 + backend/app/util/upc.py | 58 + backend/docker-compose.yml | 5 +- backend/poetry.lock | 3151 +++++---- backend/pyproject.toml | 11 +- backend/pytest.ini | 4 + backend/tests/conftest.py | 1 + backend/tests/samples/test_db.py | 18 + frontend-beheer/.browserslistrc | 4 + frontend-beheer/.editorconfig | 5 + frontend-beheer/.env | 2 + frontend-beheer/.env.dummy | 2 + frontend-beheer/.eslintrc.js | 38 + frontend-beheer/.gitignore | 23 + frontend-beheer/Dockerfile | 12 + frontend-beheer/README.md | 44 + frontend-beheer/index.html | 16 + frontend-beheer/nginx/nginx.conf | 32 + frontend-beheer/package-lock.json | 4369 +++++++++++++ frontend-beheer/package.json | 37 + .../public/.well-known/security.txt | 3 + frontend-beheer/public/favicon.ico | Bin 0 -> 15086 bytes .../public/icon-link-external-v2.svg | 16 + frontend-beheer/src/App.vue | 37 + frontend-beheer/src/app-config.ts | 6 + .../src/assets/fonts/RO-SerifWeb-Regular.woff | Bin 0 -> 67204 bytes .../src/assets/fonts/ROsanswebtextbold.woff | Bin 0 -> 69467 bytes .../src/assets/fonts/ROsanswebtextitalic.woff | Bin 0 -> 84044 bytes .../assets/fonts/ROsanswebtextregular.woff | Bin 0 -> 76489 bytes .../src/assets/fonts/ro-icons-2.1.woff2 | Bin 0 -> 4412 bytes .../assets/images/icons/icon-24-lock-blue.svg | 3 + .../assets/images/icons/icon-64-family.svg | 11 + .../assets/images/icons/icon-64-finance.svg | 11 + .../src/assets/images/icons/icon-64-kids.svg | 11 + .../assets/images/icons/icon-64-living.svg | 11 + .../assets/images/icons/icon-64-people.svg | 11 + .../assets/images/icons/icon-alert-blue.svg | 11 + .../assets/images/icons/icon-alert-red.svg | 11 + .../src/assets/images/icons/icon-area.svg | 1 + .../assets/images/icons/icon-arrow-down.svg | 3 + .../assets/images/icons/icon-arrow-right.svg | 1 + .../images/icons/icon-arrow-up-blue.svg | 3 + .../src/assets/images/icons/icon-arrow-up.svg | 3 + .../src/assets/images/icons/icon-basis.svg | 1 + .../images/icons/icon-bewerken-blue.svg | 4 + .../src/assets/images/icons/icon-bewerken.svg | 1 + .../images/icons/icon-calendar-blue.svg | 1 + .../images/icons/icon-calendar-white.svg | 1 + .../src/assets/images/icons/icon-calendar.svg | 1 + .../images/icons/icon-characteristic.svg | 1 + .../images/icons/icon-check-filled-green.svg | 11 + .../src/assets/images/icons/icon-check.svg | 1 + .../assets/images/icons/icon-check2-blue.svg | 11 + .../assets/images/icons/icon-check2-green.svg | 11 + .../assets/images/icons/icon-check2-white.svg | 11 + .../images/icons/icon-checkbox-white.svg | 3 + .../images/icons/icon-chevron-left-blue.svg | 1 + .../assets/images/icons/icon-chevron-left.svg | 1 + .../images/icons/icon-chevron-right.svg | 1 + .../icons/icon-chevronround-right-white.svg | 9 + .../assets/images/icons/icon-close-hover.svg | 1 + .../assets/images/icons/icon-close-white.svg | 1 + .../src/assets/images/icons/icon-close.svg | 1 + .../src/assets/images/icons/icon-compare.svg | 1 + .../src/assets/images/icons/icon-copy.svg | 1 + .../assets/images/icons/icon-cross-blue.svg | 23 + .../assets/images/icons/icon-cross-filled.svg | 14 + .../assets/images/icons/icon-cross-white.svg | 20 + .../assets/images/icons/icon-crosshair.svg | 24 + .../src/assets/images/icons/icon-cta-left.svg | 1 + .../images/icons/icon-cta-right-white.svg | 1 + .../assets/images/icons/icon-cta-right.svg | 1 + .../assets/images/icons/icon-dart-down.svg | 1 + .../assets/images/icons/icon-dart-left.svg | 1 + .../images/icons/icon-dart-right-blue.svg | 1 + .../assets/images/icons/icon-dart-right.svg | 1 + .../images/icons/icon-dart-top-white.svg | 1 + .../src/assets/images/icons/icon-dart-top.svg | 1 + .../assets/images/icons/icon-document-new.svg | 10 + .../src/assets/images/icons/icon-document.svg | 11 + .../src/assets/images/icons/icon-dots.svg | 21 + .../assets/images/icons/icon-double-left.svg | 1 + .../assets/images/icons/icon-double-right.svg | 1 + .../images/icons/icon-download-white.svg | 1 + .../src/assets/images/icons/icon-download.svg | 1 + .../src/assets/images/icons/icon-draw.svg | 20 + .../assets/images/icons/icon-explanation.svg | 1 + .../src/assets/images/icons/icon-facebook.svg | 7 + .../assets/images/icons/icon-feed-blue.svg | 9 + .../icons/icon-filter-rotated-white.svg | 11 + .../src/assets/images/icons/icon-filter.svg | 17 + .../images/icons/icon-hamburger-white.svg | 1 + .../assets/images/icons/icon-hamburger.svg | 1 + .../src/assets/images/icons/icon-home.svg | 11 + .../assets/images/icons/icon-info-blue.svg | 12 + .../src/assets/images/icons/icon-info.svg | 1 + .../assets/images/icons/icon-instagram.svg | 9 + .../images/icons/icon-link-external-v2.svg | 16 + .../icon-link-external-white-standard.svg | 1 + .../images/icons/icon-link-external.svg | 1 + .../src/assets/images/icons/icon-linkedin.svg | 9 + .../src/assets/images/icons/icon-list.svg | 11 + .../src/assets/images/icons/icon-loader.svg | 23 + .../src/assets/images/icons/icon-logout.svg | 10 + .../src/assets/images/icons/icon-mail.svg | 21 + .../src/assets/images/icons/icon-map-blue.svg | 11 + .../src/assets/images/icons/icon-map.svg | 19 + .../assets/images/icons/icon-marker-blue.svg | 24 + .../src/assets/images/icons/icon-marker.svg | 24 + .../images/icons/icon-min-filled-blue.svg | 9 + .../assets/images/icons/icon-minus-shape.svg | 27 + .../src/assets/images/icons/icon-minus.svg | 1 + .../src/assets/images/icons/icon-news.svg | 9 + .../src/assets/images/icons/icon-next.svg | 1 + .../src/assets/images/icons/icon-ok-green.svg | 1 + .../src/assets/images/icons/icon-ok.svg | 1 + .../assets/images/icons/icon-permalink.svg | 1 + .../src/assets/images/icons/icon-play.svg | 11 + .../images/icons/icon-plus-filled-blue.svg | 9 + .../assets/images/icons/icon-plus-shape.svg | 27 + .../assets/images/icons/icon-plus-white.svg | 24 + .../src/assets/images/icons/icon-plus.svg | 1 + .../src/assets/images/icons/icon-print.svg | 1 + .../src/assets/images/icons/icon-profile.svg | 11 + .../assets/images/icons/icon-publicatie.svg | 11 + .../icons/icon-refresh-document-white.svg | 1 + .../images/icons/icon-refresh-document.svg | 1 + .../src/assets/images/icons/icon-refresh.svg | 11 + .../assets/images/icons/icon-relations.svg | 1 + .../assets/images/icons/icon-remove-blue.svg | 1 + .../assets/images/icons/icon-remove-white.svg | 31 + .../src/assets/images/icons/icon-remove.svg | 1 + .../assets/images/icons/icon-search-blue.svg | 1 + .../src/assets/images/icons/icon-search.svg | 1 + .../assets/images/icons/icon-share-blue.svg | 12 + .../src/assets/images/icons/icon-share.svg | 1 + .../src/assets/images/icons/icon-tel.svg | 7 + .../assets/images/icons/icon-thumb-down.svg | 11 + .../src/assets/images/icons/icon-thumb-up.svg | 11 + .../src/assets/images/icons/icon-twitter.svg | 7 + .../src/assets/images/icons/icon-upload.svg | 1 + .../src/assets/images/icons/icon-warning.svg | 1 + .../src/assets/images/icons/icon-whatsapp.svg | 9 + .../images/logo-ro-zonder-caption-mobile.svg | 11 + .../assets/images/logo-ro-zonder-caption.svg | 11 + frontend-beheer/src/assets/images/logo.svg | 2 + .../src/assets/styles/_colors.scss | 16 + frontend-beheer/src/assets/styles/_fonts.scss | 18 + .../src/assets/styles/_variables.scss | 1 + frontend-beheer/src/assets/styles/main.scss | 117 + .../src/components/ExternalLink.vue | 14 + frontend-beheer/src/components/FormField.vue | 203 + frontend-beheer/src/components/FormHeader.vue | 13 + .../src/components/FormSideBlock.vue | 295 + .../src/components/MetadataManual.vue | 16 + .../src/components/WarningDialog.vue | 76 + .../src/components/layout/AppFooter.vue | 35 + .../src/components/layout/AppHeader.vue | 118 + .../src/components/layout/Breadcrumb.vue | 46 + frontend-beheer/src/config/footer.ts | 31 + frontend-beheer/src/content.json | 76 + frontend-beheer/src/main.ts | 89 + frontend-beheer/src/plugins/index.ts | 22 + frontend-beheer/src/plugins/vuetify.ts | 38 + frontend-beheer/src/plugins/webfontloader.ts | 15 + frontend-beheer/src/router/index.ts | 28 + frontend-beheer/src/services/index.ts | 160 + frontend-beheer/src/store/auth.ts | 58 + frontend-beheer/src/store/form-data.ts | 193 + frontend-beheer/src/store/index.ts | 4 + frontend-beheer/src/store/overview.ts | 66 + frontend-beheer/src/store/schema.ts | 128 + frontend-beheer/src/types/algorithm.ts | 55 + frontend-beheer/src/types/footer.ts | 5 + frontend-beheer/src/types/form.ts | 53 + frontend-beheer/src/types/index.ts | 16 + frontend-beheer/src/util/form.ts | 37 + frontend-beheer/src/util/index.ts | 9 + frontend-beheer/src/views/FormGenerator.vue | 139 + frontend-beheer/src/views/Overview.vue | 155 + frontend-beheer/src/vite-env.d.ts | 7 + frontend-beheer/tsconfig.json | 28 + frontend-beheer/tsconfig.node.json | 9 + frontend-beheer/vite.config.ts | 53 + frontend/.env.dummy | 3 +- frontend/.eslintrc | 3 +- frontend/app.vue | 27 +- frontend/assets/styles/_colors.scss | 1 + frontend/assets/styles/_skiplinks.scss | 8 +- frontend/assets/styles/main.scss | 62 +- frontend/components/ExternalLink.vue | 16 + frontend/components/HighlightedAlgorithms.vue | 33 +- frontend/components/HomePageText.vue | 13 +- frontend/components/LanguagePicker.vue | 65 +- frontend/components/MailLink.vue | 16 + frontend/components/NuxtIcon.vue | 2 +- frontend/components/ParseUrl.vue | 42 +- frontend/components/SearchBar.vue | 30 +- frontend/components/SearchResultCard.vue | 99 +- frontend/components/TablePagination.vue | 121 +- .../components/algoritme/AccordionRow.vue | 104 +- .../components/algoritme/AccordionRows.vue | 28 +- .../components/algoritme/AlgoritmeFilters.vue | 106 +- frontend/components/algoritme/AppTable.vue | 13 +- frontend/components/algoritme/AppTabs.vue | 67 +- frontend/components/algoritme/TabsTable.vue | 39 +- .../components/dashboard/CountPerType.vue | 33 +- .../components/dashboard/DataCompleteness.vue | 3 +- frontend/components/form/OverheidButton.vue | 85 +- frontend/components/views/AppBreadcrumb.vue | 8 +- frontend/components/views/AppFooter.vue | 27 +- frontend/components/views/AppHeader.vue | 39 +- frontend/composables/algoritme.ts | 2 +- frontend/composables/mobile.ts | 5 +- frontend/composables/useLocale.ts | 13 + frontend/composables/useTextLoader.ts | 53 + frontend/config/config.ts | 72 +- frontend/config/fields.json | 2 +- frontend/config/footer.ts | 6 +- frontend/error.vue | 43 +- frontend/layouts/default.vue | 37 +- frontend/locales/en.json | 68 +- frontend/locales/nl.json | 64 +- frontend/nuxt.config.ts | 42 +- frontend/package-lock.json | 3765 +++++++---- frontend/package.json | 6 +- frontend/pages/algoritme/[lars].vue | 131 + frontend/pages/algoritme/[slug].vue | 120 - frontend/pages/algoritme/index.vue | 161 +- frontend/pages/dashboard.vue | 6 +- frontend/pages/footer/contact.vue | 61 +- frontend/pages/footer/cookies.vue | 68 - frontend/pages/footer/kwetsbaarheid.vue | 59 - frontend/pages/footer/over.vue | 202 +- frontend/pages/footer/privacyverklaring.vue | 83 +- frontend/pages/footer/toegankelijkheid.vue | 63 +- frontend/pages/footer/vragen.vue | 206 +- frontend/pages/index.vue | 26 +- frontend/plugins/i18n.ts | 18 - frontend/public/icon-link-external-v2.svg | 16 + frontend/public/layouts/v0_1_0.json | 69 + frontend/public/layouts/v0_2_3.json | 69 + frontend/public/layouts/v0_3_1.json | 70 + frontend/public/standards/v0_1_0.json | 345 + frontend/public/standards/v0_2_3.json | 365 ++ frontend/public/standards/v0_3_1.json | 352 + frontend/services/algoritme.ts | 17 +- frontend/services/textLoader.ts | 9 + frontend/types/algoritme.ts | 21 +- frontend/types/apiStandard.ts | 14 + frontend/types/layout.ts | 4 + frontend/types/textLoader.ts | 9 + frontend/utils/index.ts | 31 + .../Performance test.ipynb | 29 +- schema.json | 526 +- 330 files changed, 25276 insertions(+), 4861 deletions(-) create mode 100644 .prettierrc.json create mode 100644 backend/.coveragerc create mode 100644 backend/alembic/versions/04b904159980_rename_schema_to_standard_version.py create mode 100644 backend/alembic/versions/0a0ff83803b0_add_action_history_table.py create mode 100644 backend/alembic/versions/0a1b6fc81205_remove_leverancier_id.py delete mode 100644 backend/alembic/versions/216e1a80d74b_initial_version.py delete mode 100644 backend/alembic/versions/4fa08b56de37_iama_column.py create mode 100644 backend/alembic/versions/6ce739d70f55_add_released_column.py create mode 100644 backend/alembic/versions/845b0b6e654f_build_tables.py create mode 100644 backend/alembic/versions/8691fce44bf2_add_columns_for_0_3_1.py delete mode 100644 backend/alembic/versions/8d57b6b9667f_create_algoritme_slug.py delete mode 100644 backend/alembic/versions/926a9cef924c_verwijder_algorimes_spoedverzoek.py delete mode 100644 backend/alembic/versions/995060402de4_algoritme_uuid.py delete mode 100644 backend/alembic/versions/9e7ff58ba2cd_upload_data.py delete mode 100644 backend/alembic/versions/f35c8031d388_adjust_table_name_algemene_informatie.py create mode 100644 backend/app/api.py create mode 100644 backend/app/config/api.py create mode 100644 backend/app/config/settings.py create mode 100644 backend/app/controllers/__init__.py create mode 100644 backend/app/controllers/action_history.py create mode 100644 backend/app/controllers/algoritme_version/__init__.py create mode 100644 backend/app/controllers/algoritme_version/endpoints.py create mode 100644 backend/app/controllers/algoritme_version/util.py create mode 100644 backend/app/data/text_loader/supporting_text.json create mode 100644 backend/app/etl/data/pub_data.json create mode 100644 backend/app/middleware/__init__.py create mode 100644 backend/app/middleware/decorators/__init__.py create mode 100644 backend/app/middleware/decorators/auth.py create mode 100644 backend/app/middleware/keycloak_authenticator.py create mode 100644 backend/app/models/action_history.py create mode 100644 backend/app/models/algoritme_version.py delete mode 100644 backend/app/models/inzet.py delete mode 100644 backend/app/models/juridisch.py delete mode 100644 backend/app/models/metadata.py delete mode 100644 backend/app/models/toepassing.py delete mode 100644 backend/app/models/toezicht.py delete mode 100644 backend/app/queries/algoritme.sql create mode 100644 backend/app/routers/text_loader.py create mode 100644 backend/app/routers/v0_1_0/__init__.py create mode 100644 backend/app/routers/v0_1_0/algoritme.py create mode 100644 backend/app/routers/v0_2_3/__init__.py create mode 100644 backend/app/routers/v0_2_3/algoritme.py create mode 100644 backend/app/routers/v0_3_1/__init__.py create mode 100644 backend/app/routers/v0_3_1/algoritme.py delete mode 100644 backend/app/schemas/algoritme.py create mode 100644 backend/app/schemas/algoritme_version.py create mode 100644 backend/app/schemas/config/v0_1_0.json create mode 100644 backend/app/schemas/config/v0_2_3.json create mode 100644 backend/app/schemas/config/v0_3_1.json create mode 100644 backend/app/schemas/misc.py create mode 100644 backend/app/schemas/preditor.py create mode 100644 backend/app/schemas/util.py create mode 100644 backend/app/schemas/versions.py create mode 100644 backend/app/util/upc.py create mode 100644 backend/pytest.ini create mode 100644 backend/tests/conftest.py create mode 100644 backend/tests/samples/test_db.py create mode 100644 frontend-beheer/.browserslistrc create mode 100644 frontend-beheer/.editorconfig create mode 100644 frontend-beheer/.env create mode 100644 frontend-beheer/.env.dummy create mode 100644 frontend-beheer/.eslintrc.js create mode 100644 frontend-beheer/.gitignore create mode 100644 frontend-beheer/Dockerfile create mode 100644 frontend-beheer/README.md create mode 100644 frontend-beheer/index.html create mode 100644 frontend-beheer/nginx/nginx.conf create mode 100644 frontend-beheer/package-lock.json create mode 100644 frontend-beheer/package.json create mode 100644 frontend-beheer/public/.well-known/security.txt create mode 100644 frontend-beheer/public/favicon.ico create mode 100644 frontend-beheer/public/icon-link-external-v2.svg create mode 100644 frontend-beheer/src/App.vue create mode 100644 frontend-beheer/src/app-config.ts create mode 100644 frontend-beheer/src/assets/fonts/RO-SerifWeb-Regular.woff create mode 100644 frontend-beheer/src/assets/fonts/ROsanswebtextbold.woff create mode 100644 frontend-beheer/src/assets/fonts/ROsanswebtextitalic.woff create mode 100644 frontend-beheer/src/assets/fonts/ROsanswebtextregular.woff create mode 100644 frontend-beheer/src/assets/fonts/ro-icons-2.1.woff2 create mode 100644 frontend-beheer/src/assets/images/icons/icon-24-lock-blue.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-64-family.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-64-finance.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-64-kids.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-64-living.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-64-people.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-alert-blue.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-alert-red.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-area.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-arrow-down.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-arrow-right.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-arrow-up-blue.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-arrow-up.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-basis.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-bewerken-blue.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-bewerken.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-calendar-blue.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-calendar-white.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-calendar.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-characteristic.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-check-filled-green.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-check.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-check2-blue.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-check2-green.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-check2-white.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-checkbox-white.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-chevron-left-blue.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-chevron-left.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-chevron-right.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-chevronround-right-white.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-close-hover.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-close-white.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-close.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-compare.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-copy.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-cross-blue.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-cross-filled.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-cross-white.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-crosshair.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-cta-left.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-cta-right-white.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-cta-right.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-dart-down.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-dart-left.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-dart-right-blue.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-dart-right.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-dart-top-white.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-dart-top.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-document-new.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-document.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-dots.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-double-left.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-double-right.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-download-white.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-download.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-draw.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-explanation.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-facebook.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-feed-blue.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-filter-rotated-white.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-filter.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-hamburger-white.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-hamburger.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-home.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-info-blue.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-info.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-instagram.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-link-external-v2.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-link-external-white-standard.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-link-external.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-linkedin.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-list.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-loader.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-logout.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-mail.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-map-blue.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-map.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-marker-blue.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-marker.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-min-filled-blue.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-minus-shape.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-minus.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-news.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-next.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-ok-green.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-ok.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-permalink.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-play.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-plus-filled-blue.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-plus-shape.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-plus-white.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-plus.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-print.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-profile.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-publicatie.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-refresh-document-white.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-refresh-document.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-refresh.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-relations.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-remove-blue.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-remove-white.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-remove.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-search-blue.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-search.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-share-blue.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-share.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-tel.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-thumb-down.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-thumb-up.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-twitter.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-upload.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-warning.svg create mode 100644 frontend-beheer/src/assets/images/icons/icon-whatsapp.svg create mode 100644 frontend-beheer/src/assets/images/logo-ro-zonder-caption-mobile.svg create mode 100644 frontend-beheer/src/assets/images/logo-ro-zonder-caption.svg create mode 100644 frontend-beheer/src/assets/images/logo.svg create mode 100644 frontend-beheer/src/assets/styles/_colors.scss create mode 100644 frontend-beheer/src/assets/styles/_fonts.scss create mode 100644 frontend-beheer/src/assets/styles/_variables.scss create mode 100644 frontend-beheer/src/assets/styles/main.scss create mode 100644 frontend-beheer/src/components/ExternalLink.vue create mode 100644 frontend-beheer/src/components/FormField.vue create mode 100644 frontend-beheer/src/components/FormHeader.vue create mode 100644 frontend-beheer/src/components/FormSideBlock.vue create mode 100644 frontend-beheer/src/components/MetadataManual.vue create mode 100644 frontend-beheer/src/components/WarningDialog.vue create mode 100644 frontend-beheer/src/components/layout/AppFooter.vue create mode 100644 frontend-beheer/src/components/layout/AppHeader.vue create mode 100644 frontend-beheer/src/components/layout/Breadcrumb.vue create mode 100644 frontend-beheer/src/config/footer.ts create mode 100644 frontend-beheer/src/content.json create mode 100644 frontend-beheer/src/main.ts create mode 100644 frontend-beheer/src/plugins/index.ts create mode 100644 frontend-beheer/src/plugins/vuetify.ts create mode 100644 frontend-beheer/src/plugins/webfontloader.ts create mode 100644 frontend-beheer/src/router/index.ts create mode 100644 frontend-beheer/src/services/index.ts create mode 100644 frontend-beheer/src/store/auth.ts create mode 100644 frontend-beheer/src/store/form-data.ts create mode 100644 frontend-beheer/src/store/index.ts create mode 100644 frontend-beheer/src/store/overview.ts create mode 100644 frontend-beheer/src/store/schema.ts create mode 100644 frontend-beheer/src/types/algorithm.ts create mode 100644 frontend-beheer/src/types/footer.ts create mode 100644 frontend-beheer/src/types/form.ts create mode 100644 frontend-beheer/src/types/index.ts create mode 100644 frontend-beheer/src/util/form.ts create mode 100644 frontend-beheer/src/util/index.ts create mode 100644 frontend-beheer/src/views/FormGenerator.vue create mode 100644 frontend-beheer/src/views/Overview.vue create mode 100644 frontend-beheer/src/vite-env.d.ts create mode 100644 frontend-beheer/tsconfig.json create mode 100644 frontend-beheer/tsconfig.node.json create mode 100644 frontend-beheer/vite.config.ts create mode 100644 frontend/components/ExternalLink.vue create mode 100644 frontend/components/MailLink.vue create mode 100644 frontend/composables/useLocale.ts create mode 100644 frontend/composables/useTextLoader.ts create mode 100644 frontend/pages/algoritme/[lars].vue delete mode 100644 frontend/pages/algoritme/[slug].vue delete mode 100644 frontend/pages/footer/cookies.vue delete mode 100644 frontend/pages/footer/kwetsbaarheid.vue delete mode 100644 frontend/plugins/i18n.ts create mode 100644 frontend/public/icon-link-external-v2.svg create mode 100644 frontend/public/layouts/v0_1_0.json create mode 100644 frontend/public/layouts/v0_2_3.json create mode 100644 frontend/public/layouts/v0_3_1.json create mode 100644 frontend/public/standards/v0_1_0.json create mode 100644 frontend/public/standards/v0_2_3.json create mode 100644 frontend/public/standards/v0_3_1.json create mode 100644 frontend/services/textLoader.ts create mode 100644 frontend/types/apiStandard.ts create mode 100644 frontend/types/layout.ts create mode 100644 frontend/types/textLoader.ts create mode 100644 frontend/utils/index.ts rename backend/app/notebooks/request.ipynb => notebooks/Performance test.ipynb (56%) diff --git a/.gitignore b/.gitignore index df48e88d..f7d2b1d2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,18 +1,15 @@ -backend/.venv +backend/*venv __pycache__/ -.env +.idea +backend/.env +frontend/.env *.pyc - +.vscode node_modules *.log* .nuxt .nitro .cache .output -.env dist - -# deployment dir -deployment -gitlab-templates -.gitlab-ci.yml \ No newline at end of file +.coverage \ No newline at end of file diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 00000000..17b1d52e --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,5 @@ +{ + "semi": false, + "singleQuote": true, + "trailingComma": "es5" +} \ No newline at end of file diff --git a/LICENSE.md b/LICENSE.md index ed38ebab..72261d7c 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -285,4 +285,4 @@ the rights granted in Article 2 of this Licence and protect the covered Source Code from exclusive appropriation. All other changes or additions to this Appendix require the production of a new -EUPL version. +EUPL version. \ No newline at end of file diff --git a/README.md b/README.md index 9701104f..b6015bda 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,18 @@ -# About the Algorithm Register -The Ministry of the Interior and Kingdom Relations is developing the Algorithm Register. The team does this using an open development style, through open source software. Anyone can view the team’s progress on the GitHub of the Ministry of the Interior and Kingdom Relations. The Algorithm Register is under development. The content changes over time. New algorithms are added and algorithms are updated. -The Algorithm Register (algoritmes.overheid.nl) is being developed with open source software. The source code can be viewed here on GitHub. It can be downloaded and reused. Github is a platform with transparent version control, where technology in development can be easily shared. -## Motivation -The government increasingly works digitally and uses more and more algorithms when doing so. The government wants to work towards transparent and responsible use of these algorithms. Therefore, the government is making information about the algorithms used by the government available to everyone: citizens, their representatives, the media and (government) professionals. +# About the Algorithm Register -The aim is to make all information about algorithms required to demonstrate the algorithm doesn't unlawfully discriminate centrally accessible for everyone. That allows everyone to see in which impactful processes these algorithms are used. The information on this website provides the ability to oversee algorithms. For example, discrimination or unlawfulness can be exposed, and whether the algorithm provides desirable outcomes can be checked. When someone does not agree with the use of algorithms, the Algorithm Register indicates how objections can be made. +The Ministry of the Interior and Kingdom Relations is developing the Algorithm Register. The team does this using an open development style, through open source software. Anyone can view the team’s progress on the GitHub of the Ministry of the Interior and Kingdom Relations. The Algorithm Register is under development. The content changes over time. New algorithms are added and algorithms are updated. +The Algorithm Register (algoritmes.overheid.nl) is being developed with open source software. The source code can be viewed here on GitHub. It can be downloaded and reused. Github is a platform with transparent version control, where technology in development can be easily shared. -See the Frequently Asked Questions on the Algorithm Register for more information. +## Motivation -### Open source software -Will you join us and add your thoughts? To contribute, create an account on GitHub (https://github.com/signup ) and read this readme and the code of conduct to get started. -Once signed-up, you can provide feedback on the code of this website, on the algorithm 'standard', on the published description or on the user-friendliness of the website, etc. -Get started: join us and add your thoughts! +The government increasingly works digitally and uses more and more algorithms when doing so. The government wants to work towards transparent and responsible use of these algorithms. Therefore, the government is making information about the algorithms used by the government available to everyone: citizens, their representatives, the media and (government) professionals. +See the Frequently Asked Questions on the Algorithm Register for more information. +### Open source software + +Will you join us and add your thoughts? To contribute, create an account on GitHub (https://github.com/signup ) and read this readme and the code of conduct to get started. +Once signed-up, you can provide feedback on the code of this website, on the algorithm 'standard', on the published description or on the user-friendliness of the website, etc. +Get started: join us and add your thoughts! # Technical information @@ -29,11 +29,11 @@ The documentation below is tested on Ubuntu, but it should work on Windows as we ### Environment variables -Environment variables are stored in `.env`, but because they can contain secrets (passwords), it is not in the repository. Therefore, copy and paste `.env.dummy` to `.env`. For local development, no changes are needed. +Environment variables are stored in `.env` in the frontend and backend, but because they can contain secrets (passwords), it is not in the repository. Therefore, copy and paste `.env.dummy` to `.env`. ### Database -1. Start database. Run from root folder: `docker compose up -d`. +1. Start database. Run from `/backend` folder: `docker compose up -d`. Validate the backend is running by navigating to the GUI (DBgate) on `http://localhost:8093`. There you should be able to open the database `algreg_db`. @@ -43,26 +43,24 @@ All commnands below should be run from the `/backend` directory. 2. Specify Python version to use for virtual environment: `poetry env use `. (The required Python version is specified in `backend/.python-version`.) 3. Install packages: `poetry install`. -4. Run database migrations: `poetry run uvicorn upgrade head`. +4. Run database migrations: `poetry run alembic upgrade head`. 5. Start backend: `poetry run uvicorn app.main:app --reload` -Validate the backend is running by navigating to the documentation on `http://localhost:8000/api-docs`. +Validate the backend is running by navigating to the documentation on `http://localhost:8000/api/api-docs`. ### Frontend 1. Install dependencies. Run from '`/frontend`: `npm install`. -2. Start local server. Run from '`/frontend`: `npm run dev -- -o`. +2. Start local server. Run from '`/frontend`: `npm run dev -- --port 3000`. Validate the frontend is running by navigating to `http://localhost:3000`. -## Run locally +There is also a second frontend: 'frontend-beheer' (management frontend). This frontend is used to manage the algorithms. To run it, follow these steps: -1. Start database from backend. Run from `/backend`: `docker compose up -d` -2. Ensure latest migration has been completed. Run from `/backend`: `poetry run alembic upgrade head` -3. Navigate to `/frontend` and run `npm run dev`. -4. Navigate to `/backend` and run `poetry run uvicorn app.main:app --reload` +1. Install dependencies. Run from '`/frontend-beheer`: `npm install`. +2. Start local server. Run from '`/frontend-beheer`: `npm run dev -- --port 3001`. -## Other +Validate that frontend-beheer is running by navigating to `http://localhost:3001`. ### Linting @@ -77,6 +75,16 @@ This project uses Volar. Install Volar in Visual Studio Code and enable [take ov Note: Vue linting config inspired by a repository on [Github](https://github.com/weicheng2138/nuxt3-eslint-starter). +### Versioning + +This register allows use of multiple versions of the metadatastandard. To add a new version (`v0_x_x`), follow these steps: + +1. in `/backend/app/schemas/config`, you see the metadatastandard in JSON format. Create a new file with your file version name, e.g. `v0_x_x.json`. Change the standard as you see fit. +2. in `/backend/app/routers`, duplicate one of the version folders. Rename it the same as your version in step 1, e.g. `v0_x_x`. Do not change the content. +3. add the name of this file in the \_\_init\_\_.py file in the same folder, e.g. `from . import v0_1_0, v0_x_x # noqa`. +4. If your new schema involves changes to the database (notably for new columns) you'll have to do a SQLAlchemy model change (in `/backend/app/models/algoritme_version.py`) as well as a database migration. +5. The frontend needs a configuration file in `/frontend/public/layouts` named similar to the other files, e.g. `v0_x_x.json`. The configuration file defines how the data should be displayed in the tabs. + ### Icons Icons library can be found at `https://icones.js.org/`. diff --git a/algoritmeregister.code-workspace b/algoritmeregister.code-workspace index 79026c55..39e87b9c 100644 --- a/algoritmeregister.code-workspace +++ b/algoritmeregister.code-workspace @@ -8,14 +8,24 @@ }, { "path": "backend" + }, + { + "path": "frontend-beheer" } ], "settings": { "python.linting.flake8Enabled": true, "python.linting.enabled": true, - "prettier.enable": true, - "editor.formatOnSave": true, + "editor.defaultFormatter": "rvest.vs-code-prettier-eslint", + "editor.formatOnPaste": false, // required + "editor.formatOnType": false, // required + "editor.formatOnSave": true, // optional + "editor.formatOnSaveMode": "file", // required to format on save + "files.autoSave": "onFocusChange", // optional but recommended + "vs-code-prettier-eslint.prettierLast": false, // set as "true" to run 'prettier' last not first + "search.exclude": { + "*.yaml": true, "*.mjs": true, "*.sql": true, "**/.nuxt": true, @@ -23,6 +33,12 @@ "**/dist/_nuxt": true, "**/dist/": true, "**/alembic/scripts": true + }, + "[yaml]": { + "editor.defaultFormatter": "redhat.vscode-yaml" + }, + "[typescript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" } } } diff --git a/backend/.coveragerc b/backend/.coveragerc new file mode 100644 index 00000000..c98578e0 --- /dev/null +++ b/backend/.coveragerc @@ -0,0 +1,12 @@ +[run] +branch=True +source = app +omit = + */__init__.py +[report] +include_namespace_packages = True +exclude_lines = + import + from + logger + logging diff --git a/backend/.env.dummy b/backend/.env.dummy index 28911df3..3184fdf9 100644 --- a/backend/.env.dummy +++ b/backend/.env.dummy @@ -1,6 +1,8 @@ POSTGRES_SERVER=127.0.0.1 POSTGRES_PORT=5432 -POSTGRES_USER=postgres -POSTGRES_PASSWORD=postgres -POSTGRES_DB=algreg_db -DEV_DOCKER_CONTAINER_NAME_PREFIX=Algoritme_register \ No newline at end of file +POSTGRES_USER= +POSTGRES_PASSWORD= +POSTGRES_DB= +DEV_DOCKER_CONTAINER_NAME_PREFIX=Algoritme_register + +TYPE=DEV diff --git a/backend/.vscode/settings.json b/backend/.vscode/settings.json index de288e1e..ba8c3b28 100644 --- a/backend/.vscode/settings.json +++ b/backend/.vscode/settings.json @@ -1,3 +1,4 @@ { - "python.formatting.provider": "black" + "python.formatting.provider": "black", + "python.analysis.typeCheckingMode": "basic", } \ No newline at end of file diff --git a/backend/Dockerfile b/backend/Dockerfile index a233eff1..26859403 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -1,5 +1,5 @@ # FROM harbor.cicd.s15m.nl/ictu-devops-pub/rid_base:3.11_alpine_3.16 -FROM harbor.cicd.s15m.nl/ictu-devops-pub/rid_base:3.11-slim2-0.1 +FROM harbor.cicd.s15m.nl/ictu-devops-pub/rid_base:3.11-slim2-0.1 as buildstep ENV YOUR_ENV=${YOUR_ENV} \ PYTHONFAULTHANDLER=1 \ @@ -13,30 +13,46 @@ ENV YOUR_ENV=${YOUR_ENV} \ RUN apt-get update && \ apt-get -y install sudo -ADD ./backend/app /backend/app -ADD ./backend/alembic /backend/alembic -ADD ./backend/common /backend/common -COPY ./backend/alembic.ini /backend/alembic.ini -COPY ./backend/poetry.lock /backend/poetry.lock -COPY ./backend/pyproject.toml /backend/pyproject.toml -COPY ./backend/start.sh /backend/start.sh +# #TODO +# RUN apt-get -y purge libpython3.9* python3.9* +# RUN apt-get install --upgrade libtasn1-6 linux-libc-dev +# #TODO -WORKDIR /backend +ADD /backend/app /backend/app +ADD /backend/alembic /backend/alembic +ADD /backend/common /backend/common +COPY /backend/alembic.ini /backend/alembic.ini +COPY /backend/poetry.lock /backend/poetry.lock +COPY /backend/pyproject.toml /backend/pyproject.toml +COPY /backend/start.sh /backend/start.sh -RUN sudo apt-get -y install gcc g++ && \ - pip install "poetry==$POETRY_VERSION" && \ - poetry config virtualenvs.create false && \ - poetry install --without dev --no-interaction --no-ansi && \ - apt-get remove --purge -y gcc g++ && \ - pip uninstall -y "poetry==$POETRY_VERSION" && \ - sudo apt-get clean +WORKDIR /backend -# Expose ports -EXPOSE 8000:8000 +# RUN sudo apt-get -y install gcc g++ && \ +# pip install "poetry==$POETRY_VERSION" && \ +# poetry config virtualenvs.create false && \ +# poetry install --without dev --no-interaction --no-ansi && \ +# apt-get remove --purge -y gcc g++ && \ +# pip uninstall -y "poetry==$POETRY_VERSION" && \ +# sudo apt-get clean + +RUN sudo apt-get -y install gcc g++ +RUN pip install "poetry==$POETRY_VERSION" +RUN poetry config virtualenvs.create false +RUN poetry install --without dev --no-interaction --no-ansi +RUN apt-get remove --purge -y gcc g++ +RUN pip uninstall -y "poetry==$POETRY_VERSION" +RUN sudo apt-get clean + +FROM harbor.cicd.s15m.nl/ictu-devops-pub/python:3.11.1-lunar-devops_base_0.2 +WORKDIR /backend -ENV PYTHONPATH="$PYTHONPATH:/:/backend" +COPY --from=buildstep /backend /backend +COPY --from=buildstep /usr/local/lib /usr/local/lib +RUN ln -f -s /usr/bin/python3.11 /usr/bin/python3 +ENV PYTHONPATH="${PYTHONPATH}:/usr/local/lib/python3.11/site-packages" -# Run the application RUN sudo chmod 777 /backend/start.sh -CMD ["./start.sh"] \ No newline at end of file +EXPOSE 8000:8000 +CMD ["./start.sh"] diff --git a/backend/alembic/env.py b/backend/alembic/env.py index 267abaa5..4c45b26e 100644 --- a/backend/alembic/env.py +++ b/backend/alembic/env.py @@ -5,6 +5,8 @@ from alembic import context from common.database_url import get_database_url +from app.database.database import Base +from app.models import * # this is the Alembic Config object, which provides # access to the values within the .ini file in use. @@ -19,7 +21,7 @@ # for 'autogenerate' support # from myapp import mymodel # target_metadata = mymodel.Base.metadata -target_metadata = None +target_metadata = Base.metadata # other values from the config, defined by the needs of env.py, # can be acquired: @@ -67,9 +69,7 @@ def run_migrations_online() -> None: ) with connectable.connect() as connection: - context.configure( - connection=connection, target_metadata=target_metadata - ) + context.configure(connection=connection, target_metadata=target_metadata) with context.begin_transaction(): context.run_migrations() diff --git a/backend/alembic/versions/04b904159980_rename_schema_to_standard_version.py b/backend/alembic/versions/04b904159980_rename_schema_to_standard_version.py new file mode 100644 index 00000000..affec4cc --- /dev/null +++ b/backend/alembic/versions/04b904159980_rename_schema_to_standard_version.py @@ -0,0 +1,27 @@ +"""rename schema to standard_version + +Revision ID: 04b904159980 +Revises: 845b0b6e654f +Create Date: 2023-04-05 11:57:40.883818 + +""" +from alembic import op + + +# revision identifiers, used by Alembic. +revision = "04b904159980" +down_revision = "845b0b6e654f" +branch_labels = None +depends_on = None + + +def upgrade() -> None: + op.alter_column( + "algoritme_version", "schema", nullable=True, new_column_name="standard_version" + ) + + +def downgrade() -> None: + op.alter_column( + "algoritme_version", "standard_version", nullable=True, new_column_name="schema" + ) diff --git a/backend/alembic/versions/0a0ff83803b0_add_action_history_table.py b/backend/alembic/versions/0a0ff83803b0_add_action_history_table.py new file mode 100644 index 00000000..d20de76b --- /dev/null +++ b/backend/alembic/versions/0a0ff83803b0_add_action_history_table.py @@ -0,0 +1,79 @@ +"""add action_history table + +Revision ID: 0a0ff83803b0 +Revises: 6ce739d70f55 +Create Date: 2023-04-13 15:12:33.051656 + +""" +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql +from app.models import OperationEnum + +# revision identifiers, used by Alembic. +revision = "0a0ff83803b0" +down_revision = "8691fce44bf2" +branch_labels = None +depends_on = None + + +def upgrade() -> None: + operation = postgresql.ENUM(OperationEnum, name="operation", create_type=False) + operation.create(op.get_bind(), checkfirst=True) + + op.create_table( + "action_history", + sa.Column("id", sa.Integer(), nullable=False), + sa.Column("algoritme_version_id", sa.Integer(), nullable=False), + sa.Column( + "operation", + operation, + nullable=False, + ), + sa.Column("user_id", sa.VARCHAR(length=1024), nullable=False), + sa.Column( + "create_dt", + sa.DateTime(timezone=True), + server_default=sa.text("now()"), + nullable=False, + ), + sa.ForeignKeyConstraint( + ["algoritme_version_id"], + ["algoritme_version.id"], + name="action_history_algoritme_version_fkey", + ondelete="CASCADE", + ), + sa.PrimaryKeyConstraint("id"), + ) + op.create_index( + op.f("ix_action_history_id"), "action_history", ["id"], unique=False + ) + op.drop_column("algoritme_version", "end_dt") + op.drop_column("algoritme_version", "created_by") + + +def downgrade() -> None: + op.add_column( + "algoritme_version", + sa.Column( + "created_by", + sa.VARCHAR(length=100), + autoincrement=False, + nullable=False, + server_default="Unknown due to alembic downgrade", + ), + ) + op.add_column( + "algoritme_version", + sa.Column( + "end_dt", + postgresql.TIMESTAMP(timezone=True), + autoincrement=False, + nullable=True, + ), + ) + op.drop_index(op.f("ix_action_history_id"), table_name="action_history") + op.drop_table("action_history") + + new_type = postgresql.ENUM(OperationEnum, name="operation", create_type=False) + new_type.drop(op.get_bind()) diff --git a/backend/alembic/versions/0a1b6fc81205_remove_leverancier_id.py b/backend/alembic/versions/0a1b6fc81205_remove_leverancier_id.py new file mode 100644 index 00000000..c572c95d --- /dev/null +++ b/backend/alembic/versions/0a1b6fc81205_remove_leverancier_id.py @@ -0,0 +1,32 @@ +"""remove leverancier_id + +Revision ID: 0a1b6fc81205 +Revises: 0a0ff83803b0 +Create Date: 2023-04-19 17:06:04.283044 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = "0a1b6fc81205" +down_revision = "0a0ff83803b0" +branch_labels = None +depends_on = None + + +def upgrade() -> None: + op.drop_column("algoritme", "leverancier_id") + + +def downgrade() -> None: + op.add_column( + "algoritme", + sa.Column( + "leverancier_id", + sa.VARCHAR(length=1024), + autoincrement=False, + nullable=True, + ), + ) diff --git a/backend/alembic/versions/216e1a80d74b_initial_version.py b/backend/alembic/versions/216e1a80d74b_initial_version.py deleted file mode 100644 index a9f48817..00000000 --- a/backend/alembic/versions/216e1a80d74b_initial_version.py +++ /dev/null @@ -1,28 +0,0 @@ -"""initial-version - -Revision ID: 216e1a80d74b -Revises: Builds initial structure from init.sql -Create Date: 2022-11-22 10:11:29.745888 - -""" -from alembic import op -import os - -# revision identifiers, used by Alembic. -revision = '216e1a80d74b' -down_revision = None -branch_labels = None -depends_on = None - - -def upgrade() -> None: - structure_filepath = os.path.abspath("alembic/scripts/init.sql") - with open(structure_filepath) as f: - sql_file = f.read() - op.execute(sql_file + "SET search_path TO public") - pass - - -def downgrade() -> None: - # op.drop_table("default") - pass diff --git a/backend/alembic/versions/4fa08b56de37_iama_column.py b/backend/alembic/versions/4fa08b56de37_iama_column.py deleted file mode 100644 index f5eba67b..00000000 --- a/backend/alembic/versions/4fa08b56de37_iama_column.py +++ /dev/null @@ -1,36 +0,0 @@ -"""iama column - -Revision ID: 4fa08b56de37 -Revises: 995060402de4 -Create Date: 2022-12-09 08:57:39.343415 - -""" -from alembic import op -import sqlalchemy as sa - - -# revision identifiers, used by Alembic. -revision = "4fa08b56de37" -down_revision = "995060402de4" -branch_labels = None -depends_on = None - - -def upgrade() -> None: - connection = op.get_bind() - connection.execute("delete from algoritme") - op.add_column( - table_name="juridisch", - column=sa.Column("iama", sa.VARCHAR(128), nullable=False), - ) - op.add_column( - table_name="juridisch", - column=sa.Column("iama_description", sa.VARCHAR(5000), nullable=False), - ) - - -def downgrade() -> None: - [ - op.drop_column(table_name="juridisch", column_name=column_name) - for column_name in ["iama", "iama_description"] - ] diff --git a/backend/alembic/versions/6ce739d70f55_add_released_column.py b/backend/alembic/versions/6ce739d70f55_add_released_column.py new file mode 100644 index 00000000..70a9c2dd --- /dev/null +++ b/backend/alembic/versions/6ce739d70f55_add_released_column.py @@ -0,0 +1,27 @@ +"""add released column + +Revision ID: 6ce739d70f55 +Revises: 04b904159980 +Create Date: 2023-04-12 15:12:17.599672 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = "6ce739d70f55" +down_revision = "04b904159980" +branch_labels = None +depends_on = None + + +def upgrade() -> None: + op.add_column( + "algoritme_version", + sa.Column("released", sa.Boolean(), nullable=False, server_default="False"), + ) + + +def downgrade() -> None: + op.drop_column("algoritme_version", "released") diff --git a/backend/alembic/versions/845b0b6e654f_build_tables.py b/backend/alembic/versions/845b0b6e654f_build_tables.py new file mode 100644 index 00000000..d0b08d43 --- /dev/null +++ b/backend/alembic/versions/845b0b6e654f_build_tables.py @@ -0,0 +1,111 @@ +"""build tables + +Revision ID: 845b0b6e654f +Revises: +Create Date: 2023-03-07 16:56:50.020821 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = "845b0b6e654f" +down_revision = None +branch_labels = None +depends_on = None + + +def upgrade() -> None: + op.create_table( + "algoritme", + sa.Column("id", sa.Integer(), nullable=False), + sa.Column("lars", sa.String(length=8), nullable=True), + sa.Column("leverancier_id", sa.String(length=1024), nullable=True), + sa.Column("owner", sa.String(length=1024), nullable=True), + sa.Column( + "create_dt", + sa.DateTime(timezone=True), + server_default=sa.text("now()"), + nullable=False, + ), + sa.PrimaryKeyConstraint("id"), + ) + op.create_index(op.f("ix_algoritme_id"), "algoritme", ["id"], unique=False) + op.create_index(op.f("ix_algoritme_lars"), "algoritme", ["lars"], unique=False) + + op.create_table( + "algoritme_version", + sa.Column("id", sa.Integer(), nullable=False), + sa.Column("algoritme_id", sa.Integer(), nullable=False), + sa.Column("name", sa.VARCHAR(length=1024), nullable=True), + sa.Column("organization", sa.VARCHAR(length=1024), nullable=True), + sa.Column("department", sa.VARCHAR(length=1024), nullable=True), + sa.Column("description_short", sa.VARCHAR(length=5000), nullable=True), + sa.Column("type", sa.VARCHAR(length=1024), nullable=True), + sa.Column("category", sa.VARCHAR(length=1024), nullable=True), + sa.Column("website", sa.VARCHAR(length=1024), nullable=True), + sa.Column("status", sa.VARCHAR(length=1024), nullable=True), + sa.Column("goal", sa.VARCHAR(length=5000), nullable=True), + sa.Column("impact", sa.VARCHAR(length=5000), nullable=True), + sa.Column("proportionality", sa.VARCHAR(length=5000), nullable=True), + sa.Column("decision_making_process", sa.VARCHAR(length=5000), nullable=True), + sa.Column("documentation", sa.VARCHAR(length=1024), nullable=True), + sa.Column("competent_authority", sa.VARCHAR(length=1024), nullable=True), + sa.Column("lawful_basis", sa.VARCHAR(length=5000), nullable=True), + sa.Column("iama", sa.VARCHAR(length=128), nullable=True), + sa.Column("iama_description", sa.VARCHAR(length=5000), nullable=True), + sa.Column("dpia", sa.VARCHAR(length=128), nullable=True), + sa.Column("dpia_description", sa.VARCHAR(length=5000), nullable=True), + sa.Column("objection_procedure", sa.VARCHAR(length=5000), nullable=True), + sa.Column("schema", sa.VARCHAR(length=1024), nullable=True), + sa.Column("uuid", sa.VARCHAR(length=1024), nullable=True), + sa.Column("url", sa.VARCHAR(length=1024), nullable=True), + sa.Column("contact_email", sa.VARCHAR(length=1024), nullable=True), + sa.Column("area", sa.VARCHAR(length=1024), nullable=True), + sa.Column("lang", sa.VARCHAR(length=1024), nullable=True), + sa.Column("revision_date", sa.VARCHAR(length=1024), nullable=True), + sa.Column("description", sa.VARCHAR(length=10000), nullable=True), + sa.Column("application_url", sa.VARCHAR(length=1024), nullable=True), + sa.Column("publiccode", sa.VARCHAR(length=1024), nullable=True), + sa.Column("mprd", sa.VARCHAR(length=500), nullable=True), + sa.Column("source_data", sa.VARCHAR(length=5000), nullable=True), + sa.Column("methods_and_models", sa.VARCHAR(length=5000), nullable=True), + sa.Column("monitoring", sa.VARCHAR(length=5000), nullable=True), + sa.Column("human_intervention", sa.VARCHAR(length=5000), nullable=True), + sa.Column("risks", sa.VARCHAR(length=5000), nullable=True), + sa.Column("performance_standard", sa.VARCHAR(length=5000), nullable=True), + sa.Column( + "create_dt", + sa.DateTime(timezone=True), + server_default=sa.text("now()"), + nullable=True, + ), + sa.Column("end_dt", sa.DateTime(timezone=True), nullable=True), + sa.Column( + "published", + sa.Boolean, + nullable=False, + server_default="False", + ), + sa.Column("preview_active", sa.Boolean, nullable=False, server_default="False"), + sa.Column("created_by", sa.VARCHAR(length=100), nullable=False), + sa.ForeignKeyConstraint( + ["algoritme_id"], + ["algoritme.id"], + name="algoritme_version_algoritme_id_fkey", + ondelete="CASCADE", + ), + sa.PrimaryKeyConstraint("id"), + ) + op.create_index( + op.f("ix_algoritme_version_id"), "algoritme_version", ["id"], unique=False + ) + + +def downgrade() -> None: + op.drop_index(op.f("ix_algoritme_version_id"), table_name="algoritme_version") + op.drop_table("algoritme_version") + op.drop_index(op.f("ix_algoritme_id"), table_name="algoritme") + op.drop_index(op.f("ix_algoritme_lars"), table_name="algoritme") + op.drop_table("algoritme") diff --git a/backend/alembic/versions/8691fce44bf2_add_columns_for_0_3_1.py b/backend/alembic/versions/8691fce44bf2_add_columns_for_0_3_1.py new file mode 100644 index 00000000..715f26ee --- /dev/null +++ b/backend/alembic/versions/8691fce44bf2_add_columns_for_0_3_1.py @@ -0,0 +1,41 @@ +"""add columns for 0.3.1 + +Revision ID: 8691fce44bf2 +Revises: 6ce739d70f55 +Create Date: 2023-04-18 13:28:26.382907 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = "8691fce44bf2" +down_revision = "6ce739d70f55" +branch_labels = None +depends_on = None + + +def upgrade() -> None: + op.add_column( + "algoritme_version", + sa.Column("provider", sa.VARCHAR(length=100), nullable=True), + ) + op.add_column( + "algoritme_version", + sa.Column("process_index_url", sa.VARCHAR(length=500), nullable=True), + ) + op.add_column( + "algoritme_version", sa.Column("tags", sa.VARCHAR(length=2500), nullable=True) + ) + op.add_column( + "algoritme_version", + sa.Column("source_id", sa.VARCHAR(length=100), nullable=True), + ) + + +def downgrade() -> None: + op.drop_column("algoritme_version", "tags") + op.drop_column("algoritme_version", "process_index_url") + op.drop_column("algoritme_version", "provider") + op.drop_column("algoritme_version", "source_id") diff --git a/backend/alembic/versions/8d57b6b9667f_create_algoritme_slug.py b/backend/alembic/versions/8d57b6b9667f_create_algoritme_slug.py deleted file mode 100644 index ba0e214d..00000000 --- a/backend/alembic/versions/8d57b6b9667f_create_algoritme_slug.py +++ /dev/null @@ -1,37 +0,0 @@ -"""create algoritme slug - -Revision ID: 8d57b6b9667f -Revises: 4fa08b56de37 -Create Date: 2022-12-09 09:42:25.407514 - -""" -from alembic import op -import sqlalchemy as sa - - -# revision identifiers, used by Alembic. -revision = "8d57b6b9667f" -down_revision = "4fa08b56de37" -branch_labels = None -depends_on = None - - -def upgrade() -> None: - connection = op.get_bind() - connection.execute("delete from algoritme") - slug_column_name = "slug" - table_name = "algoritme" - op.add_column( - table_name=table_name, - column=sa.Column(slug_column_name, sa.VARCHAR(128), nullable=False), - ) - op.create_index( - index_name="index_slug", - table_name=table_name, - columns=[slug_column_name], - unique=True, - ) - - -def downgrade() -> None: - op.drop_column(table_name="algoritme", column_name="slug") diff --git a/backend/alembic/versions/926a9cef924c_verwijder_algorimes_spoedverzoek.py b/backend/alembic/versions/926a9cef924c_verwijder_algorimes_spoedverzoek.py deleted file mode 100644 index 06f1ed82..00000000 --- a/backend/alembic/versions/926a9cef924c_verwijder_algorimes_spoedverzoek.py +++ /dev/null @@ -1,27 +0,0 @@ -"""verwijder algorimes (spoedverzoek) - -Revision ID: 926a9cef924c -Revises: f35c8031d388 -Create Date: 2022-12-05 12:23:43.539969 - -""" -from alembic import op -import sqlalchemy as sa - - -# revision identifiers, used by Alembic. -revision = "926a9cef924c" -down_revision = "f35c8031d388" -branch_labels = None -depends_on = None - - -def upgrade() -> None: - ids_to_be_removed = [46, 47, 48, 49, 50, 51, 52] - query = sa.text("delete from algoritme where id in :ids_to_be_removed") - connection = op.get_bind() - connection.execute(query, ids_to_be_removed=tuple(ids_to_be_removed)) - - -def downgrade() -> None: - pass diff --git a/backend/alembic/versions/995060402de4_algoritme_uuid.py b/backend/alembic/versions/995060402de4_algoritme_uuid.py deleted file mode 100644 index b2d68308..00000000 --- a/backend/alembic/versions/995060402de4_algoritme_uuid.py +++ /dev/null @@ -1,51 +0,0 @@ -"""algoritme uuid - -Revision ID: 995060402de4 -Revises: 926a9cef924c -Create Date: 2022-12-05 21:33:36.143948 - -""" -from alembic import op -import sqlalchemy as sa -from sqlalchemy.dialects.postgresql import UUID - - -# revision identifiers, used by Alembic. -revision = "995060402de4" -down_revision = "926a9cef924c" -branch_labels = None -depends_on = None - -tables = ["algoritme", "inzet", "juridisch", "metadata", "toepassing", "toezicht"] - - -def upgrade() -> None: - op.add_column( - table_name="algoritme", - column=sa.Column( - "uuid", - UUID(as_uuid=True), - nullable=False, - server_default=sa.text("gen_random_uuid()"), - ), - ) - op.create_index( - index_name="index_uuid", table_name="algoritme", columns=["uuid"], unique=True - ) - - for table in tables: - op.add_column( - table_name=table, - column=sa.Column( - "toegevoegd_op", - sa.DateTime(timezone=True), - server_default=sa.sql.func.now(), - nullable=False, - ), - ) - - -def downgrade() -> None: - for table in tables: - op.drop_column(table_name=table, column_name="toegevoegd_op") - op.drop_column(table_name="algoritme", column_name="uuid") diff --git a/backend/alembic/versions/9e7ff58ba2cd_upload_data.py b/backend/alembic/versions/9e7ff58ba2cd_upload_data.py deleted file mode 100644 index 054faeee..00000000 --- a/backend/alembic/versions/9e7ff58ba2cd_upload_data.py +++ /dev/null @@ -1,29 +0,0 @@ -"""upload data - -Revision ID: 9e7ff58ba2cd -Revises: 216e1a80d74b -Create Date: 2022-11-22 11:53:02.393973 - -""" -from alembic import op -import os - -# revision identifiers, used by Alembic. -revision = '9e7ff58ba2cd' -down_revision = '216e1a80d74b' -branch_labels = None -depends_on = None - - -def upgrade() -> None: - structure_filepath = os.path.abspath("alembic/scripts/init_testdata.sql") - with open(structure_filepath) as f: - sql_file = f.read() - op.execute(sql_file + "SET search_path TO public") - pass - - -def downgrade() -> None: - tables = ["algemene_informatie", "inzet", "juridisch", "toepassing", "toezicht", "metadata"] - for table in tables: - op.execute(f"drop table {table} cascade") diff --git a/backend/alembic/versions/f35c8031d388_adjust_table_name_algemene_informatie.py b/backend/alembic/versions/f35c8031d388_adjust_table_name_algemene_informatie.py deleted file mode 100644 index 845fcbde..00000000 --- a/backend/alembic/versions/f35c8031d388_adjust_table_name_algemene_informatie.py +++ /dev/null @@ -1,23 +0,0 @@ -"""adjust table name algemene_informatie - -Revision ID: f35c8031d388 -Revises: 9e7ff58ba2cd -Create Date: 2022-11-25 10:53:00.746239 - -""" -from alembic import op - - -# revision identifiers, used by Alembic. -revision = "f35c8031d388" -down_revision = "9e7ff58ba2cd" -branch_labels = None -depends_on = None - - -def upgrade() -> None: - op.rename_table("algemene_informatie", "algoritme") - - -def downgrade() -> None: - op.rename_table("algoritme", "algemene_informatie") diff --git a/backend/app/api.py b/backend/app/api.py new file mode 100644 index 00000000..e1da6c6b --- /dev/null +++ b/backend/app/api.py @@ -0,0 +1,32 @@ +from fastapi import FastAPI, APIRouter +from starlette.middleware.cors import CORSMiddleware +import re +from app import routers +from app.util.logger import get_logger + +logger = get_logger(__name__) + + +api = FastAPI( + docs_url="/api-docs", + title="Algoritmeregister aanlevering API", + swagger_ui_parameters={ + "displayRequestDuration": True, + "defaultModelsExpandDepth": -1, + }, +) + +router = APIRouter() + +# Includes fastapi instances in routers folders dynamically. +version_pattern = re.compile("v[0-9]_[0-9]_[0-9][a-z]?") +file_names = [item for item in dir(routers) if version_pattern.match(item)] +for f in file_names: + file = getattr(routers, f) + mount_router = getattr(file, "api") + api.mount(f"/{f}", mount_router) + + +api.add_middleware( + CORSMiddleware, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"] +) diff --git a/backend/app/config/api.py b/backend/app/config/api.py new file mode 100644 index 00000000..1ab330bd --- /dev/null +++ b/backend/app/config/api.py @@ -0,0 +1,95 @@ +from typing import TypedDict +from app import schemas + +default_responses = { + 401: {"description": "Authentication Error", "model": schemas.Message}, + 404: {"description": "Not Found Error", "model": schemas.Message}, +} + +responses = { + "get_all": { + **default_responses, + 200: { + "content": { + "application/json": {"schema": {"title": "List of algorithm summaries"}} + } + }, + }, + "get_one": { + **default_responses, + 200: { + "content": { + "application/json": { + "schema": {"title": "Any of the algorithm standards."} + } + } + }, + }, + "get_one_published": { + **default_responses, + 200: { + "content": { + "application/json": { + "schema": {"title": "Any of the algorithm standards."} + } + } + }, + }, + "post": {**default_responses}, + "put": {**default_responses}, + "delete": {**default_responses}, + "publish": {**default_responses}, + "release": {**default_responses}, + "preview": {**default_responses}, + "remove": {**default_responses}, +} + + +class EndpointText(TypedDict): + summary: str + description: str + + +api_text: dict[str, EndpointText] = { + "get_all": { + "summary": "Haal alle beschikbare algoritmes op.", + "description": "Geeft een samenvatting van de algoritmes terug waar u bewerkingsrechten voor heeft.", + }, + "get_one": { + "summary": "Haal de nieuwste versie van één algoritme op.", + "description": """Verkrijg de nieuwste gegevens van één algoritme. Dit is niet per se gepubliceerd.""", + }, + "get_one_published": { + "summary": "Haal de gepubliceerde versie van één algoritme op.", + "description": "Verkrijg de gepubliceerde versie van één algoritme.", + }, + "post": { + "summary": "Maak een nieuw algoritme.", + "description": "Het aanroepen van dit endpoint creeërt een nieuw algoritme.", + }, + "put": { + "summary": "Update een algoritme.", + "description": "Sla de nieuwe algoritme-informatie op. Hiermee is het nog niet gepubliceerd.", + }, + "delete": { + "summary": "Verberg een algoritme.", + "description": "Verberg een algoritme, zodat deze niet meer publiek toegankelijk is.", + }, + "publish": { + "summary": "Publiceer een algoritme.", + "description": "Publiceer de laatste gegevens van een algoritme, zodat deze publiek toegankelijk zijn.", + }, + "release": { + "summary": "Geef een algoritme vrij voor publicatie.", + "description": "Geef de laatste gegevens van een algoritme vrij, zodat BZK ze kan gaan inspecteren, en " + "uiteindelijk publiceren.", + }, + "preview": { + "summary": "Bekijk een preview van een algoritme.", + "description": """Krijg een URL waarmee de laatste gegevens van een algoritme kunnen worden bekeken.""", + }, + "remove": { + "summary": "Verwijder een algoritme. Alleen beschikbaar voor beheerders.", + "description": "", + }, +} diff --git a/backend/app/config/resource.py b/backend/app/config/resource.py index 22c88dd6..78981903 100644 --- a/backend/app/config/resource.py +++ b/backend/app/config/resource.py @@ -4,62 +4,47 @@ class Columns(str, Enum): all = "*" - algoritme_organization = "algoritme.organization" - algoritme_name = "algoritme.name" - algoritme_department = "algoritme.department" - algoritme_description_short = "algoritme.description_short" - algoritme_type = "algoritme.type" - algoritme_category = "algoritme.category" - algoritme_website = "algoritme.website" - algoritme_status = "algoritme.status" - algoritme_uuid = "algoritme.uuid" - algoritme_toegevoegd_op = "algoritme.toegevoegd_op" - algoritme_slug = "algoritme.slug" - - inzet_goal = "inzet.goal" - inzet_impact = "inzet.impact" - inzet_proportionality = "inzet.proportionality" - inzet_decision_making_process = "inzet.decision_making_process" - inzet_documentation = "inzet.documentation" - inzet_toegevoegd_op = "inzet.toegevoegd_op" - - juridisch_competent_authority = "juridisch.competent_authority" - juridisch_lawful_basis = "juridisch.lawful_basis" - juridisch_iama = "juridisch.iama" - juridisch_iama_description = "juridisch.iama_description" - juridisch_dpia = "juridisch.dpia" - juridisch_dpia_description = "juridisch.dpia_description" - juridisch_objection_procedure = "juridisch.objection_procedure" - juridisch_toegevoegd_op = "juridisch.toegevoegd_op" - - metadata_schema = "metadata.schema" - metadata_uuid = "metadata.uuid" - metadata_url = "metadata.url" - metadata_contact_email = "metadata.contact_email" - metadata_area = "metadata.area" - metadata_lang = "metadata.lang" - metadata_revision_date = "metadata.revision_date" - metadata_toegevoegd_op = "metadata.toegevoegd_op" - - toepassing_description = "toepassing.description" - toepassing_application_url = "toepassing.application_url" - toepassing_publiccode = "toepassing.publiccode" - toepassing_mprd = "toepassing.mprd" - toepassing_source_data = "toepassing.source_data" - toepassing_methods_and_models = "toepassing.methods_and_models" - toepassing_toegevoegd_op = "toepassing.toegevoegd_op" - - toezicht_monitoring = "toezicht.monitoring" - toezicht_human_intervention = "toezicht.human_intervention" - toezicht_risks = "toezicht.risks" - toezicht_performance_standard = "toezicht.performance_standard" - toezicht_toegevoegd_op = "toezicht.toegevoegd_op" - - -# columns=metadata.contact_email -# columns=metadata.toegevoegd_op - -# columns=toepassing.toegevoegd_op - -# columns=toezicht.human_intervention -# columns=toezicht.toegevoegd_op + algoritme_organization = "organization" + algoritme_name = "name" + algoritme_department = "department" + algoritme_description_short = "description_short" + algoritme_type = "type" + algoritme_category = "category" + algoritme_website = "website" + algoritme_status = "status" + algoritme_uuid = "uuid" + algoritme_create_dt = "create_dt" + + inzet_goal = "goal" + inzet_impact = "impact" + inzet_proportionality = "proportionality" + inzet_decision_making_process = "decision_making_process" + inzet_documentation = "documentation" + + juridisch_competent_authority = "competent_authority" + juridisch_lawful_basis = "lawful_basis" + juridisch_iama = "iama" + juridisch_iama_description = "iama_description" + juridisch_dpia = "dpia" + juridisch_dpia_description = "dpia_description" + juridisch_objection_procedure = "objection_procedure" + + metadata_schema = "schema" + metadata_uuid = "uuid" + metadata_url = "url" + metadata_contact_email = "contact_email" + metadata_area = "area" + metadata_lang = "lang" + metadata_revision_date = "revision_date" + + toepassing_description = "description" + toepassing_application_url = "application_url" + toepassing_publiccode = "publiccode" + toepassing_mprd = "mprd" + toepassing_source_data = "source_data" + toepassing_methods_and_models = "methods_and_models" + + toezicht_monitoring = "monitoring" + toezicht_human_intervention = "human_intervention" + toezicht_risks = "risks" + toezicht_performance_standard = "performance_standard" diff --git a/backend/app/config/settings.py b/backend/app/config/settings.py new file mode 100644 index 00000000..f1285fc5 --- /dev/null +++ b/backend/app/config/settings.py @@ -0,0 +1,14 @@ +from pydantic import BaseSettings, Field + + +class Settings(BaseSettings): + type: str = Field("PUB") + enable_debug: bool = Field(False) + preview_url: str = Field("localhost:3000/concept") + retract_preview_time: int = Field(600) + + +class Keycloak(BaseSettings): + KEYCLOAK_URI: str = Field(default="https://s04.i8s.nl") + KEYCLOAK_REALM: str = Field(default="algreg_dev") + KEYCLOAK_CLIENT: str = Field(default="authentication-client") diff --git a/backend/app/controllers/__init__.py b/backend/app/controllers/__init__.py new file mode 100644 index 00000000..71fff29f --- /dev/null +++ b/backend/app/controllers/__init__.py @@ -0,0 +1,2 @@ +from .algoritme_version import * # noqa +from .action_history import * # noqa diff --git a/backend/app/controllers/action_history.py b/backend/app/controllers/action_history.py new file mode 100644 index 00000000..69996351 --- /dev/null +++ b/backend/app/controllers/action_history.py @@ -0,0 +1,18 @@ +from app import models, schemas +from sqlalchemy.orm import Session + + +def post_action( + action: models.OperationEnum, + algoritme_version_id: str, + db: Session, + user: schemas.User | str, +) -> None: + action_history = { + "algoritme_version_id": algoritme_version_id, + "operation": action, + "user_id": getattr(user, "name", user), + } + new_action = models.ActionHistory(**action_history) + + db.add(new_action) diff --git a/backend/app/controllers/algoritme_version/__init__.py b/backend/app/controllers/algoritme_version/__init__.py new file mode 100644 index 00000000..b7a771dc --- /dev/null +++ b/backend/app/controllers/algoritme_version/__init__.py @@ -0,0 +1,23 @@ +from .endpoints import ( # noqa + get_all_newest, + get_one_newest, + get_one_published, + retract_one, + publish_one, + release_one, + update_new_version, + post_one, + get_preview_link, + remove_one, +) +from .util import ( # noqa + get_published_version_algo, + get_latest_version_algo, + retract_published_algo, + publish_latest_version_algo, + set_preview_active, + wait_then_disable_preview, + disable_preview, + find_version_changes, + remove_all_versions_algo, +) diff --git a/backend/app/controllers/algoritme_version/endpoints.py b/backend/app/controllers/algoritme_version/endpoints.py new file mode 100644 index 00000000..d8311be8 --- /dev/null +++ b/backend/app/controllers/algoritme_version/endpoints.py @@ -0,0 +1,267 @@ +from fastapi import HTTPException, status +from sqlalchemy.orm import Session +from app import models, schemas, controllers +from app.util import upc +from app.config.settings import Settings +from .util import ( + retract_published_algo, + get_latest_version_algo, + get_latest_versions_algo, + publish_latest_version_algo, + release_latest_version_algo, + get_published_version_algo, + get_published_versions_algo, + set_preview_active, + find_version_changes, + remove_all_versions_algo, +) + +# Version agnostic database handling +env_settings = Settings() + + +def get_all_newest( + as_org: str, + db: Session, + user: schemas.User, +) -> list[schemas.AlgorithmSummary]: + # Gets latest versions. + latest_versions = get_latest_versions_algo(as_org=as_org, db=db) + published_versions = get_published_versions_algo(as_org=as_org, db=db) + + # This dict described which algoritme_version row is published for each algorithm. + # structure: + # lars_code : id_in_db + # published_ids = { + # '12345678': '234', + # '11111111': '111', + # } + published_ids = {} + if published_versions: + for published_algo in published_versions: + lars_code = getattr(published_algo, "lars") + published_ids[lars_code] = getattr(published_algo, "id") + + summary_list = [] + for latest_algo in latest_versions: + lars_code = getattr(latest_algo, "lars") + + summary_list.append( + schemas.AlgorithmSummary( + name=getattr(latest_algo, "name"), + schema_version=getattr(latest_algo, "standard_version"), + last_update_dt=getattr(latest_algo, "create_dt"), + lars=getattr(latest_algo, "lars"), + source_id=getattr(latest_algo, "source_id"), + published=lars_code in published_ids, + current_version_released=getattr(latest_algo, "released"), + current_version_published=getattr(latest_algo, "published"), + last_update_by="Temporarily unavailable", + ) + ) + return summary_list + + +def get_one_newest( + lars: str, + db: Session, + user: schemas.User, +) -> models.AlgoritmeVersion: + newest_algo = get_latest_version_algo(lars, db) + if not newest_algo: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail=f"Er is geen algoritme met LARS-code: {lars}.", + ) + return newest_algo + + +def get_one_published( + lars: str, + db: Session, + user: schemas.User, +) -> models.AlgoritmeVersion: + newest_algo = get_published_version_algo(lars, db) + if not newest_algo: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail=f"Er is geen gepubliceerd algoritme met LARS-code: {lars}.", + ) + return newest_algo + + +def post_one( + as_org: str, + body, + db: Session, + user: schemas.User, +) -> schemas.NewAlgorithmResponse: + # Generate a unique id for this algorithm. + current_lars_list = [lars[0] for lars in db.query(models.Algoritme.lars).all()] + new_lars = upc.find_new_upc(avoid_upc_list=current_lars_list) + + # Creates new entry in algoritme_version table. + algoritme_version_dict = body.dict() + new_algoritme_version = models.AlgoritmeVersion(**algoritme_version_dict) + + # Creates new entry in algoritme table. + algoritme_dict = { + "lars": new_lars, + "owner": as_org, + "versions": [new_algoritme_version], + } + new_algoritme = models.Algoritme(**algoritme_dict) + + db.add(new_algoritme) + db.add(new_algoritme_version) + db.flush() + controllers.action_history.post_action( + models.OperationEnum.created, + str(new_algoritme_version.id), + db, + user, + ) + db.commit() + + return schemas.NewAlgorithmResponse(lars_code=new_lars) + + +def retract_one( + lars: str, + db: Session, + user: schemas.User, +) -> None: + archived_id = retract_published_algo(lars, db) + if archived_id: + controllers.action_history.post_action( + models.OperationEnum.retracted, archived_id, db, user + ) + else: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail=f"Er is geen gepubliceerd algoritme gevonden met LARS-code: ({lars})", + ) + + db.commit() + + +def release_one( + lars: str, + db: Session, + user: schemas.User, +) -> schemas.AlgorithmActionResponse | None: + latest_version = get_latest_version_algo(lars, db) + if getattr(latest_version, "released"): + return schemas.AlgorithmActionResponse( + message="Latest version is already released." + ) + + released_id = release_latest_version_algo(lars, db) + if released_id: + controllers.action_history.post_action( + models.OperationEnum.released, released_id, db, user + ) + else: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail=f"Er kan geen algoritme met LARS-code: ({lars}) worden vrijgegeven.", + ) + + db.commit() + + +def publish_one( + lars: str, + db: Session, + user: schemas.User, +) -> schemas.AlgorithmActionResponse | None: + latest_version = get_latest_version_algo(lars, db) + if getattr(latest_version, "published"): + return schemas.AlgorithmActionResponse( + message="The latest version is already published." + ) + elif not getattr(latest_version, "released"): + return schemas.AlgorithmActionResponse( + message="The latest version is not released." + ) + + retracted_id = retract_published_algo(lars, db) + if retracted_id: + controllers.action_history.post_action( + models.OperationEnum.retracted, retracted_id, db, user + ) + + published_id = publish_latest_version_algo(lars, db) + if published_id: + controllers.action_history.post_action( + models.OperationEnum.published, published_id, db, user + ) + else: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail=f"Er kan geen algoritme met LARS-code: ({lars}) worden gepubliceerd.", + ) + + db.commit() + + +def update_new_version( + body, + lars: str, + db: Session, + user: schemas.User, +) -> schemas.AlgorithmActionResponse | None: + algoritme = db.query(models.Algoritme).filter(models.Algoritme.lars == lars).first() + if not algoritme: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail=f"Er is geen algoritme gevonden met LARS-code: ({lars})", + ) + + # Store new entry + new_algoritme_version = body.dict() + new_algoritme_version["algoritme_id"] = algoritme.id + new_version_model = models.AlgoritmeVersion(**new_algoritme_version) + + # Compare with current entry + latest_version = get_latest_version_algo(lars, db) + change_found = find_version_changes(latest_version, new_version_model) + if not change_found: + return schemas.AlgorithmActionResponse(message="Version has no changes.") + + db.add(new_version_model) + db.flush() + controllers.action_history.post_action( + models.OperationEnum.new_version, str(new_version_model.id), db, user + ) + db.commit() + + +def get_preview_link(lars: str, db: Session, user: schemas.User) -> schemas.PreviewUrl: + preview_id = set_preview_active(lars=lars, db=db) + if preview_id: + controllers.action_history.post_action( + action=models.OperationEnum.preview_activated, + algoritme_version_id=str(preview_id), + db=db, + user=user, + ) + else: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail=f"Er is geen algoritme gevonden met LARS-code: ({lars})", + ) + + db.commit() + url = f"{env_settings.preview_url}/algoritme/C{lars}" + return schemas.PreviewUrl(url=url) + + +def remove_one(lars: str, db: Session, user: schemas.User) -> None: + n_removed = remove_all_versions_algo(lars=lars, db=db) + if n_removed == 0: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail=f"Er is geen algoritme gevonden met LARS-code: ({lars})", + ) + db.commit() diff --git a/backend/app/controllers/algoritme_version/util.py b/backend/app/controllers/algoritme_version/util.py new file mode 100644 index 00000000..764842c8 --- /dev/null +++ b/backend/app/controllers/algoritme_version/util.py @@ -0,0 +1,174 @@ +from sqlalchemy.orm import Session +from sqlalchemy import desc, func, and_ +from threading import Timer +from app.config.settings import Settings +from app import models, controllers + +env_settings = Settings() + + +def get_published_version_algo(id: str, db: Session) -> models.AlgoritmeVersion | None: + published_algo = ( + db.query(models.AlgoritmeVersion) + .filter( + models.AlgoritmeVersion.published, + models.AlgoritmeVersion.lars == id, + ) + .first() + ) + return published_algo + + +def get_published_versions_algo( + as_org: str, db: Session +) -> list[models.AlgoritmeVersion] | None: + published_algo = ( + db.query(models.AlgoritmeVersion) + .filter( + models.AlgoritmeVersion.published, + models.AlgoritmeVersion.owner == as_org, + ) + .all() + ) + return published_algo + + +def get_latest_version_algo(id: str, db: Session) -> models.AlgoritmeVersion | None: + query = ( + db.query(models.AlgoritmeVersion) + .filter(models.AlgoritmeVersion.lars == id) + .order_by(desc(models.AlgoritmeVersion.create_dt)) + ) + latest_algo = query.first() + return latest_algo + + +def get_latest_versions_algo(as_org: str, db: Session) -> list[models.AlgoritmeVersion]: + subquery = ( + db.query( + models.AlgoritmeVersion.algoritme_id, + func.max(models.AlgoritmeVersion.create_dt).label("max_creation_dt"), + ) + .group_by(models.AlgoritmeVersion.algoritme_id) + .subquery() + ) + query = ( + db.query(models.AlgoritmeVersion) + .join( + subquery, + and_( + models.AlgoritmeVersion.algoritme_id == subquery.c.algoritme_id, + models.AlgoritmeVersion.create_dt == subquery.c.max_creation_dt, + ), + ) + .filter( + models.AlgoritmeVersion.owner == as_org, + ) + ) + query_result = query.all() + return query_result + + +def retract_published_algo(id: str, db: Session) -> str | None: + query = db.query(models.AlgoritmeVersion).filter( + models.AlgoritmeVersion.published, + models.AlgoritmeVersion.lars == id, + ) + row = query.first() + if row: + update_is_succesful = query.update( + { + models.AlgoritmeVersion.published: False, + models.AlgoritmeVersion.released: False, + }, + synchronize_session=False, + ) + if update_is_succesful: + return row.id + + +def release_latest_version_algo(id: str, db: Session) -> str | None: + latest_version = get_latest_version_algo(id, db) + if latest_version: + setattr(latest_version, "released", True) + return str(latest_version.id) + + +def publish_latest_version_algo(id: str, db: Session) -> str | None: + latest_version = get_latest_version_algo(id, db) + if latest_version: + setattr(latest_version, "published", True) + return str(latest_version.id) + + +def set_preview_active(lars: str, db: Session) -> str | None: + latest_algo = ( + db.query(models.AlgoritmeVersion) + .filter(models.AlgoritmeVersion.lars == lars) + .order_by(desc(models.AlgoritmeVersion.create_dt)) + ).first() + if not latest_algo: + return + setattr(latest_algo, "preview_active", True) + db.commit() + return latest_algo.id + + +def wait_then_disable_preview(lars: str, db: Session) -> None: + S = Timer( + env_settings.retract_preview_time, + disable_preview, + kwargs={ + "lars": lars, + "db": db, + "user": "system", + "reason": models.OperationEnum.preview_timeout, + }, + ) + S.start() + + +def get_preview_algo(lars: str, db: Session): + preview_algo = ( + db.query(models.AlgoritmeVersion) + .filter( + models.AlgoritmeVersion.lars == lars, models.AlgoritmeVersion.preview_active + ) + .first() + ) + return preview_algo + + +def disable_preview( + lars: str, db: Session, user: str, reason: models.OperationEnum +) -> bool: + preview_algo = get_preview_algo(lars, db) + if not preview_algo: + return False + setattr(preview_algo, "preview_active", False) + controllers.action_history.post_action( + action=reason, + algoritme_version_id=preview_algo.id, + db=db, + user=user, + ) + db.commit() + return True + + +def find_version_changes(v1, v2) -> bool: + ignore_attributes = ["id", "published", "released", "preview_active", "create_dt"] + for each in v1.__table__.columns: + attribute = str(each).split(".")[-1] + old_attribute = getattr(v1, attribute) + new_attribute = getattr(v2, attribute) + if (old_attribute != new_attribute) and attribute not in ignore_attributes: + return True + return False + + +def remove_all_versions_algo(lars: str, db: Session) -> int: + n_removed = ( + db.query(models.Algoritme).filter(models.Algoritme.lars == lars).delete() + ) + return n_removed diff --git a/backend/app/data/text_loader/supporting_text.json b/backend/app/data/text_loader/supporting_text.json new file mode 100644 index 00000000..5daeb61b --- /dev/null +++ b/backend/app/data/text_loader/supporting_text.json @@ -0,0 +1,50 @@ +{ + "nl": { + "Footer: Contact": { + "content": "

Neem contact op

Deze site is volop in ontwikkeling. Heb je vragen over het Algoritmeregister? Of ben je een (overheids)professional en wil jij of je organisatie meedoen aan de verdere ontwikkeling van het Algoritmeregister? Kijk naar de informatie op Over deze website en de Veelgestelde vragen.

Heb je toch nog een vraag? Neem dan contact op met: algoritmeregister@minbzk.nl.

", + "pageTitle": "

Contact

" + }, + "Footer: Over": { + "content": "

Over het Algoritmeregister

De overheid werkt steeds meer digitaal en gebruikt daarvoor steeds vaker algoritmes. Omdat digitalisering niet vanzelfsprekend goed gaat, werkt de overheid aan transparante en verantwoorde inzet van die algoritmes. Zodat de informatie over de algoritmes die de overheid gebruikt voor iedereen beschikbaar is: burgers, hun belangenbehartigers, de media en toezichthouders.

Open ontwikkeling

Het Algoritmeregister is in ontwikkeling. De informatie verandert nog vaak. Nieuwe algoritmes worden toegevoegd en algoritmes worden geactualiseerd. Ook bouwt het ministerie van Binnenlandse Zaken en Koninkrijksrelaties steeds door aan het Algoritmeregister. Dit doet het team op een open manier. Omdat het open source software is, kan iedereen meekijken op de Github van ministerie van Binnenlandse Zaken en Koninkrijksrelaties.\"Link

Die open ontwikkeling betekent dat de inhoud door de tijd heen zal wijzigen, bijvoorbeeld:

  • Er komen algoritmes bij of gaan algoritmes af
  • De ‘standaard’ (velden met informatie) wordt gewijzigd en/of uitgebreid
  • De reeds gepubliceerde beschrijving van algoritmes wordt gewijzigd en/of uitgebreid.

Open meedoen

Een aantal overheidsorganisaties heeft op dit moment al algoritmes gepubliceerd in het algoritmeregister. Het doel is om alle overheidsorganisaties met relevante algoritmes aangesloten te hebben. Uiteindelijk zal registratie ook wettelijk verplicht worden.

Overheidsorganisaties kunnen algoritmes aanleveren voor registratie in het Algoritmeregister.

Er zijn verschillende onderdelen waar je aan mee kan doen of waar je feedback op kan geven:

  • Feedback geven op de standaard
  • Feedback op de gepubliceerde beschrijving
  • Feedback op de gebruikservaring van de website (UX)
  • Feedback op de code van deze website

Wil je meedoen? Heb je feedback op bijvoorbeeld een van deze onderwerpen? Neem dan contact op met: algoritmeregister@minbzk.nl\"Link.

Je kan ook deelnemen aan de community site op het platform Pleio\"Link. Maak gratis een account aan (dat kan hier\"Link) en doe mee: algoritmes.pleio.nl \"Link.

Open source software

Het Algoritmeregister wordt ontwikkeld met open source software (volg het Algoritmeregister op Github\"Link). Deze site wordt ontwikkeld zodat deze voor zoveel mogelijk mensen bruikbaar is.

Algoritmebeleid

Het Algoritmeregister is een volgende stap in het verantwoord gebruik van algoritmes binnen de overheid. Daarnaast werkt de overheid aan het versterken van het toezicht op algoritmes. Ook wordt er gewerkt aan een implementatiekader. Daarnaast zet de overheid zicht in voor eisen aan kunstmatige intelligentie in de Europese Unie. Meer informatie over de plannen kun je vinden in de werkagenda Waardegedreven Digitaliseren\"Link.

", + "pageTitle": "

Over het Algoritmeregister

" + }, + "Footer: Privacyverklaring": { + "content": "

Privacy

Deze website maakt gebruik van analytische cookies. Cookies zijn kleine tekstbestanden die websites op jouw computer opslaan. Daarmee is jouw computer te herkennen tijdens uw bezoek. Deze informatie helpt het bouwteam om de site te verbeteren. Analytische cookies geven antwoord op bijvoorbeeld de volgende vragen:

  • Is de bezoeker nieuw of heeft de bezoeker de site al eerder bezocht
  • Welke pagina's zijn tijdens het bezoek geraadpleegd
  • Van welke site is de bezoeker gekomen
  • Heeft de bezoeker de site meteen weer verlaten ('bouncing').

Deze cookies worden niet gebruikt om een profiel aan te maken of jou verder te volgen. Deze website plaatst geen cookies van derde partijen (third-party cookies).

Gegevens via e-mail

Persoonlijke informatie die via e-mail bij het Algoritmeregister bekend wordt, behandelt het team vertrouwelijk. Dergelijke persoonlijke gegevens bewaart het team alleen voor de duur van de behandeling van het bericht. Nadat je antwoord hebt gekregen of als er geen antwoord gevraagd wordt, slaat het team alleen de vraag en het antwoord op. Op verzoek verwijdert het team ook de vraag en het antwoord.

", + "pageTitle": "

Privacy

" + }, + "Footer: Privacy": { + "content": "

Privacy

Deze website maakt gebruik van analytische cookies. Cookies zijn kleine tekstbestanden die websites op jouw computer opslaan. Daarmee is jouw computer te herkennen tijdens uw bezoek. Deze informatie helpt het bouwteam om de site te verbeteren. Analytische cookies geven antwoord op bijvoorbeeld de volgende vragen:

  • Is de bezoeker nieuw of heeft de bezoeker de site al eerder bezocht
  • Welke pagina's zijn tijdens het bezoek geraadpleegd
  • Van welke site is de bezoeker gekomen
  • Heeft de bezoeker de site meteen weer verlaten ('bouncing').

Deze cookies worden niet gebruikt om een profiel aan te maken of jou verder te volgen. Deze website plaatst geen cookies van derde partijen (third-party cookies).

Gegevens via e-mail

Persoonlijke informatie die via e-mail bij het Algoritmeregister bekend wordt, behandelt het team vertrouwelijk. Dergelijke persoonlijke gegevens bewaart het team alleen voor de duur van de behandeling van het bericht. Nadat je antwoord hebt gekregen of als er geen antwoord gevraagd wordt, slaat het team alleen de vraag en het antwoord op. Op verzoek verwijdert het team ook de vraag en het antwoord.

", + "pageTitle": "

Privacy

" + }, + "Footer: Toegankelijkheid": { + "content": "

Toegankelijkheid

Bij het ontwikkelen van deze website worden de wensen en eisen voor een toegankelijke website direct ingebouwd. Het bouwteam van het Algoritmeregister is getraind in digitale toegankelijkheid. Een onafhankelijke toegankelijkheidsexpert levert regelmatig advies.

Deze website voldoet aan WCAG 2.1 niveau AA, de Web Content Accesibility Guidelines.

Dit betekent dat de website gebruikt kan worden door iedereen, inclusief mensen met een functiebeperking.

Voor meer informatie:

", + "pageTitle": "

Toegankelijkheid

" + }, + "Footer: Vragen": { + "content": "

Veelgestelde vragen

1. Wat is het Algoritmeregister?

Op het Algoritmeregister staat informatie over algoritmes die de overheid gebruikt. Zo is deze informatie vindbaar en beschikbaar voor burgers, hun belangenbehartigers, de media en toezichthouders.

2. Wat is het doel van deze website?

Het doel is informatie over algoritmes voor iedereen centraal vindbaar te laten zijn. Op die manier kan iedereen zien in welke impactvolle processen algoritmes gebruikt worden. De informatie geeft de mogelijkheid om toezicht te houden op algoritmes. Zo kan gekeken worden naar discriminatie en onrechtmatigheid, maar ook de wenselijkheid. Wanneer mensen het niet eens zijn met het gebruik van algoritmes, geeft het Algoritmeregister aan waar bezwaar gemaakt kan worden.

3. Wat zijn algoritmes?

Een algoritme is een set van regels en instructies die een computer uitvoert. Algoritmes helpen bijvoorbeeld om problemen te analyseren maar ook om beslissingen te nemen. Zo kan de overheid grote hoeveelheden gegevens (data) combineren en analyseren (bron: Algemene Rekenkamer).

Wil je meer weten over algoritmes? Bekijk de informatie op Mediawijsheid\"Link of bekijk de (gratis) Nationale AI-cursus\"Link.

4. Ik heb een vraag over een algoritme op deze site, waar kan ik deze stellen?

Het kan natuurlijk ook dat je na het lezen van de registratie van een algoritme vragen hebt over een specifiek algoritme. Die kun je stellen aan de ‘eigenaar’ van het algoritme. De contactgegevens vind je in de beschrijving van het algoritme. Alle overige vragen kun je sturen naar: algoritmeregister@minbzk.nl\"Link.

5. Staan alle algoritmes van de overheid op deze website?

Op dit moment stelt een kopgroep van overheidsorganisaties hun algoritmes beschikbaar via deze website. In 2023 publiceren nog meer overheidsorganisaties in het Algoritmeregister. Voorlopig gaat het aantal algoritmes op deze website dus nog groeien.

In de toekomst wordt het wettelijk verplicht algoritmes publiekelijk beschikbaar te maken. Daardoor komen de meeste relevante algoritmes in het Algoritmeregister. Hierop zullen gerechtvaardigde uitzonderingen komen. Denk aan opsporing, rechtshandhaving, defensie of inlichtingenverzameling. De exacte kaders worden nog uitgewerkt.

6. Bij sommige algoritmes staat meer informatie dan bij andere algoritmes?

Momenteel gebeurt het vullen van het Algoritmeregister vrijwillig door overheidsorganisaties. Niet elke organisatie heeft ervoor gekozen alle informatie te publiceren. Uiteindelijk wordt er wettelijk vastgelegd welke informatie verplicht aangeleverd moet worden, en welke informatie optioneel is.

7. Wie werken er aan het Algoritmeregister?

De ontwikkeling van het Algoritmeregister is begonnen met het consortium Publieke controle op algoritmes. Daarin werkten overheidsorganisaties aan beleidsinstrumenten voor een verantwoorde inzet van algoritmes. Een van de resultaten is onderzoek naar het Algoritmeregister. Het ministerie van Binnenlandse Zaken en Koninkrijksrelaties heeft voortgebouwd op deze opgedane kennis om tot dit Algoritmeregister te komen. Voor het ontwikkelen van de website werkt het ministerie samen met ICTU. In het Algoritmeregister is te zien welke organisaties op dit moment algoritmes aangeleverd hebben voor het Algoritmeregister. Kijk daarvoor onder het kopje Algoritmes, hier staan alle organisaties die nu één of meerdere algoritmes hebben aangeleverd.

8. Hoe verhouden de algoritmeregisters van overheidsorganisaties zich tot deze website?

Het Algoritmeregister is de centrale vindplek voor alle algoritmes van de overheid. Sommige overheidsorganisaties hebben daarnaast ook een eigen algoritmeregister. Organisaties hebben daar de mogelijkheid om meer informatie te bieden of op andere wijze. In de huidige versie is de informatie handmatig overgenomen. In 2023 wordt gewerkt aan de mogelijkheid van automatische uitwisseling.

", + "pageTitle": "

Veelgestelde vragen

" + } + }, + "en": { + "Footer: Contact": { + "content": "

Contact us

This site is under development. Do you have questions about the Algorithm Register? Or are you a (government) professional and do you or your organisation want to participate in the further development of the Algorithm Register? Find more information at About this website and Frequently asked questions.

If you have further questions, then please contact: algoritmeregister@minbzk.nl.

", + "pageTitle": "

Contact us

" + }, + "Footer: Over": { + "content": "

About the Algorithm Register

The government increasingly works digitally and uses more and more algorithms when doing so. Since digitalisation does not always work well, the government wants to work towards transparent and responsible use of these algorithms. Therefore, the government is making information about the algorithms used by the government available to everyone: citizens, their representatives, the media and supervisors.

Open development

The Algorithm Register is under development. The information often changes. New algorithms are added, and algorithms are updated. The Ministry of the Interior and Kingdom Relations will continue to build the Algorithm Register. The team working on the register is using an open development style, through open source software. Anyone can view the team’s progress on the GitHub of the Ministry of the Interior and Kingdom Relations\"Link. This open development style means that the content will change over time, for example:

  • Algorithms are added, or algorithms are removed
  • The standard (fields of information) is changed and/or expanded
  • The published description of algorithms is changed and/or expanded.

Open participation

A number of government organisations have already published algorithms in the Algorithm Register. The aim is for all government organisations with relevant algorithms to publish their algorithms. Eventually, registration will also become a legal requirement.

Government organisations can provide algorithms for publication in the Algorithm Register.

There are several areas that you can participate by giving:

  • Feedback on the 'standard'
  • Feedback on the published description
  • Feedback on the website’s user experience (UX)
  • Feedback on the code of this website.

Would you like to participate? Do you have feedback on one of these topics? Please contact: algoritmeregister@minbzk.nl.

Open source software

The Algorithm Register is developed with open source software (follow us on Github\"Link). This website is being developed to serve as many people as possible.

Algorithm policy

The Algorithm Register is one of the actions made on behalf of responsible use of algorithms within the government. The government also puts effort into the supervision of algorithms. Also there is an implementation framework. Also, the government is making an effort for quality requirements for artificial intelligence in the European Union. You can find more information on this in the werkagenda Waardegedreven Digitaliseren\"Link.

", + "pageTitle": "

About the Algorithm Register

" + }, + "Footer: Privacyverklaring": { + "content": "

Privacy

This website uses analytical cookies only. Cookies are small text files that websites store on your computer. This makes it possible to recognize your computer during your visit. This information helps the development team to improve the site. Analytical cookies answer the following questions:

  • Is this a new visitor or has the visitor visited the site before
  • Which pages were consulted during the visit
  • Which site was the visitor directed from
  • Did the visitor immediately leave the site ('bouncing').

The cookies are not used to create a profile or to follow you further. This website does not place third-party cookies.

Data received via email

Personal information that becomes known to the Algorithm Register by email is treated confidentially by the team. Such personal data will only be kept by the team while they work on a response to your message. Once the question is answered or if no question is asked, the team will only record the question itself and the answer to that question. Upon request, the question and answer can also be deleted.

", + "pageTitle": "

Privacy

" + }, + "Footer: Toegankelijkheid": { + "content": "

Accessibility

During the development of this website, anything deemed beneficial and any requirements to make it accessible are immediately incorporated. The development team has been trained in digital accessibility. An independent accessibility expert regularly provides advise.

This website complies with WCAG 2.1 level AA, the Web Content Accessibility Guidelines.

This means that the website can be used by anyone including people with a disability.

For more information see:

", + "pageTitle": "

Accessibility

" + }, + "Footer: Vragen": { + "content": "

Frequently asked questions

1. What is the Algorithm Register?

This website provides information about the algorithms used by the government. This makes the information visible, traceable and accessible to citizens and their representatives, the media and supervisors.

2. What is the aim of this website?

The aim is to make all information about algorithms centrally accessible for everyone. That allows everyone to see in which impactful processes these algorithms are used. The information on this website provides the ability to oversee algorithms. For example, discrimination or unlawfulness can be exposed, and whether the algorithm provides desirable outcomes can be checked. When someone does not agree with the use of algorithms, the Algorithm Register indicates how objections can be made.

3. What are algorithms?

An algorithm is a set of rules and instructions executed by a computer. Algorithms help, for example, to analyse problems, but also to make decisions. This allows the government to combine and analyse large amounts of data (source: Algemene Rekenkamer).

Do you want to know more about algorithms? Find more information on Mediawijsheid\"Link or take the (free) National AI-course\"Link.

4. I have questions about an algorithm on this site, who do I contact?

If you have a question about a specific algorithm, please contact the ‘owner’ of the algorithm. Contact details can be found in the description of the algorithm.

For other questions please email: algoritmeregister@minbzk.nl.

5. Are all algorithms used by the government available on this website?

A leading group of government organisations is currently making their algorithms available via this website. In 2023, even more government organisations will publish their algorithms in the Algorithm Register. For the time being, the number of algorithms on this website will continue to grow.

In the future, it will become a legal requirement to make algorithms publicly available. As a result, most relevant algorithms will become available in the Algorithm Register. There will be justified exceptions to this. For example, certain algorithms used for investigation, law enforcement, defense or intelligence gathering. The exact framework is still being finalized.

6. Why do some algorithms contain more information than others?

Currently, the Algorithm Register is completed voluntarily by government organisations. Not every organisation has chosen to publish all information. Ultimately, it will be legally defined which information is mandatory and which information is optional.

7. Who develops and maintains the Algorithm Register?

The development of the Algorithm Register was started by the Public Control of Algorithms Consortium. In it, government organisations worked on policy instruments for the responsible use of algorithms. One of the outcomes of that work was research into the creation of a register of algorithms. The Ministry of the Interior and Kingdom Relations has built on knowledge gained from this research to create this Algorithm Register. The ministry is working with ICTU to develop this website. All organisations that have currently supplied one or more algorithms to the Algorithm Register can be found under the heading ‘Algorithms’.

8. How do algorithm registers of individual government organisations relate to this website?

The Algorithm Register is the central location for all government algorithms. Some government organisations also have their own algorithm register. This gives organisations the opportunity to provide more information or to provide it in a different way. In the current version of this website, information was entered manually. In 2023, the possibility of an automatic upload will be investigated.

", + "pageTitle": "

Frequently asked questions

" + } + } +} \ No newline at end of file diff --git a/backend/app/database/database.py b/backend/app/database/database.py index 40a4bae4..bc3e892e 100644 --- a/backend/app/database/database.py +++ b/backend/app/database/database.py @@ -2,10 +2,19 @@ from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker from common.database_url import get_database_url +from app.config.settings import Settings SQLALCHEMY_DATABASE_URL = get_database_url() -engine = create_engine(SQLALCHEMY_DATABASE_URL) + +env_settings = Settings() + +engine = create_engine( + SQLALCHEMY_DATABASE_URL, + echo=env_settings.enable_debug, + max_overflow=40, + pool_timeout=10, +) SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) Base = declarative_base() diff --git a/backend/app/etl/config/excel_column_mapping.py b/backend/app/etl/config/excel_column_mapping.py index d87319ff..6d6036d9 100644 --- a/backend/app/etl/config/excel_column_mapping.py +++ b/backend/app/etl/config/excel_column_mapping.py @@ -29,8 +29,8 @@ "Data Protection Impact Assessment (DPIA)": "dpia", "Omschrijving van de DPIA": "dpia_description", "Bezwaarprocedure": "objection_procedure", - "Schema": "schema", - "UUID": "id", + "Schema": "standard_version", + "UUID": "uuid", "URL van de bronregistratie": "url", "E-mailadres van de contactpersoon": "contact_email", "Geografisch gebied": "area", diff --git a/backend/app/etl/config/main.py b/backend/app/etl/config/main.py index adff6b69..1b86e8da 100644 --- a/backend/app/etl/config/main.py +++ b/backend/app/etl/config/main.py @@ -1,14 +1,3 @@ -import app.models - -models = { - "inzet": app.models.Inzet, - "algoritme": app.models.Algoritme, - "juridisch": app.models.Juridisch, - "metadata_algorithm": app.models.Metadata, - "toepassing": app.models.Toepassing, - "toezicht": app.models.Toezicht, -} - column_grouping = { "inzet": [ "goal", diff --git a/backend/app/etl/data/Masterlijst_Algoritmeregister.xlsx b/backend/app/etl/data/Masterlijst_Algoritmeregister.xlsx index f6789814ed9be99739ceb99b833c0cd984c4a4b5..efa568e7f245e27665c3d9f7b04916a8c9e10ec1 100644 GIT binary patch delta 173960 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

    T&#JbZ8ufkeyl;&LY0h`zcn z-6Cr~22W3f72~G{((cBgqhW6}n&7-Ev46`+VUW&pSA;HsPpE}jl$aprQ5}Kx{!u1S zY{W#99zOfZo!9S05BASXUHW$0-{F%;%M>Jrnx~?r$YQ0GOdoU&;^r$Q`f?_W;&!3P zvBH<|Smo=zP}H+Y)+GcLN&QN85R^Y6Xf9YSiB!Rxlox(F&+ZxPudWhndJT~?cYkq> z=*cUKQ6bH@+g1sPY~|Lc54Xu2TpaztLqiP$M5N5x1;MF@DMAxbS@^PoucE|HR7loW zBsLOAB3W=8<;7d4jSnsk!TVmkzx;qlGOL6)`3csMF`+AC!6GJ)g(^EEX{5)a;x1qOga?@pT|F6^ajth-E5|6hXn&@|{E|-C zC4PALj%rh|=E=0oxKKPw-D+&Gk)_j7PZMP*c`=t_Tl7z+xXfrDFWF~dI`RkHly!Ko zx)b9dEMKUm*yq9e4(6-Qd_R+^LblXE$nvJrwfre6)V~S8apV7)km4feFTZ=}^XJ*q zFIP^xI5-og?m%O2n&AB2cz*B zlv{BT$!O&Ru?D8fJbd=K+Kxpl0t}m)Q77F+dEUTuTXBIGOubyb`@V9YB1tmEaike4 zSTvQy-~+bkArlO00DTtWB=fveitIhZB|t zVI0dh)E}Few_d3oYs1@22Ixifvy}x)VGEtuSDaoiIJwkxHs;dFxZn&|0>4SlX#0yz zwe{H-{J|mM<@VVZ{C`nAD&}Kh)}Ktt|D7LYE566@l1Ea511Q=-v>%*r0ealY7`dJ} zfLrEo($QdvRqwup&H%!##;2Tq0{j|HKX3 zr&%Sp`Lx=eYQfz0>h1Hlxc<_l9m2tahUy%f5fIX4av=8Yglg!@THr$Lsh_#d7c#w} zJ;Q{MAk|)BN?!=$Syb))_Mv1D&(0MAg!I%Ik??!#RWmDFd?Y{&1c!bkVT%&*?pl0! z(%z7^V3tym6MulOD<5_j%@3-qoWxywUMsYt&>957uzNpB7{q(G9P!c0uWWviK)OC~ zMghWCUx;~VU%x-$)CAN7xC%(wdv%Vs{q!;)J5iM1kL`c~gXr9g_r-;k9+h?*3rG zv`o#%abv=Z_g-rX6ptZdm08nFd#E(2)HWnuFqVT>hw$7bCwyqzx{%vBN!2v*@#zb z0)IDfKR=PCzNRCZPO9#op{21$6tkv0)0__ANXs!>mH8`#n-BdDlS}b_!R(4qWnvVt zMY(Pj=`uPVm1u~<%hj$Oq~M2-3w6Q!j5VAe(JVn3YGm3nmW_=SenW7lj5_`-)#`T4 znTN?ALbIxxq)qMr#R2^fOz0A&mA92wtADn~UPvs8@&)aHv7JCBRCB=Yh#o%rjt)IE z=ID}hVs$n5BaQl}c+)8(v6qk~AmtimEW}jFA=v&)H1|ny<`bU6&odBtu|>U`-k^?* zur$$ADtoj^|oe^2rnhhH|AeCmDeDH@}EB zyAE1OouXi+F+V#E8fF`o&6k`Hqkl&&tGukyUz=ieC%WuKzjJ3YJnz0z$WEorHIe{lVBzv>FwUz(MW6DJ4nVt@BHlH|j3 zqt?nXq+PZGkKdf$7#WL9o*XGvugKN#tSGVPL}%*DvaEW6rKdokyaKNTyhLOvvkeZ* zFP?qz{PDfb7Y`n5;eYYqtH(nS9G{T+z+SM(2aUWCKIAK^nopn(zM2n94l4mvgnTOS zk){L*ueC0)0ASW8Lx~JIdw+A1_~JC<`=olPn;5$gRe?{&Lkvyyj!q3T#txh+W(Ybd z=Xc`ctfrzI2g|`dSLavz4U8UKL~iL!*1Pjob9}3%tzFbAlC?zi3^84)UtcwYj*{4d z``edihgWaqW~W&WJyWGw@(1++dbd6Jdi#qg_I-DcEsL{9SiKzfNPqO*>WRgldK=xF z+(-QU>J6^S^|>;$3;Nvn;g*QLdJ~k&D=>&lb*D^0*63pt*+q&L_Rjbi$H_LZ+4-xZ z>yw?iEnB;~z)TXwOby>w$_{;sgX^6dlAWvLJ&f|=Qk96cCf0T^>N>-2ZRp$ zk2ep#`Q+Z_*;D?-b$<`9FO>-#q=~86S`i==S)5PnFE3 z6BZo}zb1`$DGZCx(G23L*)EU<(__%vVxtld0%HlOCi?SJWcQvQJps7HOrec5m@k9dLt26AV)3M6pL{^1A;8I+5w$rU^S8E)6sj0-$H zXD$SOhSu#TX_333&ptHp;oYzf@*0KI#s?bR^xB_-Tw=uGcu zFXa9O1=9+s>WW#W2fP*4@VC_@;O?CgxS!jue}BR&3T$J4C|VPzp=^I|k1}z)BsE)k z{1cY1Z1(X13sr7ScP`|@>3f!q$+Z9AdZY*6IC06*Ho(ECWhzR}q2xjwtAvH%n##xs zQUqZyGedS#XRm?^F9R!44;2Bf<{^#-2{_K9RQBmg+r6gBW=4oSb8Z`OPgWKd>E#Vk`tSsKrn&p5TC> zQooVlHB^fxcRS>$7==K}D95%gmTDbjXq*N&f{W0)cn}^|8ybNzs(#Xor=bjwbi`Uh zq-jM_GI1u;6IjRzR2-EYo|60FiW@0CFMr?OE^pjGOUtEYGMy3u=V2)`QXg(?Y!@ep z7t>`#=hKGdAGy<7TDsoK)A`e&p_g=7-D^`k_I51PQhtPWJ5yiyI z2-R-qaFQ+Z3B0on*^T4j!&rJQiujy4$n*74(2lOo_Fjz>z1UCz;=3uH-qVXMjw z$O%dO!AyvF_F%ZhqB^EndlDWQP0sQTx$_qBWyyy{=0DtzFH4%&WQH4LU}a;NmGJRw z>{0_D6Rixl1=capuHCBkuPd?y5`PCSk(%s}{rCq`Wm;j+bbd)k9JigF1b*=e=a?7k{YUffe6Av%HBA}CIQsRoi%)y{F!M)b@I%#OJH7a$BT1Qa)T3bZWVdxw^W zO$sJ6d&m^vU|Nq2(qX)b`DhX-)kDT%&+erV$;W%#)an6w;M?c&*>}ZgV;iE$a9j4S z#ag_fo2^HG3`;9YkJZ9g8VG7vnM1Q9 z*i@+mUeSfdQl`SXu5o8KpV72jy z*XoZf&XGb2m#Ko6FE6{BX~cw}4q}X=7pD~00^HE>iFv6nnBA$fqJPvGbW!*H%=Yx! z`Ydaiw=x#;fMUvT66bw(aCvNfC06u8A)knZB{@w-q_c33xRmoH{fjj+9r zo&M!ytn*2aL6LSQbU6#;0+`LWz7phEOFDDW6ZE%__?|nlj&1)=AVjjSLrT#uRwLS& zHRgP7jRx9xR(e-j4E!c^N7j|2)%E3=HTf0mP)rv02K#I zZpyqfLcyTn{s#LtNJEQJp)7ci(8={QJi=lgrTDs{`M_7ErI$;3@@#ZdBsHV@QL0*w zXD`_#Ip{%Jkt1c!YN)!aF@h!K76hlGL*)hR^~B_grxf+o7JpW67^J^Al?&(2ynKFa zrv4TKNyqq?m*>|K9j+UX!r`W#Gwj#EO}$pzTFcaMo?>H$|P0rC5!I7)9wyw5D_{iO0+=-IV=z|fDh6Xt_O|UQmK6@lc%hLZeAqEo&_(t zLAyuSZ+|8H5&VMa^i{pUGwzIJ^X|*s^ul!%8)+fA%`o_wZsQ0C_?YVDpsz{`(PyHT zV3PKI(&L}oN}L|N)ONNwT9f-sfrIR2yrrGd*AicEL!BN^K5Y2|!C#bokZ!*6U^GYJ z(IZZ8jcNw1Eic~1JcW4$$3i}*@=Dqwqeg~0{(s?6Ibzdb3@Sb8Br?vuS!A0I=aXvz zis@qyh+}wbBqne*DMws6V-2_T@i*_^3P_o5#-J2yeYM*snQP9m>-M@NcpmJYW<8fi zLsQ=7f**L5C0QjF)ML?&gse)idcqi-5TgX=U0m-etk9HYX$qqN$!W&p3lDQ2MIX+7 zbAMNp&te?5J&ghfv;zRCQbK}wXit?-nK0<4#NW%_%YvkHJJw#ramt^#vFQbwDMyiu zgxKdKHysT)k|+_>K+?kd0(QD|Ya3RLTr~sIZvB^h8CiDk3RUCDGCe#{&7_GGe(=K~`>%B92l<(sS9W<=YK za~kHd`kM0Nm#q8gk~O__$okf0Zi(9A(zpbZ*BBH-BGQ|ZZ?Y=TYohmw)%LI}lR54P z2~*H0*$LhZ^YD&5T2djCaiW9#;D@X9A9x;h`?heVbBZlg9ozo3V=0u)mdA^FH-C+B zRJtkK&3SJnrp-dCEspb@#Dyfj63bOUruQr|BU?v>d(i{wGAoa7ZE;5J=T`mLUkvNR z_RjJk0X#!WO#4s@FuiB2*2Aipv^y_Urcm}xob1g5mj(7@<*Y4F|>>N#@7 zP5naLl;H!pRzo!WL)l*b#p~S^r0ZTkVk^Bt`S-9r=X;6a*LKPP8={t{H-9rI@-{Nw z=$=Ar{;9>YujCpcUe&y{$flDskoiUUkvqXxJpniaXGR2CYK;0I+zmcBl4K$2h?;MY~osahi=KT^- z#E$DcOo8Q}QEJY1BXN|BrlZQ~rk}h1CRezIXKhf;P8I);1 z@M0%x-P_H}*~QBv(}q*5=1Lmxv1a!TuF)$CQ7U_5>0G7TgW~|f5}|o$6G>zR6OO+K z5|yW-_mP^EXKf{dilJFCO%=XIfYUOJmIHm`7NHzFgsDE{Qi-x#rPWu?ZtrX`wtVx& zIt_mDrN?%YAM7+ayR**o=h4D%)sYF|Vp_P{(7$&?9rr zO*)jVUa#ZTua!BI|4-ZLLg)m5g((Ma^=6IYC`j>SJpS2O%0So?};IR{-qvX(E?=lDz$Nn7IE z1Ax6em0MYJa5)ur=vbHEndKk#9leSurD3613#x(((u7Vd@t<@oEj@FaXiQyr6ADz7 zJK^+UhI*UGMwqu2i+`<4jeNXef9jlf$8Bfo-M1^xf`3FG^eE}&4_3B9hj<5ujrHX8 zlwNXB-Ko`G6wMIR(4<52B$`g~&c30U=MAy-7P5nAP zB>h|(6)q&OEMxyt#xOZ7W~$_&r6qQ9wwYe4`2|SnZ)CoykdT=G5Q>vEdO`BPLz%lzCpyFo;4ncDnk=O!s*F2?jj}d#((_t;M*qx7!M#MYMIMPtZYC4g#psA zocI+5k=6XB8K!v0FrmW=*UBs9Cu7>$weUrJZtQRN+>!&1FQsVg^RQx$#utVBc$JSU zTL|@Hck_UBA&=bY&)=x6(gh_M2aJfu{u?s>7FRtPCbgv;K`YUUSJbDahrMYwMCW^W zw||i{Eo{MZj4Hp<5JlyaRX@^g&nrj5*XBDil`(Vb3Gf1dS^F9(THS4KP^M5a!=TZN zuGHod>0yZnmHs3MlgN&iqO@=DxWrx+H8-Fj-6&RP;pbI8pqKUfP{3=s#}*l$k2a@K z@+yfb`D$AwJ-zIiv-YjZz+07S_sOPi+R7R?#%l0A9E)mCNIKBF{Ar4GDwB*R%;S>C0e zjg<+uq@O*1ijjqR}aZ5&cInAEspvfk@53s0xp!f`5A2 zQ(7gDzWVGzc8cgIS^^%e|4!`A1{0obUbCXH6O=2NYs0z^S(e*paSRHbsTY&e?<${_ z{*W3|a5Y?EH|#8!RoOo#ft{xcI$JfjV0ICfr(}UBQKx=8>0t(~Lzu%NYQqt$prC=Y znC?Zcl$WRy1P4{v*2}dX4tut*@qfSUnR*KUZ~9PO%m|Att>5H^_%+P%q#c*b-bjR~ z+`MvM(P=66>`=wV+4_ch#Cfb(*?28CCuoiTu*MS;#^u$o@-$sIgk%kD37tLflJ%WB zsohp0C@Uy68zY4ej67Ie^(gH6B^y|)dOfftetT7RHb)@R1I zOSt{c13XztxF*g*jDV_`unx{vx$}BuhoRaD9Ok4Db*`wvM#PN~${#CwKRmlS(?WlU zpBYrAD00Vs4K4FpGbyQ*(X--vXY{iLPo6=J3a6c*8ivK0tGX5^Q5XtZJt$v}e#wOU z_bpe_ITeyIjE;6pdD26ojejc`4|kVwXikws)`088?<$jlq*@LNi7t|@E(Cdxdvo}M zo(W%mj}nt929J+|WTjjip}m^GNK$g_48)1(hm#A3LI22L3d^K*X^ zNPq>ARKtt5QB|4uo_p>&aUyo?*wMjmf$mC8fEVFZv0U6LInXK9NFq!tqXY7|)Fq1o zGgiJ4AWzBW_PCv%57A$LRzi#{UY3VQ;JCYx$h-xKG&6a%XS|S#D2=y z$6@QoCXuLtVK%M2^?P$r~)!jnk2@4el0H`^w#A%7K?#p#b(rmRM`KtAFAk7>Jk?$l#Jldnli?u@@~u-+ls9Bs z)dkcIc!QAb=tz6;C2TqKmy_74zI&oG=Z`(zQ!XrLdO1C_#%s_tmFFJQwiLlI`Bj`F z-E$on9)DexyGX8#wnydPSM`lKG+xGj=o2;dm#(_Ln7Ox3@U0# z?BnjIcRvz|-_c@ATrT!FrMG}V*AxYxt%VCAPmC`=gZC)T4f|aPe&v3OqPzR(Qi;e` zt26xa;+sUM`-YS=*=EJn_KGt0O&Oui*~sH1GJm{ZP*gN7yg9NYqD`Q^_rLsKC6jS` z!jmdd7zRZgBX}g|OU|C>OUoQYf}uV{epn8nEn0Y9d|J{AoJ|B5!V6`cj9K|?MQur= z$`q*TKyf(>qT%p~?6^K+5^<*DOJ~AYAcju3b-W##@q#{)F4jSsHrY`LW>HTOy{$S{ zD}Un&mar4>5siVp-0<+*H;UX5Z#7F7votM`XC=&CL?0#!5mryJ{Bkw_!S|IJH7&JXSqGH-DBQhZc?1?J1{oR;plHEIivNc6pdWwjW1l z(#Sn94^yR^(2`O)r;a#;^&L@0!{7kl>TE;|INUVjw2$1O(pod(8V^|<2LaI%BQ3SL z%q8Kt@a=F<@m5VBsGhl#v^9gxH!B}I()X{)cILh+OnU1v_bl+gqQ~4Z{+i>gntwR6 zDT@bHEWd0=!9T)(4!(*#_gGvQkaz-Cy}*fMm5C~Qp8y6HZAP@MV#xaKj}()N02cRwYpFb^U@JIj*q{r1z3uZm|BU1j#*0zzrq>VcQd)(A-Fw~3V{+kM0NrHtq zZX5+ou>76Ksm=SWo}*7(?SEn*Q*-np=Q6YOKl0^q4EYi zgSl`Fn6lFBF+@46AwxMalHXZUc_{HK?r8KUqc*+qXt>>~I1 zvwBZQGWw1Byp-zepCHGmKGcw0c6CG}tTu*RM;m%KRR-ZL{pfBIYm#U6maU_53zSo6 zToOHTD2ds3a=bAkuYZ`W(>8QDJjm=58km_S-}w~@JPJU1YJU^HQBeajzF7nsRIQ|w zD)I>=CRkoXVM7^J*Q=0Xku$~(3JrDiJ*$J1Z|Zuga%tb}je3@MWlZK{eT7Mtkd~|Sn8N4i~HCxIe z3tKh55|92VDw56?_v9>y(J)6TcKoqCEPP#u5t{wr` zPrNT*pWrK_Ie%V7fA>L=yXZ2iC5d$&g^63!a(_^wG8(S39Ypggxwgxddb$+(Z2i*mw`>DkEj zX&?|8i z{_I$UfPb#8qQu7R6r$@W9#`esV5YwO^vlJ2@BhQCMn2cl7V|CYp?s^;<>hliVB~tt zl+}jpZdsXCjw_POyu<+w`G%ryKzkFL3RPSSay(BJ{KVr(l!~0!cOQ52sx0j zY{thbfl2ctW-vaS%nkcl>fa&`QGuitu4fM%+kZ!uN2o2YIe_FF=Xa*D_e$}wF z8h@#w!kQT}k4N(7D)%wH#s2#Xi|#u+QCrF+p?8?d_bzcKfDYl)^2ekflJX>fH7<}h zgE2sB6|$&|jm-c?Wg-X5Cm8Cc>}qmdbL#~k*4~T|W3VE<>`&%2A@8KRl>?c94qG_c z0QLZLzR1z5m4h%8oS}xqQ0IvMVAilm5P#Ro`|Ddml~fJB1`>^Hzai}!fwLNkansby z5qxh5tQ;l}ZQLz(b|lQpi(&lB0`X;^lk8li;eSExw?qb0iRiP{sm{>9{AUm;D=RvZ z!jYQYI(b!+I3z-H&YHJVPK$10<+0Ug&J2ao7>t7ZMe^RA+0(1y_9nUnx3_2Q4u8z0 zN=V_TYH4@;7WtG-_d2AZ3qWpny>idXv9$EgTC>QwIvugdR3d8aTFt(q5v~Y8#;|~e9l;$`) zSRIp1xID?LDrOLQXhI5LqlH!<+kfy#IsU%0pa(?RMHTgME?5ZvL}p2^LF3AbnUedj zd?b-^t;*WH&mE%-zF8Vn7wFS0DOGoJxQMyO<3UD1#Q)%l=?7g2fzKIj*IFpJ3f7+p zfdi%B@@CVs;2wE9W#Y?qZGTwI(vww1vsNp!l7fYvFdaXI1E@Deb_fXvEq`~-Tq{U8 zq*XT^e?mMZ_I<3>QBdUluq0tIBsv~mp1KXV&b$sBRP0oM~z@L4QdD)i3ZFifVBjr#{zxUg#8U%Y!N}bB-g8mpDK&5Bijq znght2eYkqE{`KeI&`7DSuyP6Q@=if%w+&oeWHk#ira@YNs5oIs5*!Ztir_u9Zsb>zHok8UjTFu)meM&Rh4oQ3DZ|1RskI1 zX|!vJsG_w3zC%-V{5AjP?9r-altd5LQC4by%(<4FZY<7kSUY8|3 zU8@}DKmoA_x=uyol(wA!H4IVAuR7B;REcU26 zE{!$+7WZE04jYM zfg+i@UfEr>>Pyz_T)B#g1oCIkDDH@rJe|a3h{<)v8g|_q!5`~n$|~mvz_^}P{{G~y zMwMT1znww(nX!*%V5X|{6{slV>Fw$yCogDn8g^8-?paxCulka{6j7>dj}Nq1)0Sb9 z2RN8%aetl6W5ii=3Ko-BvhzK-W9v_@9q>JF$_!N+3|E?1*qo?YCGHyCmLl@>ydPAn zEm#>xf?kmrLT})A7oYt3{E;RwuPk(-drb=6qUXoCe4*@XIdl5o?O)>bJ~@=h5bgO} z7a_HctP=0Sum~Fxw3$1NW}kQbgq0!JmYB6ZPJhUENg%A&;PxqsqD~?&Ms}*I87w~9heQnWgUsmLnGtHkS_4IO8L9lA*=DD^nW>Q9 z3x7%8DsG`|H{PeTLXjcrFp0sjuw%5j-O|0f0lFjS9`k|kCyXijBlNa$cPFFBtJLu8 z&ZxpO!YY}Wry!Wda$JF+UW&$e6e#P@S!pa?OELD1S}MarGozJ41b&skCJ7g8$?W5q>`-v@|;ie1bDAcmpV8^ zC9b6$xPTK1++17X`L)vJMTZC2;Iw+7!&bBuH45wJiCVGSx~iRC>&Y4#EHp7*?r#EN z$p!Wzdu+t922d{U$X@jY>F*DrFTuF~*JAH?^f#f_7MEP^zEq*Q(?|iz;5f4TSAR~V zxnk+U5D6+uBe`q|3!6k0{(L#t0-T>oAQk7cJGj~rXU|{3`d|pjskaB0uYSfl)Kh#W zF@daCU5;Em1&;$fs|Q$UGq7~jINi`0&!cx0!qz=B&c*nz=+eX&`-=Y=-#rE%5fK+H zVWzx)fog}G_CmkVM^vnk8$=;n+kYwM5Lmv zqGOX%+AOuUHB#mbhJqatDvl+-Bb<`|mgmIgJcq`V!cbT)cRL;o(a|C}>rqHl)>9P;Xf?nvO{)JuqEciPg3_E&fya_EmpUtkMPpo> zaz*G}rQ6noxUV8G-%wdzdVdZ;iD^nqGdNET7p$>iRC050xep2IB*d5%Ei6yl&r?(X z`RUoE+HVh=X!$|Pw#}Yvq9#nkGxNRVUv$>DG+gsC7JOc!_>o` z>)0jPq_dKw4`~W_H|L8bJs-EuZGjyqFKvBFO-jgotK}LMucNyK9mVF;PcpWnlfYfXm@WfDvfl)R#?_6hAV|Cmdt7(KpmUS)$eg6PI zK)}CZ4GrK5n&ef^28MdHaGT_%cpe6Ar;&E!2M2Q%|Di2j23t1>J56Qs@P>j4V5KiN z*|Q(RxppAkKt#C-5p;hEpI3B7Wn(4dE<0}4#7f7~(DIAM2fBJriJW_B_vobYQXT6Y z=Pm3IR1x-c?_`Mm%w@y7Tf1IkIZ#7s{aooc*(9FyYw@pi6AO5_G}R^2{&SWmnnJW}iiiygw8YCMP{RugF|$qwf9TfhK=#y018Rt`5oB6?V9? zJE}+}0?o!3iX&-p|BnwpH;_-y9yNP(;Ayxl&QS?|!b=^WK;LUV257^y;xkr`Pw9^! zBH&9dZvW;zgfbmz25(47Jr=l}xJeS0&V`HH@85omM0mZ_yNhp8HT&qR2ihecNemq? zSuR)Sz}F*Se8qo%g}}*hzV}EMdr`!gp}D8MKH>YfKUwTGA9xhShx?}<1U1)|shrt7 z$`28mIlA-$DsaIM6rVXu%ks9YSwSIEsvB}j5xx?LA_a?yuPGUEydNr1$dnDgg|2Z$Uph8ck235J8jMtFAw4*u;j`ZDOyVf^xc9a#sB z1MW~(5vQe7ibzB@*YwZ#-7T-`6awP zn$u@7uzh-|j9Qs7Ny0kelV>$_VHSG_A|^8S(!=53UrFFGw0sIWd~@W@r03Q7is`X?B=1Km-T7(_9!zs z!`2P9Ot^=8iqS5< zv)>bx0hOij`Hk3aFR1!GZH}`Nqwhs_aDIP?7|2t4hcS40s_Z+@Pmm-8d1-6E0LE0| zgcoV_tge=R%*G7(Tw!EtJVvlre}Zc1I4k#1s+Q1P{t$j}^R zFgJciQ4U+O0SGYCcJ)wMp?DUJc5*R)==b{JiYqd~oP z3j+F>r>GH_e_h?l6m1wvkDq)RgvlbdHMCV|Vsmtf6rpz0w^T+K@rx|c#pZwM@)+hF zm#mFXCtGvqhY5WZszQ+%9K2eAe1A=zX|t9=+rPLoWFa##2T17XmptnJ3WH;2sO5$A z+ZXHz6^o{ak?jd>6#d%bnO(o3TO8$al*ujwrzySolJeD;TAnxpU2^hz);~$zvfs56 zY1diI?OT)3UEXA?DpDiDNDhCz8RIPbroEGq?rzxh;!7RgnerXCho3#EiU41e)%Urf z*OdpkG@!!5HkNetNy8b{ryq$eykkuPqnzLlQTJ_=Tr}Qe|?Ou**Z851Yd8IZ~Pb1S6Es1bu$utA`gA?srwhgv=!UZXzbv8 zd=Xd03+Cp}+(XIC$w$mb=ve9Ei!#A;qn$*{A8=B9hb>ZDOX+e=D=}xj@-eSaZXDns z`MiAvPUAt%eCwf#M3sMJw6dITcyX{inf)T~?E@S)ci_>anF71Ka4MI-ZU0W*R>E2{ zuj2`=vKTglh%%cG77rB`jX&8TToeMI9=US&DUF#QFK6JVZ%Ts`hS`1dfqWOzU}Wa( zH^C{mTy4HRKp+nt%Ja>*G53dCuJe$Fq6lzMXf+wVT&Sz%YewwdTbJE%lGiZ!!Pb#ZyA3DkcyH*bFT)? zG1zCT^UG<)ur7uU1=rAm+$b+Q85w?q-{u2chbQWkwmwGE^V9vyC`s9S@Zi(Qi}`Bv zXFj-DKVB(lZg+neU;OUs$;$OMrlIFD7vxP-Z&Ay&i^t#j?0hM85fSmoSSxHEf8y(d z>x$#De`hOqyG|PaLVA_*mbScZVhBaGItC-7H|iC?`@KHS!sjI=-mV}&oxrecC5FE` zeIysIuuW*NIoVxn+&uYCa+oHI^lJ;<@yPp9Cx~X~Uc}$H_f|3zgVpLc%Zdj6Xo8w2rmV;fHSi7QPW@=c9;Gi0^4Y`K#RX%oT9`63$S0Ddr^40hNimlI9=pbC4sB8CP@8kPlPChB0zAbZC zo!SGm<8m5(*b*R6S|8^~M4u!`l(O0=M#Vc-RrY^CY^lC_LJWiDEyT53J{x09$K&2Y z%~|>pjH~hyv$)Rg*XgTt~(WwSxWf^_GnIvi^C(K z=od8%36hS4`a7qo^CE9(BwMGaRT7k1O9Of)ag?a!%3j*2YkOMF3@TMA*Lx6gAQk--9{zt>f*NwA1=|1ZKk;}^&Ehma=4n98PTU=&^Q_s^ zZ@$2d%nVJEl3k3@BDg{m-p51s`&Ee>?BM6{zJLDdM{#F!+7TwK!{k}c1<+Sm%?jTHadn80&dx;JwTK#V4Z&**7^jY z;b7!3kE{E4|A(SNAa<~LH3YgMqsXb8D4cGj)JsF-l!c_<77#Q$L|JmBL!i95U;SAM zT3zAG42&@s%V8jo*`qiI;WXAr3`@T=_`(+p@&YLX$kYYcS2RyJdF~RGqpQ=>0MCvg zp#!$i@)87%1M>Xn7?OLNRLy@da`(uxK_p}**XxzKk{dQnqJRxgYfmp3FXB=JC?dTq z9X(E3i#{gxhY8VY&$XAm4zdzMSy>(asm^<__@5F?5QKNA>H{UM5o$TaW9Rl7-H~d> zc>O$g`(U&o9)FaR&vi4VOEQ+LarOrE7!r5~r@nrXsVYEK$U_P~ik^SQh292?9?GQY z*f9I6Q?I5gS-6AIwX(?Ev{s<&Qr4O`Czk@S?Z9fLHyXFRQEZ`gk_y){!Eh}Gv9KH| zBxkC$qozJY)f3j{zOt=k#)MGag^?pIF8aQx%{HJAScihCY?+&-umYW3h`5DBbybK1 zOZZqyVJSB{e4_!_vtfUsfLNC~Tg;TIMx!z$jKvX*Fhhv^)xFWz9$d{ih_cEK=#@G9 zg5zWa;hTT5y7)7n1#A4ptN{8i-q=(1nH48F^fr!g#Wt=R31%8B*w%CyVwMF%DqD%Mn(b}47CCmb)61$@(R(PGZ>S(jatG2V z&=tBCon5nG)y!(KNS_9}7LH?5-4d7r0E)R%Ri$+*Okk zsA|WiVU>Q&kRdt7RU9uSLvpAa{Zj~r9w6F|m&Aea4i_I!Yo~@UUR**=SQLs(2!?^~ zMAl2VzOGBDRyz)>6zIQ%uUN$9Y$?OyBi@VmC zbhZ)#j4K-}$I?UfdfQ294S9{-J&5t3nRJ5v)8#ew=)4p1f|8n|yAUY9@9E%4Y3 znSQrcfmuz9d6xmCQeqaemK7vSuuA)Z<-5CI_k%o7nfy2TAXonuu58q$*mZGoDXo7j zil@TYaSs-6Up4d4iXaHtbwS5U*?o*Mc_-Ed6O$3U*A-Lfz%Y8Z`#PF<)_b}LwbbIU zd@DT6wWUulktl`t89`L$`($~qE#!&^IZa6P3rN(HRMo5tv@Pv5>sChLWy*8WWXg@& zg~>^%nc=}Lex@4cipse!(;>P=ZcKk)eV&FWiH6+m;0;VmE+F@4Tv(~NhE^Xto5fKi zrsuR)w)(*e&CMKl`248M8J86 z>YC;2KNn%(-J+SIBdhNbNg0RNycsaHZ%!TIo|^Bi9$%h6BeZ_K;a*Mb_40o?3$J^J z9O8pd=MjL>c02#@pDsS!8afPcr|$L1PhuT(nZD|*Pu9uYe7f{o1ss0Y(G7%FGs{yI z1%yXF7Uug^bYF~)!AK7pA2=zOK$9@0bp_|Ng{_w$ zJy=?C$ZpHMmOh*rbk=|E?W}or+OlYgk4Y=H^@-mf)8lW?q3&3ZIb8N}LJg*pjBLs% zh8ByY4OW{>>l&oEq)uCHAiVqyI<&f;P;KDUrIM3~$C8A+95rpVWK8tCpaxwP=q_BN}F3b>0tAqY{4rzKc`?*{MO$$fK@L z{HUrRk&P3sEibGpK9#iY%NM*SFN>)~^3Fx>lC8d6Y98Gl{kF9HohWS$Cx>QF*~29& zd$^|!OuooW|FU2_7(B5>^Bf{WBS!PU$jO*L&9bdhFk4JNbQPgo3bv0mU9S(A%Ez@` zygWvamlcQZ(=&h6Zul=$0>}9y<%D)f@o%(iD)ex-BWK4 zAbhiWye>@ANSkMqF-^~WZrX292ZPty_Xrq%(sR>F@;HX=JYB_fxOh}ccTkd7J4>jf zvLqU7vU$fHyUQBMlzE@Ze$A(QNse^xbR7pI%`L4y7iWL1CdUx(PC4sW4+OL*UsSXh zO{V5+7>72eY**W;@DjR59NhyS`^96O1Z~WNa$U{dd4IEeA%JZy^HTHlh{QWauIq3Ucu zU2hH$>WqJLtnkF%bvdF1Iq6qRyTXHGk)Z-waHBVeKFZX(ZP#A1_>`bEH;pezt>But zlHmkLW_4>29QW7D8<$cq?`7RE3h*&Qbm9H-Vf5|E>0aeH1vnb+e~zXs;cFxN{5EhWDFRGxuwI(h;V=mf^fa)9}{FM^NWEt zXv`YT_L5emn+&lNS^%gGL-gb68i!`vLI(yTjMW&3{NV-^4?v7WS!;I$LHv7e5}`9X z1ALVzanAefirH0#Q#nZuuSu0hWc?%Sb{2nNV7Z}p;!?7d-6Q+WNJ*b5DtT$~>8xfN z$)WMy+y!y^A&qPcbv7-S7q@s6&C^qo99fsXDAYOE>Q(iq&QfWjODaF#6?TU-i1WTd zb(m|pd%pi(1@l49Vq`uVKF3L<~2I+V;GG(zz@vP2C%wZ+k}-91};_20f$j*f9j zhej8~iqlLbDBO<5LL8|WlBj{C3P$lX=3Ac!s5$`>a7k^bGY6XMfn&Mq4GZH%PhaHj ztC(MM6k6|Zn^&44WdD}u9539G9i$C|_0f{2$f7n7N_K-jqQ;XEOM>rby(FBd6N~osoadNPD60Ucks$OMd8I{LMDYzJaWiJA?E8$mu!-o;bp0bJ>*l*kMnu_+evu-w zDbq`Qd5ki0Nx-`3SksBn)&(s))wx}duczetY{2I$b(a$McaBcGcb7UvvH1np#q#B? ziLLgM)o;_nW3t2f8smQpNzW`Jio?jFg2poJ&1E`3K0;~%F+dh=G^#3!s_u4zgV^Mv zrMPPzZT7|M=QTa7P|Aw%_wiP1-L!{_zgP`Tdq4GHvs7o*Q&kV$lATJ)^Hvk6MO&Y| z4ZJmLwUD`Vq0vW!S|%^iwT-e^Nh);F53fkh@pmi9H%!dW*BF0P$s!+26v^&iauUFn zM%Cc>0BRyDbG&69RCy)6=SK3GZY|(k%mkH!*s+OQkb-L8Y4y!X2tK{IINRL0d9zYj z)pkLr=MCf_!ka(_`R3Wpdx%uj4{dI~|Eu5pJ&h`Ez5o90-~8(RzyHVIjPHC!7ryoW zo4N3>-rR_PJ!60U@~jyDjC2s|-g+l-EU4efR_|myNw0Dy2YC16K7U`d2r6x> zQvzR~-1+&>e*Uw+>#4%UT)Img$I>G6Nu6SJbdZa3Ne=Bo(3OY8i4^BD=am~8d`A{M z%BF#m-0(s78z+{_C9sis1;>n*%#~v*;6B#6N;LJ)7Vm$^VRiLe;sRu)F6EKvIOK0~ zMZ=lmt2gwxce`fjnZ(cTX59WBj@^B+STDXnmgHHe#PR!7s4vB#tT8bN%;z{FSnIpWury^SY~%0&+AdT#)%vBLR>&$rpE}H;h7U}w18-pFc6wPc8NRWQI}#=IYeFoQ zBDsHqzx-!ldGFX_#M7$)ns+M-221-LyXEnBT?#*B@aI{)Hc}AwS@m$$I@RUMxFjMV zBP1*hmQM1JRj%w`zF-viQUq4R2vM5kncI%K#|1iDK^gpumgwpA+y#eV#40IJo- zxo%D3FPi(I^rY*p1KLZVrCxtDynuis=qY~{;R+UAhazW~e^naO6B^G*%`d~{=E4qr zRR^>Z2LHgmZp79xHXAOBhKGKAXw=%vw`;qG$Phe*Ly-WY({FWh_r|k(&E|KY7~mb= zvu_(js^{Q+Pu}66r$@z(%Nw1(&&fNsh6V>sl6mXA3=plD)xqLP1qs@(gi^ue6k~re ztnqXqnZ0y5y!7TX4FhUtE=|dQ{rmq8!UIxY)h_V_l;r>&`JIdNYlh$j{jm7Tt%caA zTEn^ehjV2p_xAWR(|4GiAR-JK%vlh3F^J-0$c}9rVIk8p_3GsU*i?FZGRzv3acu+m zIuj7t`c|u9Anma}Rf~6II!L7VUwnVH-Sd04vQ};p)L5Ufz-ca8gf)swGrvye9%bO& z$Ss|jhv+^gcSK2^c(t*>9B5l6hy@lysrcqTy&q4spS3aQgDNp0F$gX}Q`)@wIPdYV zV8iRhjhMED8`LAb#k7rfQf@mX&Uv*5`x`kXr4vtXsR`#=uO%KKyREf{wda5E-mUlE zGb48Zjwy8ZUTR68iKVxXk?q1-8IiAb7@Ue$URS)7l!OGQ6zC2@;^w@1LA4H0W?sxY zY173riUYE5VVC4tTlg{LlMYqOVfgga+mdF`xSY>^icXY*+^R8IR4pD-jVKH_y{Tbi zv@RRO%uAISucD$0@o=qPF@b+oca)H;5s#fl~Xuc1&{aru8=UP!^Z)j%KL1Q@bc=VTKc?GQkwd-l@fmM2pkRKgNU3-5SH5&}QahHk? z9r59XCVjk|FOz=-o~Zgb>fyCUxMy|xwOdLDVC94*s;4L`i6eSQxf4Q-Gcf7hLK;cy z2@V7ULT+K9sI4y~z}3EEWLA+XnY~95V7jywY;8*JokXw^ve=oitr6M45X&g2U41sq z(bA(GhE)s$DzuZ{Zt)cY^RBZ9{Pj*rcZeAgPFuFiBj#M=G9Q4|l`JJB5;*-uu<3HL-T zS*`xmsNsECrDJ`b!KmDZ{?LLFWz-VK#SG%cx&w7OJIz@bEOmc{rID|plJD0fkf|RLYXZ5bl&i;U| zJNWQl{^KwIQ3-z!xidEGW;I+Tkb9~+@5yq`bgDYkPn$c`aGSi@H!6KzajDSWc<7|i zHpnzGUCWbOw{Hp5^{KwOS%Kco!F5+s*UQmdPC2HVZ-L1jfXQrX`x8u?%Bh^mtn?j= zoXQsL5KWy+W*bOmF6HYin|VRSmjaYJU;0~83=kYx+%`w_b z_AsBW>5bSt^*cS>-qAS9H;vy_bcmk$}4>7FuT<0?YY zlD-;{p*B6}bSXV`kbDa(TH&7b|FQkz$uuQ2rhbFvtL(D9Pl>kxQT@HxZ&J z*_ni!+Dw07sVQSrvT1v+jC`A_#^P8QdSNl~nrz=U`9;%HSMNJ}P8`DI#5W@$nRnACPv2aI$lg+!x#pXQJe5XlF{;kznu~; zhPan_5bp5K_=<0l42xj4yo*({tg8&Z7%p**P{|Z%*}6>Nl?jynE;#fVs%&HGB3{S^_Qbrq!8z zfLYlqem6@jy57=~SpJhT|C%0OLjbx$Ez^}!r(4;Gd&J)D@Cw5}KmruB4whNIFGemJ zo02)k?|7+77hY^aZ6y06$H~J&jw%qz-spe(J(N|e_(%kbG%R&s;w$shboI6>NzfFg z)?1#@55O~W{xx!jmEh(jJp=@D3(wP_Of`~{X9@DPcrtxdveoj|^lM-h%miRg^6oG; ztR&|Y%#l&<*oFuyaNwGc*6V%2?dJdS9im$??=WR@yX=2S z3J4jQ)uNrR4T=*;X70u)HOHQ3U+TWnJP+j^S#Iro@;Ic@!4aevtUWW_OhvkpWE<4; z=((YY%<1A;oF!^KxdDDrn@0Jq5=$>d{RtelxcH`Slr`S|; z%tI7zz)%;c4Uf-)C|p+p$CyGOZNYya_UjR^vTvIs!>)6g-irG*KkERfsKeo3_AmcwU<1XJ}c;EnS{9n^$~yYZGrG< z#ARt3vW?t%u{o9MYbi09q|tgv%86LTk=rs;DVUgxr>YQiRGEQG9MWGbNRLVO|ffv4H|<0NZ+Cd6jA+F|$cz2N_z1Qxph?pji#$ z$_d%VwbXsatAxCXyT_7HEjfSeEC!WH=Q;>(oRL!?7RQZ}SNc3bUL8ci1ybf9Dkb(Q z+SFs~50A*D;5>!6NWzvlOw~28%inLQ z*~u%KV$3=q)utEroFC+s=q$GI`m?!Lx`gj&-Hi;K#6HS#6^~Yp&}%eVZ)qD=BtK z7C(Rf{DxW@_q61(XY_y5N7W`Qa2Cz6jOjV)kl=u*n3vQ3U8FnI1PwHSntIm*;`E*@ zSNsLrdvFLFERaP9hJ1H)?fK%nk2&2HOZPQa+Jr;jz66LFW2be?V9$H2F;p}5^YPXa z+SrK#aTF_%6i-Tk*mLGIjy?qYRI~}1+Y)9Ln;q6!C%J$L$S8l&B)pi}#0zZ9t0}fA zpJP4964*s2{v_*(v<@W64B_i@c`FZRrMYR4c4Tyxd0#VhK?b0xUe~YhEIwXtEEZG= zXCJ9@QYQ)j{TA_G*dV8O1k8)p8V_F242Q~11n$gqUzUfBv&y=@9Lx z$aluO$jslVaNgicDU@b6$a}~t5~_bHD@IH6H?cxV&8`)pcd!y;)HIag|>5Bqsk^lCfr6+R-T_%d@k*U7fF-RW4S(Xly{y zjaiFRUA2D?r6F9x2dbQrsL&$I+xg*bf;1+J&tIBMcy$ws-62 zL&2I{UVN$ybb;v-n%o{Wu&E5LaP*)e<|e>{I6*Y(AH8LMVPI4j_=6scX7t;`V*@O>xW<5{2Kn+okjUqdGf+wQh3V)4v!-H z`*2v{ga>UKAM_x&7Lza26B`J zSAKt^(P;E&ndXS5$PWU6-JK@#oS^1Z9yh;S&w5!W zPZgU7Le9*X^%a}PtoK?&)c7f);i*=d9f@-X?!sB95_JK65429s2M?21XfHzdD-f7i z?sK(nJV}5w?j~4@-frA8ZQDm*MG1fTXf$v*l~M|7o>uJD@>1^8#r@~yx5IB5dx<%- zZ=Og{ma&a|z`MO7K@wz*FW94zKVJI@Bp`=@VUDoGy6(`CbHPRzo}_aYZ;t6K(nZPe zSV^Xov8yj;%DH4q`U^l8R@l)r`xE@-JT{R7VJily(^!m*TwbqRTg^vAKGT0yI5B~Y zNNGdfFZPa0l9#0as7w4k1!NQ1(rRi_wda{uz7=i44bF`NHM5OamFgu<#Goa!Irz8B zzy)W?rCa@_s4+-lIP2a9X1_zg#sHYtR&zbG{@mSgV=MIFkQ4@o?LoIdd9Rpz5YD!L zumN_poy-dVjpl)>bxU141g?MfX)2~t%<&93m&zd8pq2f=xNkscDy?ezpt^miOeU{p zI;0U}a}KY4(X{KxEm4I+C0`C-R_?yZ&4~q!EBqPD?3{CmP!}84VZPtR5S2)A(@coS zA{DPn#-^4p)SVW*G6ysUFm-UjeN7nNmYvV?GjB^*2(r8*8D?6cuQGrA__`2b`Llp? z-w4qeDimmCr0&OE-NfPg6361OmQ=9ep*GKAY+Sbzg-d#;6iqU|;cjb1h#s@fFvelJ zTiTHp{>Momvm2ahOjvguc*7><jAjen)pD4pEPSG@m0FJ#^<7|vKAGeyxxsfX$*dwiS`K1 zgZ(dQnPFzI6Y?2?4pGS>4LO<~+K5yOQ8@vp@^s@_f&^t+liYs{{gM@uK7kM53_4Uk zCNM!-Df^)jvlFEGpl}rmkW{d|+>rWF8)GK<)i1c_raC%Sccf(gbahc%PYIEvBRd-y+wAIE+EgEU*=nD|f8>C+B zo=c}Rr97OJoa$IOj3`hCeudzHo=#c98rZ=(1dtbw$@p=*fIttt;gpqlF6dnQ4{Xh23XSu2?OY?Igc!xWw2vLC$5_YDIqbq+)0!$Lv#)X}xB4-j@fsD9U zr7Ph~q6RtZ2k0JlM|AWw2R-PBet`CyXhm4|_LL{S4(a3FwjPA(=vl}_S zLV-|IQs(f zx{+DXrVDz^L5ILTPd4ypCB@fe5h1@9QeA2uJ1Q-~KMzulF84Bg*Sd|0xxe>#`OoL2 z1cO1xiS2AuCB5C@r2Le8p4baL^+9>=0E(v*Mj zLn9-y0of>qE0*EN1ub-JfjC@s@Rt#>0_TS$lB%;pn!0zudvEA8>!SpI$p& z-`HFR+w{YFmoxFL!-nSawbjK=KK1+h^vFmJ{q^HttDvHu} z4R2b(*`Js99@)JiXItSQKy-gv-Z*Gc$lnxN5qo2$TmK@Ov3b|ZY1(=Cb;u|zk4hS; zZGEs%)Hf%apxDF!*5FhNmP!5Kwu#&;)9;mt*F+G+*_Dn2Sgz+{w~1Cv+NY?61Vp{P)5F1*}LPHhdy)O-s;XnFm+%f2s3q3%WTh37Xg-}RHv+cWA#BLFMcrJv}#N>O|0uRL#qP{0V zIA$6tVa9xsM`aF#b&`KeV6<8D;;Id5f3L0Rb?9c#_-S1xXn7W4VpS`Xmt%TK5CrEK zwQf${+WC`+jZv}AWLVlb5EZjrJwSICb$Y2Rt)mAexmJR9ZdMbd2>~2#@K0reWBJXw z?}Z$0GQsUCkjK-(G%H-oK6WIsu*N+{G}Yc@ni6@KUG-eUHrIdKg>4Hh5>k!_iwvY@ z3dPy1P*Ei8lx#1j6^O4{mQON3OSGCTT4jbIKY&3jT_X8HGt_ezoB~ulAd0~YJj%1GM4XdF zmE=rs=HRc>UBrJpwHMnMNciZAccoe92ZOfc!7z9A5FnJKwG%~b3)s?Vt9#XW$$_Nk zr~%pg2hc$zG|RbtoswDxngo{GZM?4{Y(wXH2xWvMMXEZETHq#l1S;@X+L(0LN{Y)U8TN_2Ko zCZtf=KJyt7O^ZxEowQcZc5#xFvr$K!dUo|PZEfa`P1Z-F1ed6GmPZ^g4rAlOqkyD5 zn@fijrL>r5~TCJSo2e66YA6JL|X`v?y$U~fP+Je zq+FzaMfw;V*_(jPPm+g?Dg>3+7N*mlj&hL)!o+{`*=cSYNzf{-W=t_0+)qT+V$%4q za}?Rbbdt5G%mhY2kL;z6L$^;Y7W#ieO={0m1fJ5I_r8-gh%7hwq^JxCL-sn=y_hyLEDS&QPHzRCAxo2YD(e{B@3!3;>OKs(> z*X(~(xDp`wA+40>`!Ox%{eKfdwZl;+|3R9ouSAD?#WU&`9jq7FVQhrc6Gh5|@gvqz zkgqL0pi?eSD*&IJLhDIbxntpbE$MY|60#SrOweXlL%0cl{$pNRZBIr zpq$?=HjbO@@B_{_b>dFr`6IS#GdOQqrvQJ+#3)B30EGl=NfkjC9YK<;Vss)!Dpq0-TmC7=;hGL&r)VubM7OS9lR`#}2G(Y`~ zoKnr5kU&dDlM*5qI(B#Sa+Awdg>Gpq8)c|z$@^Ufrm3Et)XV!|wq$1qpC4iH5Y%sE z`KKr?3Nwzyg?2^@^@mugSjW;HZzg}xtUHu$md{+n9{qPO!Y&H;rdsF7Dryf*lK7QU zO~FNEj~pR@Lod!}So8tKdQJRT=~#Zd%3M#{p|UmvzQyhcGS??lv1gTLny)){`vj|K z;b4-KY2^s}IeO0&7{%ZI^53w(p0AUTc|Ko{cJY7v%YW~e{!YaOWYnsKq1}IegCh~I zL=D#fIIMz-T5DFmLAlWH(25=uy=8ZP3B=L<;h42f-HW2oTC1yWW_z-j3x>z(D8Uh%w{KyH_}9wD^C2D z@Cl(K)6T-e2+?Lx^Yt3+=`={4#c{Z|2y#9W4o$zLLjONKf&)>pK<+P3*+>qV@PXqg z$qVghIqhPYj|7Tr%hIHYxz^N2oe!S}aWB$?>k|$+J}{B~aE~sr5<7n`;wHPH2{W&AVdD@;5fOyp zrT_PT3_s}--7g~DNGd9}K~ENVM-~v7S`h5Yg*W*NJ4jBgAQXRii)&o8KpI$+NOrk` z`^x!fg_j3URoJ+9e6*pLiR|?{Ta4`Wx|L?lJ*?9rVek&qY0n-UA|KG@<~EK_2|YPI zzuMTkzWLjY>z{0FZEYl`a(zngkr!QmGGAwuv*9eR4?ieRKiu70^@=wi!wq-5}Ma$UxFJJbG;?VmIcGjp3g0WpSTmsGltx{NuGM zz+pkz7avxQmQEx{B=YJJxJHd|;9#?qrPNGT+BipbLXv-DPZ#vbDAO~Q=g}0zAr#`W z0$P)>B8+FQS*K zYk^*QgSDCv(s4iH@Syy!SjH*ta%$5;$(Cr6Ste&PKM3$EONn}VLjDF;H_a6w2eGaT zs9be_P&j`X7R|<+T{M*a(+1UZw^&VeVvFCKQ#Y9T=l4kJ!uP!)o@IZ_0`f5S(_!`MQyKe3!Id0^me0reFX$mwv56Qp9O;@2AbZ({WJbQHWUZ>N zZJy2=2m(){mw&aAT~r@YM_`%DJC6V|5*KrrD!zhyE}GM*6PB{g4d=Ha z>jpFVtp#RmTfT?p+VgD1;#(^@PU#BC?%jX%PC{$w4P6lvEU=j%$Wt75N~+3cfFy^?4JJcoLW6hHv$wx$l^^+ zdvhODl_;H%gyLDsyy{p)EU*peDJg%T&9yvgfOQ?^!O!<32dCVwO<_dN90tYZmc0 zcxKHM`Qkzsl>_H(m%S0|DeQcGP0y5|8AC2Cr!y2sXHs|0)f3feNvN3jz(5Qifh~S0caYkNrg@Vm=spS+p`2gMq zr}BvrTLeTKINwb98{#EQX6eIJImja#K9b&dN^b|Js-+((1KPJLZ$m6vz4YCq$zKym z?u-aB%PihP7;}h@;j}1JFpK~@K*Ya)^QF)(Pk(@>-W9!dF9l7C8YjLGIv?i?vdzO3 zB-~AG9AsLOl2w{SRnN`_+gsZgi9&;=)oC0AXAD_kTk;hXPgWyxWjpS{k?`L?n!c17yRRx26<3o>M{o)*VD9CAMBbs; zw1DF(GAP@H7RYBFKY`_63M??lvHG21SCTdkHUQHg zNbJyibTMN)bfSl3n!(=V+(Z|D7u(2$Bkwv99xL}k%+ikTP&KW=c|NmUcq zaS9uAQ2RR=_YIw>9(Ud@EiKWf1Pr8vTpAiC&wL;7rS+@)7MSzV)zu&`MXH&+xG}a* zxzR)#Gfb|*j%r;u52>b!dk~%kc$tqV{EgC0O9-gb1Io~pNA07Mrc=Rx)8<6!5B(m7 zr=9$oA*w<;r#x!SOsu{lpCdV-Mmkj{Wp0OegK!ds1bvKTgC63zSx&?tZpcn)_=bB3 z^Rx$QA#|8-6q$IxEg+XK6p3BWNU7vO70kG5mGRU(|z?u2D@M zg_Gt~Sh6HIGRa+SpY@-AI#pBp_u69bfBiaLsDjcSM3#dxXzz!4r_zsko*EoH!{aEh zXa18nPa*gJcw0gaZ0iaIdCf{-Hxs{yBrDcj7A5S;6tL!R8VW8Cj(af5K7RsKe z$%oQ;T0H|%wg=g7(=AL2O?fv*%5vIq(8JmzWM8Se%=QxvrimC%jee?_bTX>h1prfu zS7XX0Rk$j>2%|B7kil>A%J8MxAhPM?v-}I*OLX`ItYxFs&+)qWO?<<6k1PARC#wbjjM%)F?oIGGHZfQ?z#?#1{C&i%0Vu zJ#Hw-|wsWsv5Gu1_{V`Q4lN)8_0iy>&j+$gwtvfxxwHRno8 zdSV1`H*~Px5crN-mdQcY5MqfbmdALLOuvKedqsF1iZ3lS z`1z70cD3cT9S3c4}aM5_U#A*1T4sf6IPS5i`5kiatDp?}THk z&EswS*7NpWZ;mAHFUq@`w{cd6z|#TQ%;2c%8yR^JBF9J0#0)M}n`Ry`!lR=sJs4(( z`!h~8l@}*es-5n*`Pq+eR;lSoEp&h_sT2{xQrS?pbn8zRFXfDa%BvE z4Q*gtBI9&lJr9*e=pt@T$X)c&?HsO*)5&=)Q^{IXgLDuA>YA1!J5+LB26zVf_1HR1 ztJt3+CpIq`I#c0w?Q3VPtr=9&-E87!Bodrmy~4ymY!5bMpf;?hCFegii1qG&&}c99 zK+LhOZ7D^|sM5Q%b~n{N3Z_!!SIvj>rb{OiSSQYqppZ8zfpp?!m%0?XQ8QAEl>#*I zM;vXY^O^8?SN#r?j-TCT&O=(VB1-uwx!%Yt1R#Z(4Nyc$i#~{y`0;(X~y)x6( zJ_RgoPFJCNo%J1y5BA_QL5m;Dwe9qW2z%;C!_sL4P0iD~be(%!`4n8W#Fc#Oc&FYZ z1?PGxTnv_v(#PVAkz8~XQb$R{%XrrW^pTH4(pBeg^V5Lv&yP)8p^vD4aQJj%bMxch zf(#e9p!W`=%(TwH88hASaF#dcxs^o@sjxgI^`p}ml|gI~C}2ss)%s3=IJkvwf-*afC?mW}d2Ob!lln(bMy zAK1QdZg32p1C(;WyU2lc1CDF6FOTd2Q2`hHpiWy`iNWj07p?Vw$2IGl2z!?UBDdLR zM@#5p+p)ES5*^BNnj*fz*63;Uk50pp+VX;VNx-N_*JHJj%~6Uq4;IOtGgUZWYZ!Py z)I)dqQ4o#XM=T1y7q1fl4nln&U;l?Ip%Msc4M4-)6a*BNFbZ9-efIliG3P))z$2(_ zgn4noNiMKrjJ?u-@(7>R-oc`%7rhgM2&O01CgPhzQS6LM5SvGguB~|YG#)?IGr3+t zD7)oiBPWUPKpy@n-v%4~!p)YgXo`EB(a$Gf@tjO9jVC<79^%tJQ8Gq*d0IO|mX6CM zj+xM>pLz7yM28+oOA&1a>$Wi!;j;@_%{=I;12$TA@Ray}=odq*c~Y;mym73rgn}Ft z>2mg|DqzCcz~nkzz%@zDU&FT7GT=o3>i|anJIrnQ%cs(Qc$v0X6#;rO(5n`30SPwf z!MrlQNZ}Kr9Yr5Sfk~JlrDunWMtf0L6Q~0}Nfrdrgd_cJ-7qxk71Oa8WNJ1R1yF3} zBLVfc2}G)YFJ8!|YE6rGZ$mw2!5DH$Hb@R9Pw2}|kC!in%E)G&d98wR(iwwd=2F>27y!}ZJpi-6u}T4Use{yml1bEU z3h#;jfKw9T6YUZvB-$MWH_%Zj)C&l9-C4o#GA!ADD$Z8JXJ0etT2=3W`lH2i{^E&6 zol-P;vNl)`h&)M*qjv&=L%in?rf7j80fi4$d z@`Iq2;&|_Zb|P>2LC$`Vvys|*D>-}l(g#WVj<8sYJ4xezu$~>8kzw<}dX7FPMuvZ| zo`W2JwZklYu$~p;%n0baw4Ogm^>=7Lf3TpHv-%LK_z!=Aihii#gRuQI30qm| zA0ifD5dL1FVFG>@~Gi8Am4G*fR4e(=kER z*5nb!dxx@7WO5{NMjB|j;shoYE5Bi-uF|1@ zeg3E2L1wkpVk8J={G|#cgn;E6PtcP;9NdULmm55b?0)W;Z27;Nj6oP^bYH-R5i{O0||@&`bSq&V*$?;bsit!F56a`*1juR?H=X*Hz80F5N3aV5m6qj`zyc_qhxO69(` zw(#H({(Qf1_C>`N1?ujTa#5O#iy$t4`R``DegLwqGu%?9W|^njTg?|65-OwiGZL0f zwS*)!`;ly)tJ&KOSf+)*eUzS6tWS!K#7c;sG@6K%Q&7@Ve!A8>FgJQeWoV5-Dc$8- znfOU7;&O9mG4cg#)!8!*zJUsVf&rQ2P^;@=S|#OxwcS*&2!bK{-lj5=6wpF5Lzz$K*JcWpvQz}7p}cgRdX7Y9O1XVg#tjl$5no>^Sft{enM>zp z2^*|gW8I{79S2VqR8b&YgfkpYzm(HO*)%NPXPdK^?jYM&}_I74e8`VF&J=(z9AN%Y(6|N@Az_=e zLOoyZ+doijd$>P_w|w>ay?@z)CgPOJ3s#haAR2|!l`^=efUj=O3Qz6RgOg{cd)L5f zZJe$s6ghdie7WJDU%nK7cVR=g5oWYzT%BCxw;Q5A*?0l}%KUhvxdBe(HxFhz2Q;ud z0d6p(2kQ}b&A*&dr*!h?n=^g8uK(V+cjwk@>(k$U`qBDFH$~H{k4r;N8gv(K#*05AzlD`m(V-uvcT?#n2D)ur(9pJ7iuQX|4o zZhW%Uz2}qV!8JhO8=Kd!{pR}CCmZ_JwR;b*>8i_@zRvE2h_mh|Mlvj}Rs04d$2*U9 z9s>FLcx!VD;^D2$_3NLkUvGY&PzVOOD&U7%#ex9jyS{mW+iz}tvbmYJ|8)KOW;eX4 z+wZ8>Zy~ysH@W|Rb=`l9v9DkM`273dg1US!oDS1FFD~{5*FSA0XqXKCL+zcqVv@0v zB|vEFM2xwj9t%tYJ%Gbw4A4!f8(tQ=>2@p4`Qt6`$S-3_Kf3ucLjJj}=T1CJ#knwC^Tu{~aKza(blle&P#-RlX69vQb zeRzQiagU^bS5a8zqPHFy5%8}{f7cG1Jd*YAlNZ(yN_X0e!N=m zB-^!TCokyVv|nZQ4?p~X9O6WYGoAln@zNuB)1Z}{1!YzM3(B+AD(8~eac zut$gUh`Gjc&^HHQ>)-zJUy$19elGuo4iwynw_)l5d(;$4T@tXPgD;=4dbj0H_~b%tV&7MJ@nUNwz=t+eIvnHilBp?A?ZiI_y)hv=Vg@85Jc(=XBJ6cP5O<+1(#>ISgRFTPztQXtUI+*E@H#Zm_(9hOL)XjbfV z0CKbwK%1tgf{;_agSl*ij#lMYM`lpTlP}o4j%bd%4ig7dljWGtnwyBB$6RoKwIosg zVYNabh4ye+`#Ly1xHOc_zK~)3*IgBrGI5}LuhNj8)cY0!H(btX9md&QfIqL0Zt%7Mq*bW?d0nTYpoz)w)g5R2xp#`DEb|j~kX_Y8FeE+sAM% z<`TWw{S&T}SV+v)*k9_nTb#>(w`|)H6nF|xsDw|d1~1Pj4ER z*fJ%c*A++fYQFN#n*AdMi0))@^N|%Cexj$*$Uf$j+lF4A4f%xZ}$j65)#LH2kvd498c0+SbYCSOiM! z&pM~Pxq~7R_R#k03tO?Asjj8QrW)zRaXJ*0iw8U0g#=?43)K^a+2tZU9qZ9`Omy_6 zGn?=$Irk}d26Y&9%<)Fp)hcLchkMl)Y>j}G$JN0CU;=2mhQ)etg?6J*`K zLVRg6kLw8wN04k~CP1uztZeM5s8pBebB$QOltOudfmN?5(=g{ZBI0oKKGuw=(4aXB zE7>Dj)Gtewm=$3OiGEj#QyKzOGqJMNo#QqnMe@BLzPxu=!B^(z`JN^>iQ+jOrBe*O zl;Flam3}p?_SkJ)yZ`7*sukT-l=8G-R)Qqsz(#k_Uh|q{LUzu7?`p1YToDRhJgEiD zFP2YEvEA30#;mVm6}^LlL8LDJh&3t>f8`?;$4A#zYPNRo_qRN1Hq=jRz|&bWnV4mv z*e1^*xl5r0s{y-QQ%J^5@ha{4{*ssUq+9gv+uf-#*)>_YTbsnXBrY)R)dC(Nf|1*; zZya;6Aan3bt#YA%#+=gq6U4Bbl)X7=W=?p|WpBgJI_-d+S_BtOoKB@<}L`26_9W#!QV|6;y? zvR{>*y9>Ch;CoTLJ!ZI_3r(R8b@JzO!40`{bGVR_v43xWuKMyPvTM8M?!P7T$6EmO2uU6tN0O83gyeVC`QRBo*$|Y zAYJR%zRnH_T>OA5_&r|xm8<27o!Q#9?$Ld6Yqs_<>71{G7ahYU@H!ZF%#`A5s-(qm ziilqs_SwUKy3Mh4Ay-x!FHT>WbC@xHmCmOt$+|(^nXPH`dQL;Eu+QJYgMNi(@qk#pHwcD6I8t)b%D zZmwKOs||*Uz8(A%nNo<^y^p3oe5kUJ;O> z&J7_;eSG~hty{P5KzUi;uV^Uf%EQt0*2?1>wf%9!gO>fUlYiaA&$if62!1sqXR^`7 zkzAOzSSeOzIInikP%YHHY9$rlYlqigf4f$Hj@h}|TdNVlGjE7JkwLGbj&`m|y9-U^ z;)yg?`IMQus&ACBo;M##De>`-{~2S+b+~g)eY{UQ;sSdTb5GYAS~}=;vmy&8I~S_f zUD1x+7l#mgV}XNn3fs>_O?Lm0J(}@)XEV`r_mzo*%W?>PaY(tohKa{bV|$%{ zrI#WkaryA(CxfU(fA^cb%^lWN2dTRFv8U9WH!=6#-6$(%{RJM6C-dL=&K1mAz5YCljrJA5OgTN zNhfq6XZfh>^H6^u^rb8<(GKWAOQ@%(fJ)f1(>1X|!E)RqLFUEq6wO9|m!SYTR^}~E zs!`Zo8Jn)-%|(oiv*2!U(rkI)_2%`qbtXW7m*K5W5Yc5Sq6>lGLY~jooa>n%Jw0mH zwsO0oNG%ZdssarvOUD`7sdK~g9IE13TQ+RVfubSg{k#!<-(a3+ePKL{Q9@D)y_5+|HBLacO#5<-o{6d zj2IC^+mBmexN-Q5AWoT>8Dsh3FHYT>t1?p$>_tf}aTzI!98ToA#4PD+iMy`A#i8r8 zGSBgwtFx1i`Lrj_*668X^By(O7`yP`tdz@m zEKmobfr@)C-7U166f>x1UzsFy_G@1>6eFALXO98kscC?wu8JOWZS;T<^%f+?sVG6j z>Yagh?{~+m&WJjHy?3kh7o>dz`)d8K;_ghCoq%`#9*)2iKuW={@CQq&{Ge9n<|`7S!gTOW&>RF?X?3z&RRU|?K-EfuE~*so1ZxCiC?P!i{C zl=tnSL|IcCHN<|23;DL2fDVbo^$a5S?1sk5jl@SKLd_eef zKbKB;n;hSN>qF!Huz0n=f5tO)p)9h|DZyp01lYTb43DzDZ|hwAZ0=f3bN)P1_k$jW zIeQ2Z_}Nnk_s(V{$ujM%`&}M^v~YEhV*EXiT{v#^w{tKyhmAaUyREME_f=Of2Y0+m zQXoU<8pe09sC^=lC-hST$;N4HP=A5-GkZ63Rw1E(`JaIP^haV_9AR4mL4Yhffqw)0yba@2*Xq5JzTf9}qZS{!kRag^0%S!s-k50E>kb8-KWJrHT zrt4-gtWwTZ1{G8z+#F*D-7(eo1(l)?NTnA8CE zO;Wsn1hTh=@F(k1h9;LD;^e*Cie>Z;l9z(wFVNLe5>u{UJ>CUUbhw0M1wgKfp-7VS zK1^bP6QgeRh)o@~rD%nQc!?;}5kW=sK@d6uv>2>K=h%k~0LNnnav?=VX%?N8)%T zp?pLuDeRB{-O*aqtP$3jnlS&P847>**RzC|nX#tpYyTZ2{VKhAj`7TpCf8GY5b=f%Q?5Ddwot|fh4}MJqh>9yy~Pigbh%RLZ#zXn+oIkV z=EN^Zb$+E5hy6(^2)8x|s=9+jVspKJlz}$MO#!|TT{*VgI=Wp%gFEcq_#&@jd*!&1 zk+8sevBi)78%mGb>dB4ANMxMAoD8Lp`e6Dp1gjfkDjiWsue=JKynjq!dGR~u_4 z>ZiPjSUe2j8Fpz^&u>pzk!?K<$O2+kQY9X4jbVh@{Z#PN;MdMwwp_HWs&vSI3Y`=1 zmrcqt)&E35a;c3Yjupiehr*Am$}o6U46rV=Dx#tI@&6ptwwCr~N(xZ`8EBqUT0^lg zxyOA^W=MrUtiIw=zBUum{yVG#)HTHu%EfP8neC{0k&|kM5%a2X)>#e_nNeM5Iv+{) z95vTzFD8Uh5THOQl^Tc#NMP-MK<%5TCmc;jwB+OI8RQ4yt!#h_gVnT6Wi8YKiSUa5 z4XDTEODdyeV9m1K_X~f8+2CfX+TVgWbC+{(7_CJCgGZmz*3Nkb{FGWfSMa_BEbgwn z*#gX!FLcW}6*^g0oCp=Dh+q{SkzrTwC3+XBI$EFyQ8U3Rc{6$;gXUuCqvpB_ zt)X?tGGucPmvl6+Rh(k5Pa#XAk5P8h?phz%;_K+JqVMEP4QUNbp#+A~;0dCbThDe+ z_Le6BtVMPXd)L-Ru!xF(DIzrcxC45)H{pg;*sf!P3yL`P1fxVc6L9c1i7x-+Obl>$!>Y2{*$l>#fwU41V@;pm~8a&MWa=tFxd%Tj!oP2*_c@F zVD%JzbP*F#0;H*c)I&Xkl|vr%B7T9Wn-L9K@zmh;3bE_Yi`>P3+JDS3_+3<_Mz<35zxhsgKpGfy0FMpsAy z#1|CP&WAn;mX~#Z>j;l~`O+85=LhOzrWIf_*R|&O=9gImlZzhPezfPSaRmxD*H)XM zOb{d6n|H&xHuGcak4A4=ZL^@ctF4uddhPOXDVQW}i@zWPc#m^y#bl^2`aFkmGak#^ zj@15xN_odx$3v?d;X@)(dax+;B$qFB{i&0`@g+4d`@1$2N$#=QFH$AA<^(GGi?wADvOSdLtH1AF zNn3{jE0X$r7l|$Togs0zgi@b+5Yds#b`3GWM>J2L?aJVgN}C|{8x)-khf`mO1;Mlj zfhnKKJ2dBig_f|`@>+pfZ>rke^yos7mj>hBz?G#-rpn=xXhPvNy8*U;HDB4(AsWF1 zYg_5Fpp*+GBpm{|7TQ|DhpUhrTNwyhZOz2u} zuqUHRg(3^=#NE>{d}!~Eb!a0|`-F)NK1bxUg}WBS;Tok$O%rPy=a|SA$D562zfqIR z+fb8#p#yZde9ls8Q|`AIm+h{ku} zCmzwvhAq7Da%&kS`kO{*Q8~EBxS6|?ZrW1TG&?$5)}EomV;f9~O-z$;g&#;g|Tg%{CIPjlDdo5U1Qo5M;=m9va-Pbt(#I3yZKHAUoq zRKanUPvf`kPuOAqh%9v3;d4ND99aZb{Yb*N`IME57$Ai+gd}b)OJUZdUO^HrCEdbsTMvrLg1;Dz+QG6-J~!Lcsxh`=C4 zimXT2;OSsh52eIlsQU+nK{c%ByhrYT94lTKo||XL`pG$$n%9#fntAp(Oc}&TLnOJy zB6nz3DT|c3T_H(W6Lb;Fj*9TFf^)ZXg>0{JgD$*$)aO<>b1#pM%y!p`Ef3Cs9K2mC zwpWxicBF!JsR;lbv4$$yarUW%MD6$m+dw)}aYR-Qk>$U^F`b@j$+*3Lz`GWIz_XQd zYc^k-JyL)1@FM!t*z9fl{oRyB{I_w4qo_j6T?U5^D{kuHU&HE-s{ArmdGuA$+`o5! zwsv3Dl=4Rbl%r-)Ygw4Ul9wB)u+#BTsR#Wk4O?`9k5-YU6a8RnZo+o1^PS*dho&3VZRPKi(i>X{0B(;SCAggfCjc5A+6!4UWzfBL zi?vsB$}Lt%zMsxr?*SURr`G{k6LDk)<*b7e@{&y*p=z0jA{tO0#4Paa=8l?JC%xqj zsLF!Oy|1*_42o)H~UA06JWG^ZI$7F1uw%Wm9${!6F2Py z=`hj^Yk_|B?Zl71T^6;DgTm_@k&nrf1$qDS}VLqIyd( ztg1s7VKF*7FJKBVOeZwk$Yxls0OJM-5g;F_TewM(-fK z^^J$O{d{?{B+z<)eDEi@4C}wcS5=Df`t09lJI4q&u@V0J?4kByLtiV??Dq1pX%}yn zf6Tt5YFeqehjSv`@Q%tA!PlqJ`(xAj(9HY~i#ehJ+y9f3XR|x}6H>=3*N&d-&(>hM zTwX)V2HQnaCbK@pcdV4h?}C%~{j(CAv*Vn%xG%zs=Ru->@+Bc9B4BDYK7SLQ+kKJA3RT&ws-UDSy!NVTlFSRSkAMgf2vt>&js*hCm8 z@_?_10`~KNV5vwT@mi0qpewZ0mD}qH;aGzbX>cdLz6;1l90)-fasD;BTcFgHGzIEF z#d0sJh+u^mt>J4n3?_>=Z_fTcmE?@N+VLI5MsaH@5~ry|^|b5>+%h*G2Y+LR!^+ALy`JeMZIdX;FZ(mMkQ#=u%yWt>182*M0>E$XNH0+co9gGv$q?nUZMtq z8S|XTC|g?>(TrY2R+e&?4Y3TPe$cVv2p8ZUKE-lWeLjq_$p==D5ou1!#b+_$84F?- z#>w6HF)_){Y7|QH_W^@LWEd>k`MluY4(#J_W^l3_7kM{pS!aLfMP`Q|HB zMsLG^dOEs=YQ9z31?>%-f7sqvVD(t|8gvgPmv)3R#G1OU8%ewww_B*BgS-Xz&>1ev z&&^mhhX)DL>#+9lP<59a;We^(bOByXuI=#J2QRv!cWid2)u(^B#!b2`rpnDotpkKn zT&C_YK7Km?@vkoqFcu{wd{lD=y7+=qGhk(Z6fGaTRY&m`ty_|bMtn$J0J;2z$BLZT z=IfeHy^lw>4&m?id(CkZ;LyJ6!^pxRLDUzntl3w@OJD~?%E%#yq7S6VmGrFo#i6`s zZz6jG!>faTh{@ARuo)xh6)A(a9HgLQ1poF4F84@H7>B?z@}<4k#={bWDWC59Tt)SN zYC`ae2ujC{gVW*8!Ki$PQyby(*@MNNfrmDt8HSjjW^0t5USTr;D-$;yfDS!kxFY2t zl^{Uys4|}NWz_i%NCenPaYjp)q9`b-%ZAb-rBk$Uu~2H^K^GFjF$2Zz8ELtoc314p z*{(5ZPeU<~tUXmRvOsUB1ukFuhIGS!?nw|eb-MZ@TD*7q9NDOw~9$Tzbn%W{qcFLY+C3GB91rjg^87nwwh#m0J_cDj((nb3U~ne2C=k>6~(I1;R&!2ek4=`>pA=-gNI^5u$?$@I-~=smyd-#{L~XK-@sG(3T%3}$5{rl-NmeCK`|r-- z2wNzQsXJC|EEIRO(blsd`=+O)qbL}#)!;4?-!QiixLL)>g6o|h4*e;Uk`{QXdmHjf zfvjkVMo}i~$7I7)XizruH}+! zclBpVXyTfT&jddU!7kx{{?YhsR^D=@>V`ZW+@SgE{MQZxR+&$9M(>$XUB|YFFJi&nQd&20!#B?mSTa zvZL1x=15(_eo)nkT@|M)fBdT!)WL;_w>O%;$`b#MeUv{OURbu-9zMpIcT0BM(c!K> z5FCJM9%ec#Ttk_CM%L$-s1K!Jv-4@=*(yELq%5o3D^6@jc3en0jp>f( zly{OREWfVx#IsbSGetR?uGwCnmC#FZyZy7zSp9O>N7bbJ3|7`+LZ)?Y@Liggygf7BYE^2-i5`+6X1Jzw6|By@M^6;su3^aPANszD%6Dh%7R|ohmf^A> z;X+)ojkRc>A z6gdvLu7&zmdTA=0(YvP1r+)t&jMFo4Kf#4tcG<+!CeP$~*PnGh$HA7`Ri~K5oW>#v z8|i6dWJ;sC7QC>=3`A)8_$*P%7UjNlLXgIkPMn%OkL$C4$*=w&d*{9z*L9`&{{!S5 z3Oz^<~NOuehHT;VKbK^>kKgTbm4jIMb?n^saYYl9#=$H$n!9ElrgJZk=8m?)5duqe|P)#)SK40N5l2j4^$Ts zLq_a>Dwns^r1tbK+w;MeSDh(*UE!)KDx$HySx|NsM~#_L_`p4alP*4zxzt&|LlV{5 z%qxo^iHZZ+L4z?dGgO4QpL5Yd^l}O=tm`_fyIa{~B#P@*S6tNZIr9rLO@(~He--(O zS`^vsgEkfs`IFhCSU7Ilj$vqm@vw>7iq=biN_x+dW>MJD?sbuiI-M$`&DCC{Twv?2 z`A&x3y~-+g$RTak6;ID^3*su7dQm8tG96bf&Z0jh&H09#P`zi^@vT?Ca{Kg%`>9;G zGKEaa{O_q5_KQw3p_l>C% zZCk0tH{b5YT_`;5Y&zY4NwSnRk)fo2W<|KyBv8 zYcZl#8`fn?Z*s7!4B9t1*jEhmdZ&4bk^OTx&7#a?5wdDM!;{N>ryB2E;~2hw@Cv95 zPFcVWYwBGtD(1S{QHZr9JA>^>cn*2qg`WCMxbMJm#Nw}}pO|S!Bk!()XN{l&8i&C>Y-ba5rV0IRus?MePpPlnA zn3=17Q|e>rcx*#SlUL#oC?BCyuG~V%kL24hHU@3{GT%`QX!Se0wq5KdJU%zi1Eg zT}t^&m!DD4Xc;}WuY%nKo&NzMSs|p=c4E-A@%GjoAwtbmcYkuUpIR7>#@F*=QcFiN z_&VpGPUdPjg6=W2Dik|^%Kz)S*H_sGPVm_*KNwvpJ}X6}{x1h;hq2oJb9PB8)3E*d z8-;MYL#)HOk^1nn59fA|^_>arcBl1bVcs6m!^~3B@#>Io_wj#Z_%}GzB`oD15()0^ z&s&WOcZXg_h>1+6kozkm#NDm?HsZnEApV<1i!UX^zh~h1l@s}YImVD*dCAw|tTv@}*}=@-aAF`tWr%w3lFwYpOMQUlHx z?b15-jOEq0b=R@yb?h0K@1Aq_Vpj7v3q$wR-L983Fiw6MA?eE(`b!8;_x&yZY@zB4 z*1ry0|2)FhuSLFp>k#%u`MB?P2>Y))n z(+r{~Pv4}fxjV!M(+K}MmBG2nues7-0Di+>2h-}3|we{=843?gpFUiuF}Tk zZcLarBrr<1kk>!xWlp!hxpsF|Gj+FJ?Qfue;N(pv&rGF)-q%_(Mo8Jeb_Sz=p$+$9 z6F{xW=KgZA_iS^IzwU3+{A#jT()(@`B=zxZla2`gA_`yR9+Em1`i(AUdy~6y00c8|t%8ON`YsWp@)ijZdR9&(f4$^i1ROmy;9qO>ski z*+crUj{#EL8a*)NPc%~vFz()?0NcGd0s``6f9vP6UGKzZ>C}YgBv#_h<}hjgx1etV zm#6bdy7kcuTn@R!nSwzkN2mL(MtdOhJ6fJD)PCN*dEBsEn91Dq!`XBS%ex!+LuZ_v zkV;j#qKm1<^^^Dzexp7vFgAaYxFN)UFE$0$rR$eCJ7kf;6%Qtp{iox-o)@A6YbN6o35+;Z6Ay{x5D6w z%&3{Zx;BgHh;1KD=(J$0$ozm=E6ihgIOv%A9eX}y_k(S?(WLk|S)>9oTF}CO*}_Bf zxwUnB`*v!`9vr_tEnVk!?_(iunOoPOYY&Ev09w^?fGvj(mh*rlN)ykMhWmLzgDFEM zpzuBuRweH|b>~g^2C_&et<7KoiHnFm^q=5IFa($ryQziFm*?k3%5k&X^f)cHzWVly zYlD}6`N_jS?!c}N7BA>r$vfG9p+H`w6O|jLD~J5Mul~4sIFY2B9qEu!$HlYg`?^0{ z9zUfg7N|Dx%h(9*G(F0W=cD5n;}f&Fc~KD>MPBXPc{J-1(UGS<7#-@|3r}s0+rCA9 zqtBD3DbpFsg7gSW;qq@GB*vjt>>i_PKAk*Uo}3rhE?|Q9dDX!bXoJOnXzye^pM(9Q zgA^dJ_BMEE|F=*9Z5B9GU-&)!++%hX8}(yO4?5Qz3P34Q%RD`Kq)xkO&4rLmfSqHF z>k|~!pjMUR-qT$xo0qyl18+7yVvjOS(5_)R+ZufpXPw~tOaI}2ffYt?I_KEL0jGd?+P}HK%?uQXeS?hJw1<`E(u&5M&VX5JllTQpX`M? zb?&cD8)aI3o{nx|0bJ`tJ91szUG>Mw$s7Da{?xQXZj3PG;w7oaQ%9mkV{*%^-_;0*Ny}oiLoJ-Ga*<aFhvan{@Hh5Y|+kI>a#nF zr8jHvGMPp|m=!0G@j(2yveoHHqh46;SpE$=FU@-bgzac}cLThg#S~`4x!plnEN9GUf+k2+Yo?;%tyO(={|MTRW zCeZ4nwfIR-(bQd!>7=(t12S>(MLxL74aPxfXIu$MY|H>WK*PV)q}u1Lz-w|HAi^KG z63HDQKGtzifCTtntQWfG`HpdJdj9fD^(pB3bnbomrJWs5`11t10u%H-v82wskP6Jq zD!I|Be+zFgg5^05i_tfne)?&5TAGG`thN=p!e5N%$4_{z^xireul(w}hhNJ2I-85B z3AJC&C@punq>-JBGh95yc24XtX?mT(vX^JHA^jKS3x$ZD%o0OqXVXk5yXEh}#`y*! zhraSmr{{8!Nw-3BaQROr+zo_qX*(%pjB}QGe=c1?$BC)SS2JE7ih@ml43J@8jZ7nNfDZfAyN5UHgq6F;qkpfLb30CfA4eN9J`H}n z_LsRgD+8a6L%(2Gox7xy{$w-M%Bb2a)73P$Mt_>pA~!W>(5Z+mq!tXFCk>Ahh_l=e zf9Zm=#dXw}Db23EC)(3yQgRW(ZN}_nG>&C*gSq70+8RAfy+89@{Q~!kdyYbm`jySV z$=Sc#`Pgx{FtC8l&Iet8PGM)GLd^UYSA97XQ&c^4@s#>J|Q=cV7 zp-4kOtX-R;@zj|Ye)V|w$sa$L6Z3qE>Oa4#m#}-2sxzs3F$?UyxM|=HfBg-&;N$@E z5Iakn_w;;mbPBE0A6(W|5rW}p>sZ{Jhuq2{Bso@d)Ar-3(08Nv22AjD8n&7qe><64 zA-BEgCICO!)<2&?^@SNhN?ccl&F+Fc!ZTqyb2rRd;49&m?Hm1`3?6WWSa@Pa+vW-G z+cH^AEWF|FzOAXtkh#)szXvQUdJ$3(7V{Gz(^aCjUQPGUH2e9(^3c5jKal{AiJK?l zqI$(xLM=W!vVe;w$gVzt1j;`u2VrJszt)dvsy2 z;}t$c_^G~tw!G7`*;H&xx|CSZbv$4TgdzSk{vNM9z-b!N(!^An!(^VYViuQf7w_tH z5l>{G<^eh;FN_^!aphh{9$GV;{M;fBr2_!1(8G zb;!#V9vH)2S9ia*y;nO9UN(t)$#D`r4Ykn4Pv_ybyPQJ8VO==}zp0)POQPt#QTyxI zY}QRhOQG=UJt*UFd4kIZh3v<3{4jHFQ~D~%;e3pzbe0q^+>dYX0<8+0#iTQSUN(Ki zNRrL8v1-ETv5J#Do193>e<7g@LbzLIC%T6tl^{maACftiuVsvIB7 z(n53@252COo;-i}DTF95Q5Ng?mw8$3_mm7hSlV+)249SQLZk8C-sId`kR)v4xrl#b zZ0Cc#4*yfj=uQOa8Ll2X9pz6|3$4(N${V!{F;4Pob0@OEo$sN1e^nuJFkMUsYuY_X z-i;@dBN`Pa1L17`lRO>iw~oiijzsIUdK?|v6`7&QS%#E|2f_~1{tw~~AH0P=70Ce`r#sW2y`xHV|cQqhZQDt89j8a<*N94r{aME?J*N+KcE^$A6R=*ROhx(r@|@t!SMJ{fzXahS-}ea6;fMqV9dc_1BUQJF%vqejpK+UQ6mW&Re~l%rJy=KOtNa6ot^F*oJ74GN zEvru!xIg6boLVel!quk&38*iTDa1!6){a(xyUcj&lh>? zcW8Zq{;62-Rc;M3;0 zIrB+Ae>zz)^QRq5U&ea$b)K;lh)7(KPdD`umQMuD z+CEedjRlN?E7$MYLLJmX4RN#YnW7#=gQwBDe~k-Iu5ER$8S?^L1~!R^de(DJYvLhZ zdp2czN;(_Lxc1E{UUi?folPEPU&U7YIJ~~flkR_YzllW^Ix9&K$ui2>YnpX(T*uaF zDm9wnEG)7xh>8*)kTW%H?H=K%G`PJ)4%OHxQ|L&hgwJ~lF|pqrFOD)vCj0zA5t$Mv ze;RFs+tOLv_{*IggGvZSqkoPa#1zs*Wy2h62e2~PL%vYr5tduTiXrYC0Z=02A=78d z!zZ1hDB}&M%?bV1u!$9X*Lxy?NNdpCpOr)t$cgpiV$r}Y%_)J$z50gg+!PIQX+IMY zr6AwpdnDsQS=r$ih)5BaDm=c~lCd^9X!uGnmXzU&;SKTWv~n6Lgdo;$lr()HG>TEC}9Wwv1wC@9E-f62q1 zqiQp90LU*REbE)=={grWf_jPvH-~^>jtQ@Y9}~}CkjpnEYbWA1ej8SI^pStcY?W3$ z`p&z6(^7MWgq14T?&#UlcN;vub-;`966+tmg zhJ3vPh$A(U_I&w~Hs9$j+&iathKs%?!{7qG%KLZT)@44=_MRoo*+80e>&YKd6Te^<@&b9(2Da5K|A z`r$wVS%n?s3cS4?Ubzu$CL8VQn((p=&LM48Itvo-#MgbdGRc(tsJ}er{PA(KakB*n ztGncT;4Zjg$PWF83>?no!FmClBZY^Y1c5}DgV|WA>?eI*a+;b*iel+SB-xUFc;Lbd zTs+7;F?ji%N`EG@e~ef8OZjnb6C3J9(KwS{;MiLecZu80`=8=3lU<)9;;$l)RFc-* zz8c_TuG+d3AEo}{8XEr`Kfh@;_9f-c47Sck4e_Tt!YUTeCXTj4>gX)}U1e9)_E^(J zZ=RmJ>dq~!#4#OaVyGjgpbgFYtgG7`5+o3ON%4JhMw?;sewRgCgV1sSrHO%L`aWQ=OsChJ z@X{Ji&rrz1e-4r+^oSxn9i5YYv8-q+T^37nS#Mh+l~&nise5s=T&+zn3wafao7p3} z6_FaW@3{BpdVkG&jYTYU=#s#%T0Pt+)Nh8U(OB!f>_|zay?EkrUI#}f$mzNb!%WJs zJEEeg<^heDi>X3ZPW4O;$CdHowATAwp=vIdbN#C@e;J?H5VdWI-l#}k1aZ*cb8vi~ z?hW5Xs;NwMUnSe6ViQ<#-E_QSWu}X3l}>@TCU*iEI^KV-97Ik=LACu-*+mgR+$o)| zT8oSGLUh(gj~s~?t0+#h0rw+PMt(rCJkYU;T$1n{(}q8wC#7Tu3>#QH9F~`e`tZ=> z=N9{Of0l!HC29V)dm_D_3*i!xur!iCzO1?=63wRM?Yi`*O;+shPS=Y4>-WXvn6txK zh9i^1e(!Kqm$~JudTORAiLR~XKZ63)tduKiH;!~|2p4{yLdnu7m_D?~CC}!7#R*B} zwjCAsJNiK{=7MUsRnVo|13%Y}2b+?VMwwO_e?zc@T}YjzW6~Z*k70UKjG=PjHg+Gw zs80LDgpKwF*XFgU{%ZFOR%AbeMbRafj?rpF3jaZHJ!vm8^>ijmgu?5mK+*U>dWYDV zFLACupWr6r%oUv~@$vNqK~=7dV|_v3wsvByuZVP0U8nUGSznPAGUQ#7BCFK2znjG1 ze?>$eS_Q5I0#co5IA$fJq`#%IUMGhpKW)}0kb+LdbnVHB+@Z;Hl9G;O3LL0b-B!Az zA`#k&dgm1PNMR;Yu4F@$lDzCn(x_4rl_b#(39WDn4PHbH0l)vE#v_U{lqWBpM_OW1 zTN{zGLHUi8!*HYKWOC+y!|JC@DCLRBf5Z~(7^Z@Z)9m#l`=bp`1<1g~@u@t~th3cT z6|}zWW9~Z#zG>AFRi&UpNE@RVaI>-D<~TUM!&)%&!sF{wUBL22cjO50kQp2QcN`rHa(Xe=bt& zi?9l{J(QD)qMCHbD4wZ?ubkJmfHbkX1nI$~0r7{lTiN3dK(V+8xea|UtIKNt;5DgM zs;sFLX{4Z%>i(07#a&V!5NFb=j!k)pZcN}c4D0TOZ{qUqs#=6i^Y)A0=agNbeB&n2 zqO6OTVpbYn`GDR^bXcyJGv_q#cq>y)pDwOb*#VN1r=L@zf1>1QFW{!4 zrc?al=s2THU=;XeE=A^!3Ic)3QCmlfVcF|0->0LNvaKBa=6DoXND z+8i9L)JP_Ei7SG}iQ|X;d}6249M~3PrwBA87=A9&#`Qqi(qWpYCYNY0c@YNosO%v{ zgk=cH=+R;IjHI;YWDO6Nf5*jm*XFp&lUqDdtW{+Y&02A5Y_>TASId`wASrD!%Moqo zR_B6-bEKa=muW-KCWmsxs3B8?N*q;nxpXcLeoiFO#b-I1A<1N;U)CrdwJlc3c@RApXf7GeEgM17Ylq)h1 zL_1Lj?dpo>cpn^$)eKW@iAytx=5%_E82Bh{N9BcqwIbq_Og+IFA`_k^=@Nr40w1-Q zi6da!LD!JOM8OAw+ULuNb(dIlXC+SF9##e5_>0u+IM@}}@oc<&5g;Do9dj3o<4CZ} zCe)}L4|;fS_tEB_f0)Ybh}v%0U56dZOW{mbP4Iq{X{+#kHiN?;*7hfx(*s<;_aA)i zQsiCY^P_JZ29Wr>w*+Nrw6XimJyjLSQ`r{3H^IPpo|-^WCW3Pz|rYV2?WhHTXwPsd5-bPMFX5>3n(uf9M`TS^j$lhoBSCLP!MU zEEvB^UK$rp$ZIH?dg;V{VO~N10_vI0&JmQ_pB1<`x%z*DT!<*_Ns0fIypIL7qPIYH zE<=`xh62BQ_|?~V%~Z_{uOrR>$;3EHAKvyZK0x$0}j(p$9R7mB3Z#7 zOkz&ss##{qxKm11tp!PZiHng7vUS~z<(iL#b0Y<15Gb>&llu)4C zyaATJEP>pfh#nQPQ1(-#+-d*G$+CW|l}63J+}@-o9fDvZR>*Xe1r@PrExv#bq^vQq z0Bjcke*r`#ff41Hi@}Wc7Gc38>qMXe7$`NPOj%fi@=sMvMuL&cn9{r5eS;*zInZ5I zD=Xf96JDSgkb0z~Jx?6ay}$MN1}W^R{7q!7lVT?;MjNiXd3SW@&h?Z|#4c)ms&na6@}Nq3)e z@v9VXzNME9ZeIjqSo-uFof^GEwW8q=(H?2~M`trBB;widEeTP8h!l_AwHM#}t%05VN0c&Lw ze>C0ESyKf^Z9zH7NSSxY_PpaESe&5cAqsQL>3X}hRdxw92-2D3{ z|Gu{i^h|zY`vX4t?2Fwe*Xkt6mlCd-HlUNeqfMOp53cU${M!Tt{DT^e|Ml5 z$lF>D5~zlp0~SaIla)a<$(-03$x&WS$udeSNOrG|%;`T$OYz*B?0%iCeNgs8p_7DV zR1c`h`Whbm%B-#G{fSJ1yq|jOYh+g0g_;Tf?POHF{^4W?K;6LP$wH$(aFkR}Z?ae|N(MXAnupu8oS<;x~mJ31N#N=UZhxbx9hbUMq(< z)X0@?&JyO=fllT98DOu6dkNP*Q`9^g?e`zuyL0R2Er}-JE=Svfy1e_osWBxyAV#x! z=hyZOa?Qek=LF_)b*eNV(zxIlkyRsvvb3nb{MTy4>Wr(<0rHF8+Wq#^f349c%}YX) zvwdFD&`Ktd39$ohR>J>cB?^w$oWFpDm4(3ve`wA<7fxZy^bnAj5H#hkF7Rt%Jop?HfY8vFOvji&$y<^h zLjf(d_-tbVYRx>N()CKTi%v#P(E-4eDS|`rVfI6}+5+NHwLvTm`UG|?6c+o&lUpbK zsLce-{+d>iC|T$Z>u5mkT*c6h9H4x;9xP`V?dW&kuwkQ(Zzs4lf7o6L#hsn^cW!{N z|303J(QeXZc0L^UC%;M;sVI#Mu&p#1!a$_Xy80)IAr!uG`M>}qH1?)4w#@1}+EPyC zDLjUCa^GU?l4K)Bp`SN$MSkk2QGx?qa<=WXHlX8cQ9b2gSAsX&A8lB(+q`w{z2InK zc#~6`OaP!o3Sm*|e}WyPZlpGDnX_i7ItqVmScZYekm34!qhmxAY$;kGj~v|4jEV za>$8f$ekWX(^CJ&gHNxOD{%Y0k>m>-+kNC49=W-F=f?K-`yagbp3z{SY3^^nMEod2 z;kBv3*%EH@y9YCt#OCuHImQN7 z{sG5qCE{DFxZ{9;r66#1Vpro7`N+ml437P>tvW=DiegkX^biD)!q*P2^h8LO9vc;^ zJIt7XnYq@owQ76434eqRe*R2xZ?@b!QiWS(itmXne-Z<{pQ_TTkZu@qM@YAEiH1~_ zb_yeq(&{J$rZO%!r8l&cb9?Kz#Z1e5DP;>Yk1t>akO;+J(g>1m)Kwcq<}IphQ9l|+ z-DrguXN?9wdC4D1Xp?OzsH-jm`845LSv*qjU@IPWErH8*662P%c2Ee!8+;SsxFrqY z>C{Ngf5Xt>CG+zo?cYO~Lf8aqF2_G|)U=Iz=w^YAy+|H>q>H@6YzjJC$vuyY&og^7 z0FE5EOTnU^!hP8eGGMmKv~wzAR6sMuO{$OMPV%Y5Zmm?gcJAcOCkZ5bOXQcaKnw~> zK(Kn%>VubVT@jI1s?E;IU_TfmAz@2kM^T?nf3yS8o}4^AMcWIkarLS#J981?lhv== zUUuP-7YnSs^e5wS6s2z8g826)r&xXxq_^2oMG~m@Wwvr8GKVncGyC`o01&g@04jQyOXAi`7 zh*VNz&;E~vpLH+>d0NTz(wJnh=|k&>F*b^{USLEjZXdZD@(MvJ?Bjdn|Gcxx+Uj(n zLfc!nO7#K@FCTv}`ZysOkpOTPXzu?5e{ZbnX4*j&pymWue(l6F`rp`=Ypvtrym_P` zO7?h%D38Pw{nm97B?zRfgT-vAa^wH^zy5ECvsGW(LZJQDcV8p|RBwO;ORFS3Pf#HH zo-<1rM7CG&5RN+tRjf;u9bzHGU9&sY^?r3BqQ0v-?lo#j!uRA@I6Wy+F=z6Fe>ej_ z6_F{`z5yyudb4Jw_m%{}V~VrY(8%tVvd6DAwNr{iRrhP2bdjJna;OpSgnsXlUDd{br9h1EO5 zZ7r`JUh>FM98}*(3&;^!GD5Oif6NA~F6z1FxvTmvr(5P<+fH*B6_%b=ft(O==58jb za76?eT+^VTsYH(+J!;g%!yt zYk9ktw`+NuP@;qr@@DdO#mzzk$1uSAr|ur;%iur3X>%mFdI_t!;E0x>%wA5HZES4u z{A4;2IFu6NN*2b}oz{I{e?P`1Zn6%fm8NLSZA_-(@Xw}XssO)Qb~F#?B@Mz(`;#S5 zA+g>I@`Z7-=7MwPv_*rc-+nN!b>oM%8>ae@>SC&aF{znJJ;TEH1lFoLMN>nU-GcC1ry|a)Mkd>fxfqncNz{8gn%W zE?Rd~v#78~s=QO`SKewixrrsQ#Z6D`&jiK<+W3zOJU=)i`29ZNdc?b7|IP{vpuBEux7pt7ka0u3oZ`;*;1svZ(T#m_ zL7{g?^1*~3Wpa{2mNkJphdXtC$upMkjsf@$6epyM2=l6IpxvdPDn76 zOFDzmrTjy=e=En-gXQs?<7+vXTxa6U^6UuGZtey*lQTPTe*LS@$kCh9=*8fCktgb` z+9na*Uist_ibf)Z)ssN#rq4AC!VoQ#R*&vOT8@=gAK$PPCvp}eNYDgM59m3T8g`keGd1ED2E%JVT;A!8zj{sX`8@tC|{f0@n^_0X@nZ0*I1t;{9F)70ii zJAEU8*3f@6FiUR8)fj_OF}c{J;DN;2LlMN)M9jAdc&nEWxji1x>J?aySnVr_^_FQh zm7Vxd8xm2{wW1bmWYgavx~3J5yKu_0)0WvmIbHZ9njfUxVD*L}kdO)ud16?jl9!!t zXk>w|e^~Xa`RqHjXxE08NU4_IXG>MhiHT3MOmnY@mikX;zzsoPB-g z(bb093||)4%yA3YdDn0T=wE7aW0!rD|yeSERZiSB^@>0^=XueQ+F&@hZ}4_FiXH z!Q#fMPW4W`;Qe}vaa!pIPNC~(;ikHW$ig-SkW`|gVchjo)M+&_H|C?viUSyYmaA2l zs@ts^4KA>DP;y&w6%~VdcOs2xRVUx1f5G`M+{hu-UY0Xob%`?_Hqgrl4Hr;kMS+k= zC>@s7bEfoPbk*47)GOv;^orS~!hKFbApBqhrt(oyA)6@tJX+W^<#`}Kg}(B6?q5uN zUi#f}bOwq&LauLs{Z$@TU}R$;XCBLMNyLuElGgay4i``~CPqRTj7@NW*|?4Be+ZPy zsG8c?#2&9?^gugTDb^Tm=%AG0q63cdh=I424bc@KI_4}(r>2M6@?=5}YP$94+J4!8 zWP>`+(_bKsLKkF#iY$kMdJFM%)F8MPjfV{ToHU=d zD^S^CDk;(-RM>HbM`-2Vuz^OAe{xdm3atr52C6=+=oZ~ntMv;bTLqKTXBj5~WtTQ$`a(F2erg!io4Ja%WB}K?bcvfo|>yOiD|2 z3XB?qm|u1k7R_l;SC$LLe>-y!42Kcrl}Be>6G;g-Jt>ARt;3mQAb@J=%Ir@iW4xJ# z3zRglBv!p+UV8pz$zAAFRRJL7XE48XpG?!oN5pt@m{iRQty7i0eaeY1dY#EvBE1iv z(Uq#Y0zN`*k85; z_#1FG0ZE%gWdgMoUAG7b&DBeHT2{1Eda`4rs>(y5)_|y9F%yBx(5gY#!qQ=b0`w+& zsJnl&Z0`RZE!`BVZ+;a?Q*#yD^#k~+S+9gZQXi7G6`8F`J{Ip!`^+@e6BwgBvgP)` zRFoe8*&W&OFsjHZe+w)Cm!qorYRU$+p|Gk9AyH+4{>RXk2PbPd4LEA@%(Z)Tj=XR) zb{(7jC#fNU^YT^Vo6Vb9QdFfCP zPIrCCOVO=z>oaX2pRO?3u6#LCUUOsQ>p{e9nVRP+w| z$QE7_YQ%-ke~hS{R=w_FnoY(kF$uar2ZYgo?AxVAM9xIlpBr9W9gKj@;eA}&s5ixy zTOJB8+?-J$CtIV>Bs@*vhL~tvdD--}bLqwhQVp-)d`~5Fr+kcMxPA)hRe-dDCQZ3===GM;EcK=G|vL$P| zS?p(bUHR=+v15Y_CbKPk%{Q(zSn+uNRimK_OM<=eU|L!qu>JSCKL2C({OAzxaDOd% z5A@dP_kGrJCQCP`FYBMPgZa;cE$WY0thD|YUw`{K7OPOgj0*7z6oCi4nb3f19xGzO ziNJ!8f9?az_mMJ2-Ckk8c8~49;xirz{Y%hzUw%H?`0VkQpI;k&KYAQs0@g+!%??2` zni~uSPrPsh>{i)${N&Lm*REunOKZIl6i!VzB)g3-E(sr9bky!s*>Nc#@-2y>l(_4^ zO5f`O$k|5rR$7Oo6T7&aJY2$d7{bo$`GMsie_OSJ%^`&n_F9NlbY+*lS+=@1Aq4Mq znCkj_oCFi~C?e>A7S-SNds8CpW7R(_&k9iaiU3&7QKWk*4Y9UA+}z&TB$##cN;`gq zl90ftG>v#sp*E(@swiXNh)`(HF;K}ogFMsYfd&{ktZ7{V_Ie-)wVk2X!v(z6a}!!`CQE=<;+sC5C8^*h|8E(Qg`9)3UF`(OZ|d zQb!#;cN-m|qe11?Q)S>rUT{*iloUWu5AllZl#N8-+()2GYs@5>)CmSJJI>|Se*um~ zUijW-=P+^R#q^lWDz zSfrq@@JPK^dnanAOxVF5P*#h(S6KCS?_`dZ8SmCeiP&u$6y75rz=gcD1>$R4h;)$r z(x%RrPv_im)MNRuRB2pXSSi~he{qvJz#bZ8@?RwYlxd3n8>FZc-IXkW&lSC}zk8tHo%2gI0>w zp4n;3EaVF=enRDKHITt+Vhnll8Oy^TbqiuFMjmOqEtMP8YjkRVPfCu^Tkm?Gl}D$0 zh6e^mquW(!CjwV?ddlA;f9pg|94C~c!np!GH{AUyy^-5h_9SN?U?1ne3!8RSf(dvs z6Xw93FT$^*)gnDDg#{e_Q&m_FH(RR2V+a1fGiP+bI?@C=a$~A9V9NRA`z8J z*l&~eu_2IQLP4!!lsLUeC4Yg5ieObrN4_uf&4WfGy+Q6_|HmRme^td=rPHb*|xFM0n|I$6W`%)tLlvTsk=vY zL84U7Y$Jj+!`v7t<}LAPuruyfR6jw{Y)UQ}(eGQGIoHNUJxV=c1(6#h!l>B`Z6icp zS5!uGN(Y^DEC3W$f6juB;;u+!>b~L|jMBlzsgW3b-uYR`UBm5_LLrFVtTTGuR_9WN zt5Fo_2%lKFq8}6V0V(_Jkn2H+o^Wr-KDRAOqN7C}R~R@oc2tgqn-RBK$BJ|bZN2oS z29?*rD1*6N@2)*CaUJy&Vlob4in|ijs*#lBuU<+1n)j0Iq>EF}%4|m+5Jn@?!^+Kl=LAPxMx=QL+vdk#FJ~l^^=W%?LS{8B)uxyHv!QJ5Dy)6`0R9%i^Qjh?-K` zA68%hf4bu_13L;2UFhhuw2cd;54kj96cj|RXrrAY`H@K%^nVnI9k(}KBbvb;26-)- zj*CSjDOifY$QURfBcx?Hi8R1(#A#cbV6N}z*x`6%Um-OQcKxB%E587a2D^jB8%kTM z6-So}kHzppF7nVmQ4~}tWz`4)#8^WGeJ%1xe<3?A0_}H48?$Mo`T}r%GIJJ;O1VJFJ9+)lVzUIx0W~K7IvrzKET{0mj^fe*!KSDgjMZB3r#tj|WbqfPwYSMpH-`<+@EB zJI%bAkA!P*9?qQ;)#})e)k%~{nQl+BZq{r-Q2cjD)>7~xj65;bvn6idr~dq&Q&=>7JTeNjfMsD0%3fU9hxs#|3~f+e^mV2 z%}+BQ5_Exy2<~9xM&2RVp(!zp1pye~kR$7pQ$&qAnlv+(VGKFW+e)sS`$e|Fu_mY5C77)% z3~t=Kbz^7e#;Tz=hc@(T7E=i-`IpgQzT z(kV$QacJ^J`Dp@s<$Fc$e{=Tp$CyQA+uTr|dbCBqJ{sKvAbcO1zN_QB@%5umzq+ye z^#hBUN6FHTGNXtCUN1igya`*M1C=f|%I(JfKYQo49Ordp>3c@-9qMLUU<^U(5OUjA zgriB*rWiIwwMdB(zAFGls)$3OQ7FRVl^>($5gdIn7ySr&6F*6Re`{s#!+!upS=Nl~ z@Pwx&0foQzzYn=HSFT(MU})8#MH4-oBqKqOC>@hNsIlee&nJnqljZufqWyg5*7?Z; z95?;PH@pvXyZ7t+_n(f_lE3<$BwEFS7ZGXv;CqjrIENE;TI1h7CFLnP|M=%$F^yvH zD29>8OfcuX=)EV;f90gyJG&bH#pmvOBkHh=Bp08ut-oF>2S5Jg{m#DfynUX}t%vya z%x4>VMka%xlbWzgwIG8Ra)wgIftGlLi1oHcz_*+wHujYpoZ^@70PfhWFF zB(E4zvdNR4e<`mbCU0_(GnxFm$q6l>dai^gos9=joDIiSY?|<+GI2X>x0aMqQ3WaH zt86>>Qeg*Ie{ArM4Iz+~d@LlJO)y)07!5WQy|&h5sv=e%(l46oWbeihd=R{Zm+D)6 z3Y6F?UHhP;>Y%<@>{89FBBLDGW_PB@H$_q9+1*oce~ZY}wT6X!dp^ zJ-^#Ie;}0|7580H^>H=7(H)|xi0{ot34?H-mLEJ4BKU!Z!e~o?(^rj zn`L-gYG!x!TB#ZSXOD#cyqk$8UFUZvJgI$se;_8~?VMyMvaY_z3=(p?KR%h4|rsErnPH| zf6KDJ++1lHNQnFmCkA_>D15!rqlHY*J8VDTbr|+|yzlBUCE35_AmuHn;Z+)B!2^pA z7S_`&<(yrHCUVRC-<5bA95$TGY=?#!U?-%-ZCa+d&<h)R&X;&f2Bf{ z1mzzQ>bW>h@J{-F8<(<8doOlAjkaOVL8$?&yp_mUS{gD`UrP%)u0es}$vVQj&<$ty zV5xgfI!I1JmXBrTI*4*57%Yqt`Ovv_T~&~+=&IC?G{35Mu{e77C<^Bq&-vVwqv%@1Q#PIog2HP%v>vY1J`k&R{vf9~(@sv+5r z1WsVVxly#$z_Vj(ln7x&)O2AK5U|gRri6Ft&vE=jqxLb-nE8{s=IL!MOD&P^dF@~ig$Mb~c3DXVu6bY$ z@zQdhHzzo92EZdtQ)4n~L~d@?h5=JxnV*$H2^=vVZdR_2K@eYke|+=c)=EU-8?xO; z`UBw)D!JufMR35}?^I8eM4WoV=H1l^VCk-8VY`sKQ9kuMvsZL7>mw%spIUjwq>ZBE zf6m(Vv!)l%H6mB1!7pSB>OYFvdz^zxhtHE5WwP5Q1>m&(fuu@?>b77 z+tBgSLbkg=-hm4WO@d?!{dR>mX@pRo2NTdW}*Mk3m-;9tHsXU5oGPIb$!JN0tuXj%7 z%O$t$FIL#O-K-}r+1UE~kZX&ShCD>3apVqY@@ntg3r4@8J@+zE?%6y8^hY(`ir@P=$HqbR_lyaqJ5c&h@ z^)PhDnZa>&pBNj%*Gq0q*O}u9HLy(0y83)tmqhuge?tPt5CNN<@E>cqFt`+F^L5kARnVNx(z!0QFax6w!SG5t=e8w5|1t?Uk^`-s zhGh9bFhuK%pxj!gv^d4Hpj^o8FBymdV@uCV+vYr{WBIq`=Jcityoo@nd|kC0+~aH7 z%GEOHZXGHv=JtMeMQYskS;=Vhrs^ zFtzv&Zs-no8Bc&8w551R!|cV3jH>w;9Z#CT!-8?j@X6HzaWM*|7J6JaCG^o4$KhlJ zlVl!Pn!L)q@O(H$3`z^k;VQX$rom+Zwp1v)f9Worz0^eY4-~IPm>@SMAeb&=S$T3v z2TAtlVD<%z#pDEv$Cy-!qzal*tZ_{zARB+phI6A~^9Q+6g3>NEx>eX*ZWED9Nn`8Y z;r|cDrNve%bn)fF8$(fX&=WHc?rdwHG*$bxpEL%W7sNkG*grelQ~Mc7*=RH^ad3;Y zf2ocA0TJ_7`EvKnV*RUIfwoDu1Hif^NYkC=LI$hCREg?oSMivE{pbZn_%0zNIRrUw z<3VJmby86Cu#CsnmuJ+5-Fk=`EY)br2BJ1-N*FYxm9g>L}DkM$7{sM2ZBsOOxYODws*|z zcUq4P2f>lgSQya0LLA;}M_SnXaVzOBer<+ZNB#W0%#%rejp$LZ0YX z->u=;C}2sss%(~x)<;RMx0^9>f4CU)(Q3iEb?WpDNOU&F>_$<1Gl))LyBO!f1%3*V-e-> z75+rpVJ&qRS8rW(EkJT;Tg$6+Hg;2ur82d>rs$8fW-8V|lgX z5bHPmwaSV&7=Mdy3Q2OZD;%Vrp)}ORs44)QPSu@UxWHymf=SZRbNZV3)m{u8(a0Q@ zI#<>Qs7wWrRhq>te2FyHe|p5W-=k8B3s}7B*xfqtY0~{-1?uXDQc&q={a12rMesmN z-mSOmr*$d_gML93OYVp)*pJ~?OF1ZCDXI5QORBRZ;910-9+#%JyRh{Vp_n5(5(2JT zp~y39Zo4Z6NYrHjZ_94}q={&{Wm-{7dT`)db2@)lPyiRAiWb0LH z#z}C$Jw4Q*ZUXGVoU;)sPs*s@j zQAmMe=JrIzcrCFce{nt3en&F)0{IK2@JNi}R*armKG9jEyP(Z9lZUoP66p)sDDnY( z43{mvu}p!DKET(K4BLU-s?&|4-=N$l{q<^jdh^EHKf^vl)lmz@7EnLRxh&Q$$$Z@n zZvDzD$!^2$^LWKDusK)i(>3prUSa=KLui&kt^HxeAaH8Cf1XR~-xiC1fZ;2&6tnco zj+}N_mD1qj{8#0@7fMUxzlYPP{2ocx{20VlHxlT0C1Z?v zmaO|7Zjcjz8NbGiNGXU7?1E)BOhXfe;OMs3yhQT`N-+xnZs!?Z(gZ*(^U+-cEi;}@ zR)Tjk0b3MXa<}>j2!>@NY6HBhuajnA;N)PJ@ECt=4<~(qw|{#towveER^{W{i|V@w zO~l_QY1zM}A5-GRzIxGIiSO^nES|BHFNCi;;;LRjar1JAN!KRH93dN94PG}*HfOc< zuT9oOcdXnX7BG#ZXG10=)kKh1%r?IC_A1^#gGd3rEcuULLm$*NJQC^n* zUL}MHuS45GBHL=%qFq^H^0=CsviTtRbX*A;Y7VCuR&I#c5l~LxK`tHk{3*O_kLOC( z=(M19IDc7d?Z$|DYQXG~?G1T^UUEs^4Bq6I9eUUvFSBj;L9fTDgR{~6YD+5D`Ye8) z=01uOT{Y9+&5j3HWX0YtondINz-p3f$?^q0mZ{mAx5-0fTAbd-vKG;^gmL$UdwD23 zA8AXFyLB>c{6oSI9Gkqvyn8umhvbKXU7{P(4SySo{t+=pXu%$>moLvYTP0}v9uRis zCSRf?gI&Vfq>^b$iD$zT6w3uZ(TybH{!W>s$DK`87{fGv!`xLplC;T&EA=4OC-pDB zj)U155E+jo&W6`r+R%rbhPOnJNCi;poXKNnix9u4DPKsolX;<_M$GbJdA4Wk*VJYg z41cHo*lDbpG6>iDwdNtRVrfc(dytonuy}rjh#SKe{N;nfQmRMPiAp$!#%9iXR}Fec z4FlU`CL3=Stk^1GH0O%z>y$hwKKhCYSnJf#q6yN3h#uAX^tm#jTt|m@;2-rqxp|{& z%cl@P=9w^xdqCF4)!kP$-W~@o|KH{gS08Q;FdgTpe!EWB*?IJuMZ}aIV zwV!wEm*Wqb)6a>e5Ug3N=c|`I*_9Z3Up#nz>*kFCIsu6mAwHSzF!JAH3JtKbt^31d z__QqTl(VL&V}2jk?K*B-VSD#i?qN-J8bfa|ZNlh6#4qqhq*cCt`L#1#!_WCWdVe!k zUh@0SPwe^;BxL_9`(OrbL0g-b^eBf|j?eHoPi7nC#FkT7W?c2L3&Xx8_sHiRO+o)Q4mAfkAJ0mbNx@x%&sEfn7C2y)mr;c|)0L_U-N@VQbUD&Yc zIMaM#Um8AmX+Jq6s4)K~{$-@wjd61pqL-q>ll9%5xEY)yjoaiRf>Y0*4}U|pyv%tY z3zA~~-`2ANMcE&Rg5 znG6!9|J7Or>w&gW;KFeDU-MC=LV;fU=G;1CUZ(k)6&uq*xo=0AtcmIY-6JACsK1mV z$e?Vb8Xy$&$(cGnL{RFoV}H$Ctcdn;@PT&nSDLUy_D{)E!DyzG3k!hA#c9p0*fcBY zR0gwDjHK4XD-SoeH-O7T_W!gr%c7%r2qp8(dIu&o@S?T*iDhY>%dC{S+ znhFmFyCAa#v@-U6n<%MO8FDKBVK(=VZ2O3HqN1W638mmzia^xeK7TXK*&N?U#AKGL zBdn-;bp474NU?Jxu_8eqsF29RgdC^5f==D59UHssxCp%1yuC@~8NR{Kk$pHJD@!k$ zK~p{BaOOKi=3tmlQulPV09ClIP?TU4Z!w4^Sq@rs7Oy#_qwW++PE`52<%@`=qY15{ zx0O^+a1)HxliL|q+<&QnR8v|gat?%ayt zOtp13Z5`cd+IZ}z)OEGR<(7y8nR^p9)1{D%kW*|9gYJ=@7s5j8w(j?3x0&U6Utu9? z8_w>Y<3ZuHLVpyo+Gl743ZP>59a>f_pWYLeWmD*TLqH&Bz?}|8CDR3CYnOi%zNvcN zK{|h=*o6un>-v#I2+TNv&j=39_R_2MUq0|Crjs(9W?i+>%6c#b89R~xlRQ?rk1Z^Z zBf!9-N2jm7uY!=EL~RHW%4$X;|Q&uKu)HnV}G&`)1kW3Bx|kDX$)$t#6t6| z!ZTF{;!t!BReEx*ZznJ7vwKMhbzxmI5=Xoe5Sm_7*To=lt##_Uc}8krSTW2uKXtQ4 zx?5=R!Z$Sz$K!m}HMVsamKr%!a~*hSb%Ca4=H`vxM%zFucr!BwxV0DzxdQy1U7}qr z*;eI(m49#FF|3OFp%@$0`3#+IO^0-TmKzj6y3+JI^6V~K1RoJVdl0*~NSG=Msa?75*{;;N^4jlCDm5%OHK03@*p1 ziNZB!H)zsR`SuM(?45$<3CIVL9Nq;vVkNNsFMl4Se$oR7LSSQ}CIBUmc0dsC7TgBe zH5RJOV7v?)AhyOy(ZtN;$sIMlH+Q0&+qmZ(sBL$LEEGFO30##Evw`iz-$u7nt6U}& zRY`cDHLREhF6^CPS#_K$wns{sDZlLb%mft~mo%ph!2pa@S67e-Z9`b zPGyimKFH)%r$@9M3}5a+6!iPeTW#c7sKH7++L7-)>)N6rCfN9QpFe)cXnhcm27lJ4KlD^o;~yeYUHlz~s`pqM)+m`}nQMw3 zqp4^r{;mkDN!XgGp^1z>n`z5DZn$R_I^j_&{_RVAx}N2-&VqbO6@jj5in8&e)a?Q- zne{8-0wSa1dNOEJrkb&DSB=brfnLeu9SfH^$(G=3+x)ZnGJkFc z+dkX|hyNv?QqZI*#x`YEzdz*QxRaDG8;2BmIDI!+3-^f~D6TP~m`0H4Eu3RpV zpO{D$KHOP+AqDFo_TvDwmoOG&K7VvC`r_DepJa`qM|o39 z2!>HGQbK<`Ia;MJWHH$;vJ?kKDmDpT)d-Ng=y)i{o?@6jDu>xe_f$;vv|yup8V+mM(w_FQJ6TrTr0<&lpSYMUs^425k?NU5Zj(+ zN>790jJa=Q?pEv2eScTlGpDrdwa-WpUf0ewVlubFd@MIWOhr9UVNFWgHGYBvMvf11a3QztSR9Q1VR>$-B9GV z``$Zts`nS)XQV|;T((iAEUHj*<>9w~{`SxKxa*Twg0Q4O6Mx2e8jlE3te9?4vbwp* z4lP}0q?wYj<^_#w%iDg?y(9$5=Qil%g#i>iNE6ZQZmRhPEYG1Zb0@c56-D%B1IggQ zY%-n0jjRKo&Rlz8el}Qq+_9d-=3>d^=>eNW)g)1$tG4&<8ATM-S0c+-BzfH@IG*)!FyOcQZba_9$-d;Si7EQE& z6-qyt2j8*hJ79=IYmsfvqsXH4)<8eDvNwYvBk|j-^X=WM!&7xII0KNChHy9J{@>rJ z*#7>|%Fn-jr4dG9a$>v+cEYTi@O@tv3J0rpZ}>c#ZGWPpfB%cmZxxEbsSrArC!DRi zOYDKkLlxat2};AIX3UiYQm}8ux|3TdPoDGmOZMOg^p5J>U_DwlQ%iH|YB^*2`8&ZS z2P;*85Si%27)f@8GiIf!8p!W$XZrTd8z1^hG(Vs}uN>9fyz$X3JLHrFGi*Ak(^jiv z>#*X%cz;x3*~vPX$HNDQMS9|1dm+Yvzgxc7r3^NcJ_2O%3;H9|&nsHYEu(B-5J^w; zhO4ovryr7WH}t#A1cQDtDS0+(D#++Z#H)%7M( zpcBojG?Fv8$W-*5|(Wf<+eh>K0Tn(JcN8;LzQ9Kl77;dGsNZ!LV0 zjc?HF@A+s_IoN$=Xx$-fHyf?pYQK+L$#b^_2`GY6iFmK?+y|2nh#Ucg|Y; z1{L;JtPYbsP)cLfoDW{eHXR_Hpyh#bH-*#VV74oS*Pc1!I>GT{ceQ}q+cTdcucQwj zfs=|c*jj5LIyWTgI>7P0d(R(z!D@z<0)I!pBh97DR=9;1a4!v7F(qlwWOL3LO^b91 zam8$oO+RuYstA+&kDVD&yW){bdfV#Il&y{K>R( z?3z>RgEc6%P;f%mErVEHO=*7`OL>#7qi{OluCkBuyR*Gd?NtAU?gE0!qxLl%q<;`A zm~A3yX&^GBY(2G1zj@;!b9|v**-miO_0J_@j>kiz=ra@b_`YU~by40*`ah!1+#-OXo5 zQ>+i~zW?#v4}RWj?U#|vgb(QWMg5BA^xAZlH>68^gLm@Vk}E5alts(#hf!-n`L9 z{ce8T!O4+!Ems>eKl1wsZwWe;&Rni9ws$i)Wi6Q6s4Z&$23eYtf*v~TCx3xNqpRNK zP&`Zt8e_NCw|=?UyZ04Wz%ZuDHMuqt>|z=3)$y!Mw)m^%WS10?fM&ziCyNQH*# zRzevk+L?64Sy*A;@-r=xi(goMPNqAEfR;zNz=60>W6_AS9nyX#pQ}D#Q8N^*f#5Vn4yBJL`Y1VfrTp&_sN9-Tl*HG|L+VOO@-W&+ zuH#-G;~RBQ+Fu#-H5-stoZZD@@98-MtXmPf<~fnzfMo8Z5s zigLpz#vgkO-C^ZwFN&F7loHnQrxfn5BEx_E10G@e)P{C7^Vd`(lp@yO{1I0ddfVh< zh$-eGl>n(@b1F~`Q^%2gqno);MHY)(0Sr;o#8IJq*EFvZ4EFV`Gx3TlU|*^WJ6mqB zFIuEB3d1t#y?;I{^>OlX9&g@IF)(@lAEf64`$9Bczap3LeoJO{F@e}rn?nK-ISR9` zV>)-G)HB!_W#|>px{Z&RJ6m3RIs7RA%uh5=26FMwB9sFfam>O=(w{^IYK2QI7S#c~ zuGQknJ8Z|9gQys}oQGJCa!TF{3Q1Z0)gM)jrz<|vxqt5&Yka;u*wj9xQ*`b@&KKdE z+RiduWgvn?hSWOW)#?{CI2^*t_ExQ z;$j-2zkh?TIEl&kIoqU5(VZ*3RinGjpZx6ipYLxsFD^L-)}uiP?a0y`0sBZK%N=~2 z#Eg1T=Plb4dJ>exoaTxrc%9Gw@Vkd{?`lLM!=fgt1cxGV(0*l245?!MoY~>|8627h z4zu;!vFm01Q=q0lR;x2*qd9Sb|D-?hW}|lt+J8!9jukwzU6VAUy;5Xe&3)syCG{1V zu<~mWkO}#KPlYMq4DC(=@_O*-t9!K>yveHP@Ljla#Q`LjV9`uk2Ki8F)=U8#i z=zn^RMhLCLbghV&?xBgHNj6kOz_vXl-V$+697Hz*&26E9HX7Ud^n7=+jXvr_Lq-5v zY?<9)8?08}kYFeeLt9abfWocG@`-LN1E2Dql50pggX$;iqKuo9zt$y4V=SFd1$G-c z6u34`QI#IHV_%=Cq!!0sxVME$4Dnj{G=De+z9ZLXPGUKB5VK~c3+LOc-M}ho%5v+M zORIpC-(_N3uOOM-L}+a=lWg1Ou)rgoPY}$7*l=;cX6yk+AdZA8R|;t>DqpqBl5-lI zd{;iP%I;KsZmLpVb>j!mD;huSFc+!Tl^Z!bVNoGzW+(iY8cxD z7Gt~ePC6+%C|R+jC3J_4mU-*Gl(3zuft2El>5gV3JYfj;7d&egPv&6QjNNK^f&Rh`4-s~1bkjYD1c5Hcz<0QgDi^?NVPgs#-l`0Nc6rIgODk9ZZ+Bw%NnWF zQrU~p&`rp3xSA4ti3Uk(k`xl=>$BG<;*N)3P?IaTH5u|`Z zI<(VRw5xGye5cN>k)>mYNewOvBW9dISz{CEz3X^qT!JGQi+ofyMa@SFBY!7c#dVJP zHpM?okB84EDdgd!r@RAphGgF`4`~|RF>`a-eHWV>N1RDk@=s-zDi(44YG4eh2qdCMiZy_sIDA# z)KX5$!ssUF?+YFst^3HqL~lS&WacNVVw*+wp6z&eyDken=43RbK#|v3eDsMKrcSr$ zj!FKdc8<##GyVGY>VNRK5{dhH6+N|-MRnUC(%Y;Rzl=Ss%M7dPotJybp^f&tXxzX% zD$Rbgv4EuZRRvjz?TxQz$*IMUCQa~CmAswtAmr{YH>%`JpQ-s`k+#>Mezy4Sv)=?A z&J92f;=?WQ{Uib|1Juf)5hmU2XFJyru_hn5L)*vytAG<=dw&wkJy@O`zv707@2V~x zL;^oiOc~#jq3#S8>dR#i6-0Wu$k=)*nCAuzlxC(r5Q?Jl-Yoy4lN|3eq`W}oZm^Z6 zoAy;w{WLvP8&HK%g1>XS4fNiERV?$^3k8)!I2UovxE6N!m5fuLJFc#R#a4Hf3GEH3 zTbg9#)3xNx8h;gwsiBm{NfD!5ck1E#;&8e6$cyPs;Mop-uTaq9l&H}jh&?YV8_rA)CzUr6XVotAD+CB{lT5D%3CFesWYcspE%&h zlEU%!uy>^)iqqbYF^?z5BOV$iQ4yZ3n>|_{HFb??Dt|yNH5=FfO8>}kU_vrH?Ngf7 z_7}kciQwE9PjQwEcf<7zvk z_|=z-zwDr~vS+&$2wh5@3pEMgmQ`NXG8_VeMy4%GkxGQ(v_OCzv=_T0`LZ;%cyyO8zG<@w}NFR0o0+GZE~V7C&St=9_zWofDsJU5cmTJ2M1a zSWx+HlT2g;1Np+*+0kWU2tR1k`XUmw*_$%36;slx=)w@eApEEgnSue_>?3blSv@I? zihuG};8lC)?WX;?Mu)yidI5zmr~)hj4p!d`_1BzjdHkFA&K4iP-#O{&*~ikU%{U%J zxVkh>Bl2VGb(xwkbvMaX*8Qq^imn}-GvoLZ7-Q_RCFr5Px)^h~Z446ql3@KV9?T6Se!bvxD(%!(Vn< z0SKHo2Gku0DmDMUytXz2o5byL8&;t}SC%szI)xzmTqZdxx)b5D{Z1dya$zW-pZk3E zdHYMcmpSpYpgV#{X7sPtFrt>X7^57+7-$*~WwCdtiqV&A>G+v6gDNNiw?z)5gnync z4`sWYjSDmE!nm*~89+tL;P$rC#bFJPDT9MNXFQXoR0Z!b7a<98t45$9{_QZNws)=6(sV^8j@I+d##P&aV-NgdVL}k3s6ftDu2G;!|J#`>R_zpH<(*9ZbC0!X8=tO_nx%pKfLqd z&&-tl$Y@Uf^k;WI@(({;(A=f|?1PWdybGGwsSBV0uqwrKK=^}8YEmF8)f;I zKm8wiql3$)G;I(A;FpJY zq|_B{=rVdwGhQHlJ7xW#w9`KSm*wgCCy%nv9bX>(WPJ8yS?mtAhOx-Pz$PI-($ ztv5+6J3{faSS4Xk0VuSaMZYOuuG^#-;JA^6M(I&4?Um~t_i0zZ#L_D&i`LitOIRiscKwp_mj z3e$RDQ}|{QMbMEnq6{fY`Ut~R8t-Mrv3I*H7mzzy^3VttL?2pBT?RJt%EH7nH1f+q zMkdT~xKvVm8H9Q!?O!=qOuRU*7%N!h=zp)()O31Q3XNI@ zG53k=t}e)Mv|Ufg{%Bpjn74vp#Jz1fx9rKHz-EK*&3zWwg&+nOiEGA(Rz02bE`^z} zA|#by?r8M!#fAHsS7`wCE$5zByYr31?+CqO~n}6$PJJY8M1S0H(2X;zZrZ12cY(qKL53s0TG;J*Y}Stima zh1t)ZM~<*+Hc}^Pqv-I*WE`+HyE+@wz1e(2Aj5IDe6Ba{pMPLvpbL-{bVTK$4rkD*?LxaQ&e_o$r7K#2xv1JGM( z@ljlXmnHkIXtjVbT~Zd~6Rq7mM4iEwK<7^t!8v(d@qf}nsUL#@HeWpiIZ7^@+t8}e zT8uIF`EV|lFAzGfB|(Xu=>=jGF{v-*wK?%;#Gnvg8up~%dy5K!i^2i|3kytwq;wHf zhhe`to(Xqnsokw`d(_7u&YSn_^BnX`^U_EX*)TBB@p(Uw= zNU>s9w120m15mcn^#EeiPNIq*I633XUhCZ^Z07BKo&O}>d_4Izo|D&CPg0d)P+m+p z)Id&7pk^U70X{m?lVvTqfhnwZjkx(n2?JlU=0Mx<^QGm36Gx$gKlv+R$f_U+iud5k zn-NL+feYN5F_b%+RZ~$c=GNJARlkXln8c&ZaJ0O;u06ZhYPr^8$r)Nwsff6<_$?V0 zIpw9IB1;F$SH{g(D{gU{)-Tn6LQZ#iZu0y{yXN65pn>c~lwM@z3a75)m@e`aqo5?l zYkz0lzKT>JBB^{q6^9m&(5zNSOfCsSwOyLIXOFc+b1lLcUJ8+z_b>Cdm7f#QZAsT6 zbsA)#Q}ULV++d$1b-~e0rK$}}`6Hap3gQX~a0aPV1e=*5PTx1YTEwFwvJ_66k!Y!} ztVFaBRzF*6Q`lS&X&ysDm$Faw0?2Y?Wq(`)`7j_j`hv+kr=D7$0W|g`2NfQLU@cR} zi4h_JWqmvW5OouIo_nJ`6OhG<=$_Kc>pIcWyU|<*gN3FQAW!1wcJ?M2iO!i~4}}1O z5R5>;(;F!{=V6+t7hdd@io<$php!0p2(as zs}H%|9E#Xh1tg-&FdB&gOuhlD^cP05GFoniGKeu>-2+y5>!j$wOvz8C{+~(7piw__L>xzcR9t1en;9Z<-L6WkO?CwIR;yoI3 zsWGGq$0~u_LisD?$Vf4+&iO~CTBDBzzJkTmRkL{^Fv<`%xS1({O%$ZB&SxGyt~Z-q^fhz;he#Lt7qTbU z{=Ep=qIco_`|nNnp45K?LVqd@!{@d$*)!Cdj!`FIJ7}dDO%G}u`@dCWe-5NrX#%Ps zV`TM4illgCCADW|nc6)Oc+PcgA!VWr$pl}Zsl5i#v`Dy``jm)I$KLRrFuX-N72Vl; zq1^ddpvrbGMIT-fP2@~v!rX=)@q2RfZN!uf4MiWMgs{6ow)CyyU4J{1Sf7xJsyIbd zO4I^cy=b|%#dV=un7yuAki>foGRuz=mr52C%c6ml;54jz(cAQhm3yZk7)sm3BshG{ z&7v?R#rlh-u+mnS2KGF5sa!d|uKZ<;wyt165*Ft_d8>-5Yjrby(a{ODTr@NDnGwG6!52}xEq_^os1i+Uhq8`tWf8V>pH+kPFE1}Y`32;?%>7xf#1h+;QjpfF zF>2(x@fV}8y;f~xm&5RIrig}?r%Ms1BgE*tLE?fHd;zk;*erO+q>;zKSZ>3aDZTUh z&gBIC(hn!I|Nfm1?|d}*=sT2^K0H|-`5-I*lsdQL=cu~kM1T6M{8N(W%BOEblasK7 z6*{rR$zpH)6&f>>=X)WCwdXSmD(Mm2LIj z49gwuO$v*wy)A##wU}9+=n4@_l`k{}MZ-P7C#KnF#0cu#9bW)qmG_<$g}zFsCSHcIGVn>KSZhtsvh&j z^K{ut5q?2D{j0lt5JCkU9sf z7JFI6Y5_@K*eRn$3gU(D|Nc|Db+VC=$8fej-ddN2YCp|ML^5{;Q-zX-KqH0cx3Uw9 zS#EI6ABulaP76|6k(;UhU52{3jxoVV1carP*ocMO)@SFtE^l{;1)>D#r0a3Qc$YqI zUw=Nh_qo6OBWK-vBK|_hkBMP!mrx1hZp)C!Ez=Y`1tch^H`14~tpRWo37z&fbs&D3>_+9MI6q?nFsBwMc(OQ|P@z?LF{J(LLa z2PsNYM-76*KPZxnKwJz$kqOJ5)4q>_kAKSto~*%8{e>CUw{AM>zkEd;Aer(LWn!|jY*u1qQAVlGQIj}&tLx#8c4rbVSC~dQa7+Mh* zml5B|<2{v06Lpizi!_c@ZlKhaeoG1oe5g)T0j}^bB)GYt3Y$PTs!lR!ua3Ggw}v3r z3VUmHX@j>^RKRmdTp8Zx(b2NGB!A`Xh}@ff*7vfz3hFFs`*OQ>JJ97THr(ySldqVF z3oZAR2wD6@YC~EN)tT$vlnKTJDe^mk^tofPjHnzV9dN7^FD;ft)s4TbtR*%*$0mkX zI6dk#uMea3Y_fLLAQA0vXoIC1SSQ<8C)uLS5&=tk#%QmEH(phP`SIoyr+=_-fi7V* z83{ZXVZ$bg>lrICIbrbG=E(NK5Xg*n%nUwj{6$gNEc0V~9_%uep|iyjzs{hl*E@_M zW=}Ozx}|p?VTM{4so`x%8U@`X^a`0jjG*>Uka@YsI6s_6=l!=(O4C0Pn+?Zug%A_o znjIw{2eDXGSQUqxJ>UVvw14|Rq=g=6Na?!fd3l}n7h(4N3bah(S=`IVrP+J7d7pC) z>doB+3tBPX00tU|CVk#H2$VxNNM0z(3@B`o(`xazz#PlhRBd5WCO<8KX(v-B1rJ!6 z@*gm(-B^k{gV{$bBCLKv_Ew8}Z~8iurVo{WOs=|$2RoPlh}%S64S%ZiMEj%ze-=5q zRh9C-@@+X1eJG@+qs%|VG4%3r*Jx`|AXEz13@;M^M`zi7C zzxuh}kx7}e%X7E7SZKZUSa^9BLs5+}FHw!KcO;j9y$l6ve#5uyuq<*;!2K;dYv5pr1ml`BUtHI8ramw%A_U8!1i@>^H@EER4hg+m^jE%xv!XS*d`s@MZ6&CWd|%h%$M zOm49%I}SG;I&0ie?LnsXhEMKC06+Q)89^wbXze4R6aRVi4cqHK>VIwlI1e}12<)_P zr5#8#^7BE%k8+Nnf^fq@w9~@)_hjgpt-Fi7BKWudHqd|KVt=TXoLP%opi>};FJ7-$ z5nnGy7rW!*GdDQK_0nMlLpn!Z0awzVCmpLV5Jf~?Lv^{REdt_lWrn%ox{oMI*M-8? zS5`8v6&0}41SFw+ccPe50F<2AD9CijpI%ho3>$rMiLuCfab>zyP>6mW>e9J@qZ{j~ zYLdfm4tbZw-hcnTyTACw`|_|p`0)M3RyRNP+S#wsz~S+JzuwhRE>5G9hL;FcF7~c)ZOt@Okg669&o=I)M)hyBIxclcbRpFPneSy6TLi_f%@ zlz8b6AAj1n=HAhNJXr3o^i6}$|0Ze#Q?#S9kng7OaClvQr)$-hxmN2-5229?ghX*G zt>8}ff#*h_4|?%8f<@J;=|nQ^EUPPVn}X5i&XT$cTd!h74A(R>LfqMuPh&TDT*`8| zS(b$-YGY3N%PUw-Hgyvw)Zai1yjtvWK|lg=vwsg=K{8Slx2dd~eL65tm^(XAxG+*@ zL5`a{Z?7ts-wJ1%=DmH>q=iFN+pJ`HVO)IpUUnWtk(ut893-p({B`ZDbT#w z3hN^>kvw-`O7;g_4>v<~=+%B_FdnrNQ1zj1o5PFE)tqjk#p<0Q(*~3$5+eGGFC+#- zLVrPaL}i%rLT(Rw2P)Ib87OGO1Ra8XZDjFejrkU8VXr1P#w&%M`ij9ar}5&c&Hd`p z!amt;x<5}nUY>7+QpQ;vpW%58pCK^Jb`I7jgH*6r1cPcWf9-Z8h%!l7&d7N2$41f$ z1{X@DWPk>)-6Vq-YBK>@>EcVXUtoj@cz?<<6wQX!$0aAty0J78l)7~ z*SP}F(U$Z?7vt|xp8JL}a=xT-pYjSSGwn{ngXkk|_UPs+u}e&Ed%+y}UWvAQ@PD8@ z){y52OSpY|sw!KGF5AuCNN7>=uc(faQc2AUAcgqR;HR*LW?&2=ng+GvO+@VKF2Mzu z=FGKp0qfO9Ew3VVX(~t|7cIF4@r7On=FH{Ba_5ppS0j}?4PDNHD+9bMtp6}~p&96Z z(u&{o*sv{UBEe+JuD$&rKf-1pw118yf9EEZ@-S}(q$F;eufl{TIYMU?ftV`GgZ&V5 zx&~cXrQh&dkU;##DdVDaKGyl`I#smGpV0hR$Vj?Zd(<~FE1BiGRT^vC!&`6HhntDS zP9Z0g(0BN!#n6JQ{E}ud-2Ktf+tn&a8myhlSHA#-_itS`t2C%es90`Y&3}W%nE~(O zi7umTU|V!DcFI`zuWM%oxf8-yH+4fTL15;!U9@Ntg8FK|P%C#6lHhH=z^!FX`EAi! z)d#bB!tN}0Gv;&XnaBsGtwg7@#9zJHIg#$5Ke9^2W%g1ZpRJMTi2^=N?&efUx{@F^ zF-TuB^_Y{fU(7&xsQn%`ntx`Zq=?iHxAWdj9#l^91vjDw8^@y%L51_M-Z+Z=sow5S zo$v@A;w*%chhZ<^9l%bv{4jQr(K|5@jQMYd?f2q7)diVdQoT_6uJ zeF&@1U4Au*OmuiF*3LWC^EnlEeaztt>E9x<)5u4ZlU3hDm%iNy`hVAdP5kFPyB1N- zc)AuGG$)nIaZ~K4stC7!hy>!%;)6e0L*V0u9FaV1ZsI+Bi^Yp?xI(2>)W=6$+U3hs z@tA^TID>lO?-h zN8An#Q<44Ev_2#oq<{KWCpa$9_JNwl))YoyIQ9(j)5U3FKWAm(BwW&Al#F^A#heFFxQ5%tdXjHAO8?t5PpU4-^`k&)#dVy|z*8DSskY z{5B*VCH9A%Q|8rPC9R4DLjC!V_;m5i=+3~qb$-yi?bS7uNg%CbsUOzDc|J`+@o8AI zvrx~C4n^PxWq+@#DB0=HGeS}fI)Jt&+~t65f)Y&}9o}2j->db!QpIa^a6p1rhxvJ^A9*o;i)%61Qm!Q{RRh84zmiSW*5^!_62IDB}2k%{xr zzl1Qv2Y-HR{!4a{y>c-@m76cxwdaGKzA~HF9_bL=kVU!xZ9t|;sWlv3e#p4h7@UuRNm zcR%}*aKu`?J4loU0_S5z-IK;mByvZmD-hIr3Gt%o8-^~aOsxC43;R#{3%460acVhK zoqzaJ$2$yAnY=6QMzEQ}enEP&?Htx=bmR^UPL*j9(zmv4%1&PZ2&Yd##t}&<4!61_#jg{_v7M!vB<@AX(|=8`KjESIw&ju*`Dt;s7iJ+ugqFS?K&zRW zx@huE1BI?^qL8Q?p(7VeA{M?d=ErdXbuw77^GZm3yB1YII23sC4 zv}C-Rqa#TL%67^8%^xKDiRtf|ogM{bp_s%bUmds~U4C2h?68|W((*zibJpn6n8F(%$J-jn9Y~R)5)Hn-<^{`IssbV);-UUKML)}pb#6x0 z#YCH^s1nrUON%PuT;`@EFFT1Sewj!yKL5>E3kLI93y96#>0Udik|L9iul>XF4WqN) zO;cSo7N*JMvtMCh&aOtA>+9{h8agPE+emQiP6@MO!=@G`x z&LgKQ2yqm(6yBM6Hc=2agxi65<;79F`67hXGA$hfDBYL$b(b0__k{Qws73_s z(ViV_TsB^uo6*ITVkTt#JG}qR9u2kfci>JnWXxvKZjvg2FLO2q6f~9L39mZXLulxF zWk^e6siQo921_8R02PZA{6npC7>4!c#pyznI2!-G7XfrgB6#2RqMq z=cfo(f^2B;tb_=46F>jar_P>Jlwx?INIJm zxO4B;-HpRL7}VFS)zOGk+_x#2(@~nLF81*j=-N zfg$1jQa07nxH{BL4wge7&4P6`$wv6v*VlM4qg7C_=aktDI`%5zO?%ek(&tsp z1Gz~2+njGHNV+Yh1|OFT{N0f=!9~r`bvMir?%;>E$MNL)WTq8+yH?||l{Ow*OY43; zevLQBhepNu&9@v|oe+)IDuuN8!;(RcjtAxZD+h2So7DCsNlBBoU`$|+_A z$UEta()FE!BI|sekK!QkZ+5Xr6cne9&St3#q)8I5w8IbZD5n?bnG}SEFw<;-k4)MF2gU$8L&G|cPxnX)qLdE`!Sla2z z1Xs~uxauqhLvMj3th7|>lp!^)8MA5hRVgxFx9pU%=3zSQ+OK%Zebv{$%ts;UjxKR6>$kb5<>J|vP=ww@jE=t_` z(|W3u%X1-kALvu z*{gfE_c>6~;CBRttvbQ~b+r#uR$_FmS5A9AtM#H6e_Amc)y1k-8JJ6ahC++yFknTM z#@F?oaiBOUD(!ax1}|7cI@}L7Lgt~hzJGlzP^7*OU>NBhNM!Ul`X-0pP^I6LCw5s< zb}1<=Hd9xN5Q4rdmq@b$W)uRZo=O?VM_2En+nB<}P9LYdK!4N; zCd2W2Zpo=0q0Odx6#i41HpaFo(Gz&d3SwI%P*7|5xJvz766FX!$LJW?PZx~ry0F}X z(G&)zE+5&4Xn&>q$zf`nJdrTR__s5cPMSp!?0hzaJ122epP?K(czFNW3Qu-LL=wB> zTIBZ9=?Pu(!|}oRErvvYob7PWx6ld?qdM*Xf|%=Ab$dBh{LN{ zkFnR~*oslhH};<7EJ7e)yBJhcZL3^Db`U#aV{`7q9&mT|b%~T^?tRw7W{1Y&)2Ry` zZ>xk9N&R=~G0U$T!o7@h;DAvK0scNm-QN|9i`-VFYO^Mbc}84!42O<`N{yTRUjMhI zioy?y`mKXpME14Q`O1@A&3|Qf-j|y^Tn(ro8)5%_;h_vL1F}ZEumiQFA4&Qoy9sKE zT*Q5IkR{E#X4^e&+qP}@v~Ang^qID8+taqEZQHi(?(OgXb}x2gBle$-TM;Lss!nFT zdMYCGeY5fzQJM@N3pFk;NmE`@ThQ(=TXGNH7s@g=)odUDO>gCHq@1mW&8s$8v&mFA z-&!||>3YA!`H*9eneI^v7B?^buH-{Y^SG<0R{b92x;{Lf>x<|{^cMv`oT5PlfKLB1 zR6fqY=sL z-@`-yXF87a_R%t9tsr*cFTJa_^tn(};XGpJ`lG4NNLICF^eucuD2Dn(NiW13N?R@C z;h!lP_i*dHrl>{MVLa#+nhCNc03v#dJ~CdW2BYzflH^XV5G0*-45N$>JB(=3%L}Gi z`drV^S6Xao^o~UiclTL2*oh-{vLrs>r-C2PZ_pEk`U1miag=;qk3tusq+moQ=RK=& z5A31RFGdPpR<7Jx*&=$kfJ}kZ@<9&Cpuk&3pw9PnnCs+ZKj0b2r|cnBKAcJA1A2E4<81-3F0>3| zhf5#}2dOH5PfhOT%fueKaIs4)lBVoQ74p$J6-Iq1d91+UL5bUmqwWFy_y}_5=Mcuq^Nz_&!xvLlsDD~iCqX$EHlw-37DpDoO> zeMZ_Cz1%GO-`|o)u({yVNc5j-8_LURIHb(t(L)&&ydh^xUN5|O0FU(|S z^HC6tFro=3?t6#LbxaZiTO*7KNBmvLkyTEoroSf&|0^7Qh-07Yrn-wZ=aVg3kN1{I z55*xo5Vv1m{=Oneklg-U7l6^rlTu4LG#A0b21jeCB?Za^hP?|_3QU8czY7y=PKC2= z!n@&(uGu$p!=!0H2H0920CKvuk z$fwuE{{8&bugBr2qJ$$gSOlh*xpwC|T*^MFZ>-Vy=x!uX9)J*Rs|iL}bp1APzwkvM zE7uHnAaG^ySjrP|V2~9kiCgUyJCDU;*-C~RgFw1c2(c3&NPij8adFKO(||`eKyhHf zPzaVn>eN?BF2{OV9_~!dFB1PtaysA3;FH7YDN;pFPF-@%XpI{m7Bch>e_%~CAd^rx zCESS8qua%e27pYEaCgZfx46GflSN&bb4OU& z-9bt?^XSqc*`)Ft*Ot6U2{u|51kk=M_Zx!*`5spAHOvoTuLgR`9}Xbe))X+1FXhkU zeDX7fb9IA?!B8EZ@$#LNUtd(Jf=K9RpJAWY)@(83*MOVcJW3QZjH;UXPyS&r*a_d_ zT)PPu)dnHRC%dhs_H*8^XkwkYrWa+4iGzmg&mgYyS>=OhF&CvD7jdnGWWy?xDsN{v z{lMf$BA=?C;&O!=#HvkJ(XhjIWo9l?lV`s75lS|BnCuu$-F%W(?slzB`rlRK3QbH{ zst6RzYyduK4Cnz(u;nY^o9j#4M}blWY+5%4^#(@A(KVWuW@Tx*1eN{!2?F3%BqdRK zV8aJyWf9>D!QPCH;~C~l4YPakz-ozbzAn-Fro+UnoukPhhk=O;f>w_UUVPVdj~@C} zf&p?W8!&0==^4gCnNmriHL`7FkyBmy^T(Fl5`ex6q1bv_p}1gdaa5t~TyjdTQEn=KDdzq4^-KigN@Jq=3Q3#<-d|Rhta@;r7?)7%pPlU_4)3 zwNv!0QwNr_(B1gZj{Mt4gfaQLyfb#xWC2}->&Db=))ccMo;DW# z5E_Dsar>b_94@u4GUq%J5#ejVPUjgtK>$xvIUU(zC$BiC4P#bIgMB?vqkYedLW{N+ z$md}{o4rIx^F=!+4j}p=!M`Ro4LtW_LZ>bMMezgD(v6QUy?>T`fMu&(ucHRM7u~0y zN~YPyjSAR`FMAZGlg697i7p8gOz-00a9laK+rsCuv`JY<=U9`%k62%2Iht50CICLo zWuexfU4|O*YVoIfHZ-nY7w^$_dAp)?0-@R6!fk}mU72JqKTausxH1bqw?#I}q-*m{ za1C+FLSg_ujTaOMU(cmilw`LjE78h4nw}V@SS)S1zE(ue!8li?3pf#b%EhIcbhy)F z@Emm^AkC{hePy67z4`t49U*njumJ;GFQ50Es8*V3{d7+{xeRw65MJ!v0x6m9$gsmL zlAEP2TTcEnO3#g*vcYKsJROObvgBU@pvt1AyA3{>y;XQxW0^czO~G^w1-;Sm@9I%i zTr$NY;zgDKn-CPO1j)x~(Nak_(qq+{o!iwQG!;$}zM2D{d%InaChIz-4*>PAYNkAe zVaLc6thD8J%_2kR%J4ypWKf6R;k6IO9H5bvJ$PFERgd9tk2&v@(}W-BIG)la9#0o` zD)Qic6wu}J2%(X8ToPO{f(|#jc*#W|K?XBzhj$z#G&A*?onuUH;u4;r^SM33Zf-G* zS%D?#3Il5>&Z8U>DW*}x0DxK*spuW~&qqd!#1?J(&P#J2k@GR{B5<@MFCD_eH+FhU zu=~Npc5&rH5S^OEVDP;yfDR=MWkW?dGwBTwTVI5`$zWQX$v{mseQ|9YsGZtA2g=l8 z-Ekv>39e~G~is2hco9PIYTF7 zuy2DpAR$r><8(xE*daw&|3O?`mD$ISdLe$JN_mymwW6S}?62?$OV}`!WtobE`6>I= z38F>a6f~avkS?2bK8D|y-`5z=H?yuQG}%U{QSD$>E$L4(mfMT|Q6Z{T>N4S4AHp@r zpL!xDH)ybj`VX9~bpRe?D*NSwu~`iM9$piP>z0E`RZI+fLrWk%uF)7z-8LI7n|8TY zTaPRmG}U^dR;s;g*xv#VS<&8;49DwEqH-&LK)^Jb#9Wa(=#vGC#U|Tkmj3dlGG8_c z&sBX|D;u|DmgQO_@XXbcdBsD>DE*1dTN~E(ll|*4>a-|}u?S%95VG{*6zkmP;wq^{ z>@Uyvi{VaGJ=RsHep4$KWBlEe@cPrJV)z%CqKT#^CpwRB#Wu%kIwzTg5vJbsLcpL+ zxCL2A04pj5$^BAYl;u6^M53)b^%@_d*_^e~4+m&O{w7uWe)8$~=B-P|EvI-Rn8mN?s*CuKYDaco$vB)2uanHEF@?qAKHLVULmrh=iT$+4FR$dTW7SP zNMP*|fAv}D(tw6PENFN`<;>gO&j7g5Km)lHQ_>n@flA^ABhSdtvo7Qm84Uvp;R9IU zkJhx;&x4~psvtTai7^eZqMFN&jD2zoYo~H374?wl2$FhW!7o}EvgeB3Xw$zb2p1HO zCR67x;ktl`i#@=dv%2C$xu*&ExKQ-CA{`Eq+JLee_fIH`a=hf5`+WFZnGs>Oh3!|+ zBaQg-P+J2`V~sWqE~ie6$jst#7Q=ZJlXq(|+5R#e82iQt8Jo*Hh{mLMsW%IDh~oB2 zr}%^%H-qa~NocL^QwJ>N%DOa$LYLh}n)!)o6a|1k=q1GM?jjRO+R?~Mc!YootwXm{ z9ab!}7<-A93V7cp|9bM}l+NCqh8n#E5ma43Gzg6ET90|e!KhN>^ngq4vd;+xDyR<> zTAL4`?$ynOOING`5!%{$AGn~{I;7xab92f0?faGx zU!wpCz2Tdq?C_;=&G8Leud*rU52_5oVr8hPLt_5@JYuYTxnG*Z<62|+hIFvYiL4ka zTgO*A!TAH}^f(3ch^1NmCgmd6dLr)WlaD34r>LTILnzJC&4f-0!tABXD#c!m@5g|; z`LGthjaPXrvPcm{B-#i9Nfq@`)9W&Y4^>>cYVy@hN&QL4Zt!GoSlWcN0(*KiV%3#9 z(P&l+UGBWCMM^JI+SoAjiO>vinVl>JPD3b`iQb^BOc@VJGnqnfQc9Y9)M$bnV(1># z0|oYdmVw!F@bI6(Yw#G@a^Ew;D?NZN(u*3Wmc56@b0s;TY%I6p@7&cQ(_+ilt-YU- zXmNEPqca0niF*D~+i4SUmH4)pXrm_wm&<%|8~MG3Gns?W^RTLUM2*T-t=3i33TLnG!uVuhnteI-* zsz<^k2JBOF=3xPYzrI2<<#OiK9fx;$`fnZFqVF#v+V*CXY)^BxRP z*e4Fe{Y~>#x<@NNxD&~i!4U27Iq!(?dz|u$PWn0=tB3U=n7ja%^7t4u!e>%dGyN!_ z^G;mV)hUOTOgx|BSc$Jx6hQ-r(0yzRuBPFe$X>Ox@f2JGt$75Pjqkf(cS_aiM>su-Q3itGiovfllj5)o-Khyj-S8#$)_UHiccsDoZcEaV3DU1Bv`B9lob zWmm$NQMh*oB%qp7tJ36m^Czx2lLjQ%ZOYR<4J+-L7R%F?+Bu3I@PHEwFO2d~FZAf5 z73`7dWWRu+V@$T!bvO)VyUZR5O$+LIlzO@l5&x`^Uu*%Ifc@B}+T_%VG3sgD^a@X{ zD%tT!3${wMt=!G^kjxaE4HrQl$9L-=%y$ml6qM3W4(?E@l|$EFJge7gIrMOSZKd(108le3~eJwPS{j2(9@ z53@3KV4wPDy=zRlt4k^axzLX50J%&C41!YSINJ=ch)$EVyyI|0)iBl)iS_$W*?MyD zgahyA9iY#b~?UryZnL6Py-7b7Ke;H z&1({n2wsz04Il;y#$wl!Ea_>`FBjk<^Tez0|* zr050s#n#J32~Iny)~Sw9BaCx((3TsOYRZbiR5x!ryQ0=71XShd<+#TUTaAEB8X9CTe02T0=>D&njJ#^Jp-xwjmQ_rMA$`6Ipcz%SE--rv7I?gy5sj%x%4=jc4*=DZWI?4y7Ie{ zm6smWkwt1s$_|HiK-@by1GY(CWj*%*zg5e)fOMT1ljvU}C*i3*AQWTn4W-B|ifHZ5 z)m&>FbTH#yUThK@7{o&B-g;ZZQf#^xK7_J5YE#PbXtgrfMc#CUz3;InCWl`R^TS@E zKV~y0LW`qPJGv2hRO#ttG9jkli43Vt1C-{Zxo|QR%`>NVm+^4NCBp(ac->C{FM?Qp zIjCd(Jrv64vI5E$Hexd=uSLmYGHfH+i&{19lpw6`^2=DOJ|tIcoTOM(_`i9Z z8DYCp-xBgw_tQfJd&okFw^^V9V$Zz$1r$oFe&+E=;_<$Vi;b^dI(00Ncv{%}w)oPF zpTkYCEXRNYcUR!|F)8aV1yfXaz@z<;ln9T3@RisqZnSt84iN*gQD0^?ia;B2Mrwey z=Yt>pauFX2Q^z*Jqyht0;I8~M<88sRh`ck7u?)d#FLCKT37>~Sb`Kr|STul}8nFsi z;2thXovlq=JckL78={-v&~SMPvZMdv_5d~3UnRwX_0rm@2y%bqvJ2(gJ~e6Irp!7h z>_LsW0H+yQ5b4q(v>T8-gq>9?kPZa5tbS#tK0!zIDbHycebF(lxXg)K;x7}vD*{&F zg=@hUqoj~&$ds<=QFc}Zm~q45ptwcQXfXQow(Bivx61Y~&i|oFpEWnCyrqy4%Xr%_ zN4}66EH=q^JPnXWy8wkA2&_t;bXDu0BjBe4|4<2E`!$hr+={cMgMx$C_b^m`%U>HS zOZI>_M>E;j@MB?D{86#WSUm_`vJ&}zS<`pDI(V-JC3+eYabGA6urbfli?nxR*pn!=n`tU#;lt1m6rQ3|JjaTiG08oVKxcl(z_Zz@aNl*I^jQHg`Q z8=>KlKZqF{Il!a@pnSWB`nWs$g{@dLZqnjrH`4XyA4ESn_@&uvJ%8@KvIF>9cNjya zxBW_;^AM^B{itE~LyZ>|9+(q0v`&^vvYRi;)3AsXhhDe=cdUk!Yu>^O1#hCP&Trm` zg0A2Q@^AbMEfJd6Od1PX0QANKBHT25 z)GDK4cnAqdSc;v|w$#@4wcfs)Z&lJ0i+N_~cz30B+L!69K(F?PT&o1;CD}!*qb{CJ z0gPKZeOFbJ*SYAEoDxiA(`S83QX_9kxrB4Sg343xV=tYg8&QT_`#s6HrfWL|-d4JC z^}mGamD5iE$NS+8DfUxSkTC>&UfdqF?ago7nvsEj|Mmj-4)~x?N9emTg!exOq!Dt$ znkOtSj+z~c9*rnl9-hBGWRbceZn~M5>AlB6P^C4GoF~hmuN(iq_4LGo&(}^WofY0# zj6|}VqYHSj(hD>j7tMxK4y!WL^b05V`+_rj8%Us0b#RU%#7zw`Of}Sx=%_s z+&Pd8R7xF4!ya@kyt{;nMfSW|5ekWy70mCN+gsS2BOX+h4;b0I#elKhogwse)I{ zng}ijPzup#=KK+IaK5lW@7ykAm8j^(a;^%uaBsB;K-f5WVP)oW)hcsWgClgS3i#GT zBP!oPSK`mvRxk)tPL}4Ul%-D?o`m4 zUtD@r9R7G|N=u)>Wd4SW19SUK9{Ks^Lf<7&Im-j1=5>E8Xc^DL7t)(m9u5TV$W8hX zVH}w%k>H`O$$a}8AD@F&_(X?;2g@r6dTd(GBP@;8 z9!F1!AsD+xQzrXg+6b6ugp!U2Ak~DFZHcTYMRVM4y{{A6bw(KvYv}ZS7&9}N2y?nD zU(I_v0v|io-CqbZIiH`g&wB{3`tacZtX1Zj#gE!~ntr8l@;UJ0%w2iSPO`Nylhb`Z zH+XIaXv)_({b{ZQUE#Q5Ai^=&Lh3u^8-U`Dyit)B>ps<-FRB0@RnqHTB_8SxlV1L8 z(?L&OI7P1Xi7-K3dpYV}?u!R|zbrVOzMVoCncqQ>&CQ1{!E`I-pIw|EBp#rER>%YK z-Ix!MFKj;Nm7%-&1nJ4bj@%ch>bs#9)GC~`ijmgx4B?+J(mD-PBeS3WH7&aH&n`QB zRxHT`wsp5Lv~>&P1{cY4X1`t9j&_LWAqb*zNr46d$9O5K+c2WmA5hq1VaUbie}$0( zD(33>+c^hVSg})FeOCF5D5c&3dp+(5`Zo5qHk<9uO-$V=_(hS|PN$`Q)}}es3jQ`| z;}G=mWG+hJh-$yNs|&j=Al;)&k#Xj+WbCci_O^>}WE4_g;xanu-NXaL)0ycyn(GtZ z#a-yG=O+Mry)Ey-)YPwU`Zqk_lTFI#SuvyVAz@xwKC7>N=}6o+%S4^T$>-|>oSY(SXRfzg1L5sWXtBhJ49r#Wt=ynt z<0u$y#b62oP!)4b+pjzznIvfX9Uq>$>H_E^J(Y(Ptu!b;W5J$Mc;pJ5ny3ZR-mHTA z&Q|KeADv*#RG|mC$%BJ{q%_#k?Wif=rpC54MQb1?BC%{}@lCy7zZ0Bg<#6l6fbP=O$TpuVq(fS%zjelX7e00QDN2Li%M zP?SRlVPZ*$?!p6P#s>OB(P*H%7U|_)NS$WwaT*{EmD!>%mtSqx_8F=wM5vASgbi)I z-wh?qY{;n{r&*JzWbM?*Fz&J`2bHE^eZHD*zWk1>ZJ@U(vdZ4!<9N1v|J<;sxL^Il z`Ax3eIC4F@YK93GT-j1sT!F3ECtKD~h>rij%ougpa2)|KK@$xu^efCCq%$nFH!Q6~ zjhsSVlhj*7&-WCgJLaI7NhSGNr|l4b`cQnrNQNW0pO5Tzm4_+C?xV9PJ=fvi=58p9 zwQ9*p%;`PE`uQP7PL--Ap40@ppS$3r`ALWgmY5}(@~{;My(f5QzQezbh1U5~DK%4L z25Zrqgq9D`ld0>~f+Q9Uh}-uIRD7M5DnXeI+cQ~BlQkM2;8ONw0?rW`68=HZp(1LXRxHfzxAv%3`PdC~xkB$4; zA#4E8o8p0xaxy?He888G!tri>sf9CXh{EXr!fg@{Fj`LH;h^v@#@PZmOdUTRGlUM5 ze*x^@P?ou|7QZ%#7PRx7Rs_``=1PxKiZ3V5cHqysQlVDOjOeG5anuv|y&g5VDR4~W zX%1-oi{+h+qi{9&-1ns4{p-!~8F0HdR)Wy|_1LZ64e(j!?RfpnVfgyw|6JH=l1Hfa z{kXX?e0v_dTMJRw|9blvvj4j6`nV%NvBT&8^~|k%^K=q_bLEauE&j=WOOUha7O^K5UNSsUynHT*nc2b2gq+x6Jmcmf+A2 zMN50|pi$pyy|&iQuFLFZOM5s_l{S1wT&Jqb66aoLeWkioC5=}topm_B&XzF4j-Id` z21VPaB)T-XaI)xX+qNI{-M-G6XMqjHlcB9i5q95@uV`_2&r7=TjkV;kN+>~y6+J<2 z42n9LxQ%`D(C%W@Wd!#7;igOYs!Ot>Rn|BQ!+l=T-`vuC4{94CNB>C<)xXI(D$@Se z?N)e6)?|h4Az>>cRBP$}Zq-X#pt`c;`y?~H9U`TD1cZPp{CM?w-qm`kSVr$SJ&d-! zSgU~psj=$hsBvLlZNoC=jLNlyZ=$T#Iw5WZpCPy?v?|KArO|qhOrYHiV3rd_TTzsp z-5EA)YEyw<_T#&?F<({5eAL6Y9ajHt2YoVeIU7Amvzqm{?WW_RgVo$$BPttzAIXVR zYAf4n@fVe?qfLYL4;4KO13IpzA4XN_2_u8EPlZJM|-YAM^=~n-E zjsL7AeYFhd%u;SbHz2|9+t=R#;-VFEvAsKdto!IV3~E{#ue0+4HMSSo13*W7tYvvs zaqEPZyM?&$9 zA`OK10AyqMi@8lYe^SlIk{tGsAsCBSDc<|vJGa}YT3V_OCI96F&Vo&jODrgH=je|vtVSKu|J$W4HdP_D9cHM*JQ zcxv*9Yy{PM2OEm-v8p3{ii zm-s8v(}6U-)LqHrAk2l_lk|U?!3GuYn(h{3UzxDtsJA#0Tbh6`BrETtoVCxgrp;Sl zIdnbVgx|-qhU?5BAA8irmT@ZuOhuX?IE%p&K&aVnN%FF|nl^D{dI1-C8XMf)VRIccH~h)sf2?gL;>z)eVClYlHfW{fKM^54%Xuu6k84@> zNg(?V>*%238{3WfYdekj4O#L-y!Z`8ZVj)b2sm32=P2ap`|smWFr4}Jef>ufW= znRgcK@=q*8??I&~On?wlUPe3iyWvZ`4`>I|+(G|Jbha0eqz6oSMVRt6&4mEzjH926 zawqV{r{vCo5aKaKq;59)-b^ee?ewc5P@F@yf;vFX#<>t@N#T#A7>tA9W29VSipn0b z&1WDc_uDEX5ZfGo_#E#GrbN$!kTS&nnOtSuxp_&k+-bXS$8EwT*FavF=>x-2lGk}% zJ_t(Xck?7Fj?ryP_1^8>|C^#W4njzDafwN8!zEioYE=>f&0dIKb5At}%QXMv?Tf;_ zr~*^zUoRykbyK^s!}VQyif>lH%7?z2T=!93GeKc8cV~&C?zxBV`M!}e!v9p0fbuGp z^!!k&wYF-ZEhm9nitJm*FeD4xS4SM$P6vlrBEhSVuTD!4iP5UkxL%2J>s14b|F$ zk9emIpAw0O?^vcp&w`MUx(`hoa3H|bUu~{N9_M8fFHg%Lc%AJ5cY1qolw|3QKg247 z{Szeu;>YV~s@`Y@HVx#)IR>`nSe=@Cl~afRX;qb*M?lZNxr+GPRix+7N&)|1gQJG1 zc9ri0zN12Es6vS%#VM;V1MOeF!sBrt`fE7k7eF?{#ph5%^k7qr(5D-E(&vC-^vamB zHU~nF-^-A_>8N37!TW9rXz|X_f)kaJnEfyBG7eO{SgUbI&7Mb3EF}#4Bf_I_Gb64P z#cbMsT#DiZ2tFa|!A&$#&y+PkecgoMbV~8oz$UWCf;L zLZvVlUC0<4=iFsg#KeRUEK${GhYnLsf$aM_#ER904zXrH9#0L`%t@%xJE9v8vLNTe zkIW3sRCmKUw;Jvn3WYZO7EOk!;$an8J^3WRjt*>x0=P>GWEv9i6@Ji zxqgGdDq;n~B&j^cuQ_DRgc&cSxq4uN0AUcNGXHE?ygv1h6mBj+PkpUSDn=`7n~sIv zh%&d_cnMSnO}T)GBn<2gid(<*E1n^#u_aN#Br=$3z&YEnSZ>B@=rct)T)8yG`)E_)q?=M#Uev;EwDJ-Tc7I$1VbcZ^t(>5B5j(YWLmY%FBzLWN#5 z5bZCh4j)qMPDRfZ?iB`!h*KJ_^jMwrr?na3r?y9+J+(Xlkere?#CY>cL1@q@OSuN; zF%>NRvAYA4tIYHXOqq6GVO;v}OnbdAPjQ8KvvU&g7|YtUyf^kHUvP8C>=b{#*A-{w zdRGA_Q;iH@S@jg;8%FBV*i5i&3l~?sLd~jD#YuFzkq~y?gOfM}TOo9(jSER)isPT%er!>EI zl@g#7K6L-gBEU>rzQp$#W4<@5`9mCUojkiSrUmPjTt&WRUBch+fC6|=o;SQLwt_*2 zoG-rsEZOAx*NkQQN_m}oZdXnaQz`kVO<-RNQ{cmxK8l@EA5a#cHYjg@&$x1YmQDgW zqSsCy9lGbPHlDMl-8-eKd9q*g>ANTt;#8r_?}z;?-Ojm_Y9k*L16?K7zil#`$zIUJMyq$aJP4|cD67zb#Z3UcQUnc zX85-YE_x4J8~T5)17mxv`WWGYuL3#)ZulJA`Y=hP7}jz_bj6>5$}2hb@VGSO=DI$> z)(nDr1Tly{wirGx9(l!Fd&h|sOE_E$(Bgm6$6npPeFBQSro&-l15%-QehDqEeLfcd z>Vpy!;7jwzy0`+}z)S+t6oPm~`d7 zS{JYQFhxK5TCv3RA1Ew``wG+%5# zp&I=`@n5qPDOJlLOu#HD+shzdX#Y8H(Sw25B?k!vG?;MGNC|jn+lwLF+@7*Y*dR5@ zO2ln!I#*OK>;D-dQhS)EJ_i!=S!Rw1cmRskAWs_I3bv!m{=yMJRr@mk=Am9 zkC6E6EGc=)_Vv1RxtZ-u^^!=1?Tt^??^3ws%Zyx3C7nwKSaVXc`p8QrMk1L)+r7Zj zzRRrT_&OokjsT#BmO)=cZSs-{q`20o(FdS{V!jsj+HL)h*ob6 zvzd7CcfDtyD3OtUEndhzjxd@T&}Y=hMGqh}MeK6Fm;tS_20j`y&bKE$RIcvNyx{X zZa%>M@k^h6U27w?j2$GIvhw9ZjQ-ch2gas;H{kR7^oHYPp5msrzx(}VET#MFhWnvr zcO8wP>(}k=Ndm^!uZJV~7`)XrT)fn4qOjWQsvYAi@(4q}A8$9n0$Kfx!u|1rNXKra zmt(^qdfJ4iy{q~m+KR{1MEV=5tN-I${ribw1$YI5tJ+sQ)wIY#t740IS2TOd+yRtQ5 z_m_y(0iknbB2ETmO7smPMxkT9ri6j3w-cMT)qSPb3w%B%B!=ILF#3j;9Sn|H&?}xR zafvdq;dMor>@zz7dL+oJ7)V9E!l~|F0mig}GKbtD57;40KHtv5qA^?sNUw}9_kr6*E^ zzM4+r)pkUtbrN8>_}4_3uJSf5H%^4H@NnOiC9Sq&D!W7uVtP08J8MiEvWy+I0%p{S z4U+KArT@?jPpUp-8UUNdms>AVIi*0+m_FSk+SZucJNkQ|Q-&dJ6~17LZb<8L9%QO` zWkvt^xy=T0K(HS%N3{fg%oyL^Ep-+JrD>kxg?{Oy>pqJS|j~bW?tD|^#AH{bE zc7_0t(Y|?0h?HWzN7Ylg(&fI41Azn*!>q+$4n$7W9gb=8%3)XFkq7SIh`$) zc0G}VZqJcifP#57W*SaQ#B}3tX1MHwiU$jMu5n?AD-BxCbmg1eokvX6+&6vbpSJWe zSn&844=SA~kre6TV=ca`&C2;R-(wYb%@hdAl{rj9Su-3(S4>6yAHt}5=7D-EX&N&w z8Z!!~DS2Arjt4M|wrFS`2Y|`JNyO%~QsAg&sR_hm(W6ZuK4~SNhd2Nh*)2Bu=R z9D(1Ca+Skp`M?(5AJP@v-cEw3m`+gcBMziO4Gjhw$mp=&5dlu86HI;?HE3}MFYdbr zqZUgY;j>(c(Ingv3IMnKRFmvpwy>)48F?B4O!<}cp1d=9-qdo?$4>bT4uXYIX9&wf z^Wp*O(|MPKlMtSL_=;PR`8w(%yAL@!rz&gu)*r|Vp3)sV^S>fMdl>0*#+iR=cF6UG z*VikqHL%b^!O73FKij&BbMoC(Q3woYjcd6I(w<3YJ-?2wcK{a5Al?0Vy&M3XB}&H% z!uBa7l&`Zm!-?z$5$g$>QBYeQToiO)zEn1l8`8^kiP(nSh$;a}c}PtaL2j68V;?m- zr>@ip+XiupIzQ&lUV(KCr^VbXtB028FZT}UCW4S6B4qW)F&e-3hwjo@@o~IDBFuVg z9L?3Vb+ZaGYXtC7f_2IjOrI}u2kBL6U%`8A)Xd=WUU!nf|5#nHQ#j**X>@AVhO#0v z^)1jWg-nv>DQ(92$o(LsF*Z1$`eo7u^kmiE^z}VL`9CWJAMVpI+28+=e-CevfS`a) z?2Q$i>>ZpLjP0FF{~59n<^#ZhDRY6o+x#~j|74#3JCA>t@1yk7evJ{X6X6)Z=#ovs zby5=7BFJ&y00f$z*JoGWPpV}j6`R`j`BYRnFBNR``v>vX9?HY;%ZIkIc{O6bqgzjS zm;si?K|^f@_*8sGS{2`(rqHf^ z0B<=RE3;gvA+%2Wv}7TpO-qUu1;^hKVVye&1*@?5C;wIgv=t$x3dPwg5k4r3fxKV{ zT5&yD7~g&3KyqI#Mna15L4%_c`4Bhx#zyJwVc!Td(k5FTOLGyNc|Z?<0l*8dKM{4& zsr0wJRgDb$PhR@nUXq>T*DVHW@jWIYAQwc^g$USKko_vxT6a1wwm#H~RTM2!0$Z<~ zM+UJy87YNzq7nFGT6GF>B(PE&Fp>gP?BTwTYb)6)aw@0lFcL43p^{1#`N|Y z)HD0nTbGx~f{JX3=S)sg3k}1``uj;1XT_DSblBna-WQsAYs>h+gY93IB#J;(vy= zp@YM}kp2G#?0=8{e-j7||G&$PqrU_FPUWOjuY#a~KmjKJgP{Nj^Z(zx^Z!Y?|8A$l z{D)ojs9;RM|M;ibuLb1!dxQCZFRzB7L|34Fw>)D80zv_z1TuDYcCokBu(e^ZbTPGM z`WMJZfhcnc|Kn-@m$P$iTjw=)8tPskrvEE5=t4D+HV%WAWCtai+etL^r9h(L7N zRKi3;0PXC_k0)(JpAyQrMDLSzox41w5nWpJhz-ao;wxXybC82H@!F~0Br83va$%A2 zPy+s{`9SYg;g6jUp7E5_pv+*OyS5Sp4;gn!zmV=~71foz-LIq=UvZu`r6o8D9z>b$ z@{UgJYLz{M)a#+tw8<#fPCd^07Za;Bj>#xbfHl|S`|E1k%dzZv@wt6aW5QttTa@Ge zl_z%^0;`H}4mktN$R8l(91D+yM6bU#2u;N?Eb35i#q(+05QF5dHAk~)Vf_ptlW{@1 z_Q5LPJ{W^CQW&e~i`Az8u=~k^W6o|+;ESoWDBU6vzQpJVe*tlY| zg9+AaA}47_GHzcqi9|kVvSZQYN1o27Da$6RE0LktcTXFW&a#U-c5wAbyDP0huTp(; z@6)<=+ZoKTZz(vC{1aZIEQxFi@^|Vcb6#&42l>ZwiwFDKH?f>CjQ-nI!zh037)7kYy@U zj){z&Xt@#I+)mDBDr0-3|JF;3S<`NM2i>uw^M}9UVl`3;PTZKd6rk(FG;uwKwGat; z#C7kgKbhe25n&2Z6CiQ(m>k!I4Im#2p$n&c37Kl{9*lkWZvW1xi~M;O(wF+)N`dwI zCRqdvmwif})n|XL{n}61pF#q1UQBM%pZCMt7@=^gZWsfH=mSrkT?3HUfSW}F`cbE8 zHZ6gEu{bXx1(fz>?GHjw=Nota*>L{T&9q!V-(>AY{3!O10hy?{e;PFceYo(tCq)MCYus3mVG?Tza;F$WCTd>Ym_h)8b1gH?SPi^ zC|~A6noBp z@9(5B?DldSULeZH=oJ-b{X%(d&XarT2E@&NtVn9y@MqwRZQCo>k9O+rsYsp=wI9vE z8}jdcjAbwoD=;vtA22I0NCP#@vpct(-8`R(bT{&|V+TfhtmQITq6J`co}Ja(Y@C%< zA2CXf@3gJT7$=$LVcOzJur-z`Gsx1I8F;xBNaz$Z-6NlFc$}Hfey0`IQ$v_&vraP9 zgFbyVn`h=aFrBcD(J=Kzwr|+YJlc|>27Ux*9mG6z^)V8VU(G;^Os&Kb`PY}~a&_+j z!fcv0ka3?V#HRRFZxPTUW4(C-uQMQPs?&?)B&lRgeIjl2a7Djfg5$OQy_BEyo~8uh z#>wuL;0Ld8s&amzTf>tDo6ObIhRvY0=vx418 z3o542rm zIfC<;&DvPi1eNjC-oEB>rPLt~yu-Mf*GE<&CzOla-LU2zn?K0NREcu~RDV?73va{= ziGB1d#^mcvqK;c$g&g(l-41vLRf~pdrVwbZaJ`OjWkhy%mD!I#r0FF<$%>v*%OZF$ z9Z2Rz#TnX(Z3w`4WWxN-nvfyoqdj!;Q)G|MTWaU|o5F<8be-QRkMpmH{I=I?W)q`8={W#|TmmX2a}scFbcygOrUSf} z`}_rzK>apOF2ej|lZl1Khyt{3ilH#$FN??+Qwv#jcO|MP|n zRP7l~APYl3t973j;a4yFND;t@)AkItAif{orv(ClIO8IRwO7^m$M}P09P#-&%x<~O z@B~a>h@QIL?&8w;aM2jWH)2QmXu-C$zQqVzKb+h%8^@lbn?nz^!K28)^yl>Bkmt#< zl^SwKe=I*|gq#X-eSxObZ#zGYIPBH!{J|_dd-vXJe#A>17jpJ0E2<;r(g(lF%`iETF>uxn}bL(726+Y3TIX$=BG?E)N`;EQ;&pB@>^z zjuex&Gw~_1*@kV{5}D$}69gvvD|3m3E1s)cELf%*&$s>t>;bhJP817?qnih14{NHv z1#ll{9f{>IC(6lRwV7&e1aW)Z5#56&O8B5+N@L00#4S$C}!T8k2uC?aR**w@?PSerK@;C`QbPtG2t!P z2&znXQQVpH{x&$>>T>XhRZR^)LQY2Heg2ThxB1GQ)Z~&p37JP}V%@rKMs^)6#OtfuVt52xdtIKFX zGYTAj7MbQAaaE_lO}3=Hzr%Lu;+~QRU^20vSuau;Yuon<(&R$GqMBI2Fm3DF-ng_V zr{W4Q#EyP8E2R6W{-B~frEIz%^;31WK81|7j07Q7zf^+6k*7`(?X9p&7RB!kfD)jr zPY-KzW1;Cd&=wvavP>KMqM>Qg_<1t&IxH>IsM@-mevd5j=p;09V1Mhnei% z!T3M6=6gY6<>r((ZsM2zu6$H%n#B^K!LuWUEi+Vd-}y@$XZsXq7w>0O5@Pn0KE5{J zbHe-^Q&-M)O%JvIc0Tmpf8cO9xce@HvcfO6)LCpBuuXXqh$R>_rZ+rf5}E$sFcT}V z0Z&}Zlc)DI*C7J|*Y8dL1=8d%|5%eG60N%TWOXgXUnTt3c?Vo-1={@G}Z~Eo! zJIwnQrW-9tm*h}6Uh2QL@%P$EmK_4RSIZKdn2!|L_^AK3dXpuc+hOx4&2*7?=8NFC z^KAQeoqAri)$-&jjqOF1k=Z+S#de;Vw(G)Er|CzR{%Q2c@-hcbb386y9#SA%C7t%i z#cRXEi??UIx}lXf>)ykecTX$3nx5aZwP^j4@BH=+R)2uKIiz8X>5liAL~YTV-bSP} zy{GTm!Zbw^(W?KyZj??b&BRMbn0ACBOzg@ilJ*9=dnyyQeu6P6j@_=moyngO z$+gbScdnr&07(sE<9_;{qfEP`5DqP|x2!q@^tuMnv2wsJ^Yo5eOmd@LL12hLz+^?{ zV@SajGfiFTFi-{_T)g*2gA1wWJbA|6<4D0({h4VoN^qS!G#Xq;!8QHOA*Q1qj7+)= zh#Wc9WHG}TU~a7C1r;6WAlf-UuOv0EBtE3FAhkFaRFDLCLk*bz@*$I=4J!)+17sE& zJogNjg)R_Zul3uv9%%d&ZUzP^6w@u(8Ky70&m`}Q>>8GB2R@YnO-uqR=SNZgofAIy zos^%Sjp7ohU3(lNvZl|!!z9Kui*I`29VXG~XYMd@Y9O1xvVPi(QUL~ruNk1)3>kDw zgS8lf%VBh19L(OnYmFcS!_RzlZDu+UZQwE%UE7|nBfl1kF)&=6fv!!$4&p!ubO)L~ z{%4mh$-wY=DY};TAs{VsDBcO*V0+05=q|oobk!5`Anr257Er2}A{^O7fz`!CbZra` z5O?L>Mhm$A|2sKDfJtOg0=gEPsSukiu-WvzMQwh&5Cem35xTZxiy+#-%NEcB?&hr1 z+3SF|t%w2cDnO1UhUTph2j<*k;z9|El5I{i4*)kJoCd}$s+NqyU@b<5;PEnat3J6r zNxBWRiZ2;mU;HJARkt28ab+VXqI-_tb{TzSWRP=b17;*-Q1}3xNQ*NPi&9g9ONuh{ z(u=VL%MavT6UYWIT)oINxzI+W-Vkeo0xyDNWng$C$G`w|GZJ|4fC;oTq`0IqCl#xe z=<7%jdS#!1wW6#lk-@U81RiprRTbjXs~$0N)yF@_)C<=N@dMUk0lxl10ln0j`T}fX zNk(dJsy>*+8f}niCE&0qWL^p38wLiE4@?XgvrGubKfB4KDEsmgk{al6Jwgd^m|BsU z?<>Z3?96DUqZVV+#ehXM^DPdj5q=MuI9b8&o_-3bo%szX^YnN3nIxcM zy+@hEky6(LZm>34L1dqT8*omK eD8M}Z>>(z3u>fyYHjvkpfiN9dtnUzF2J!$CL7xo( delta 159545 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 diff --git a/backend/app/etl/data/pub_data.json b/backend/app/etl/data/pub_data.json new file mode 100644 index 00000000..26555835 --- /dev/null +++ b/backend/app/etl/data/pub_data.json @@ -0,0 +1,5735 @@ +[ + { + "name": "Top 400/600", + "organization": "Gemeente Amsterdam", + "department": "Actiecentrum Veiligheid en Zorg (Veiligheidshuis Amsterdam-Amstelland)", + "description_short": "Om de stad veiliger te maken co\u00f6rdineert de gemeente, samen met haar maatschappelijke partners, vanuit het Actiecentrum Veiligheid en Zorg (AcVZ) verschillende aanpakken op het snijvlak van veiligheid, zorg en het sociaal domein. De kenmerken van deze aanpakken zijn maatwerk binnen een persoonsgerichte benadering. Het AcVZ voert de programmaregie over een aantal grote integrale persoonsgerichte aanpakken, waaronder de Top400 en Top600.\n\nDe Top600 en Top400 zijn twee programma\u2019s die als doel hebben om het aantal delicten met een hoge impact, ook wel High Impact Crime of HIC genoemd (overvallen, straatroof, inbraak, zwaar geweld, moord/doodslag) en drugshandel-gerelateerde drugs- en geweldsdelicten terug te dringen. Dat gebeurt met behulp van een integrale persoonsgebonden aanpak (maatwerk) gericht op mensen die meermaals verdacht zijn van en veroordeeld zijn voor dergelijke strafbare feiten. De aanpak is erop gericht om de criminaliteit te stoppen, de kansen en de kwaliteit van leven van deze personen te verbeteren, om de negatieve invloed van deze personen op hun eventueel aanwezige minderjarige broers en zussen, en hun minderjarige kinderen te voorkomen, en om de slachtoffers en de omgeving van deze personen te beschermen tegen alles wat uit het criminele gedrag voortkomt.\n\nHet verschil tussen de Top600 en de Top400 is dat de Top400 zich richt op de groep van 12 t/m 23 jaar oud, die strafrechtelijk nog minder ver is (bv. minder veroordelingen) maar met duidelijke zorg(elijke) signalen. De Top600 richt zich op personen met een stevige criminele (HIC) achtergrond, en die niet (meer) op de Top400 lijst voorkomen.\n\nDe Top600 en Top400 zijn twee programma\u2019s van het Actiecentrum Veiligheid en Zorg (AcVZ), waar een netwerk van (overheids)partijen gezamenlijk maatschappelijke problemen op het gebied van veiligheid en zorg aanpakken. Welke problemen dit zijn, wordt gezamenlijk bepaald door de organisaties die samen het AcVZ vormen, onder regie van de Gemeente Amsterdam.", + "type": null, + "category": null, + "website": "https://algoritmeregister.amsterdam.nl/top-400-600/", + "status": null, + "goal": null, + "impact": null, + "proportionality": null, + "decision_making_process": null, + "documentation": "https://algoritmeregister.amsterdam.nl/top-400-600/", + "competent_authority": "Actiecentrum Veiligheid en Zorg (Veiligheidshuis Amsterdam-Amstelland)", + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": "secretariaatcvz@amsterdam.nl", + "area": "Amsterdam", + "lang": "Nederlands", + "revision_date": null, + "description": "Om de stad veiliger te maken co\u00f6rdineert de gemeente, samen met haar maatschappelijke partners, vanuit het Actiecentrum Veiligheid en Zorg (AcVZ) verschillende aanpakken op het snijvlak van veiligheid, zorg en het sociaal domein. De kenmerken van deze aanpakken zijn maatwerk binnen een persoonsgerichte benadering. Het AcVZ voert de programmaregie over een aantal grote integrale persoonsgerichte aanpakken, waaronder de Top400 en Top600.\n\nDe Top600 en Top400 zijn twee programma\u2019s die als doel hebben om het aantal delicten met een hoge impact, ook wel High Impact Crime of HIC genoemd (overvallen, straatroof, inbraak, zwaar geweld, moord/doodslag) en drugshandel-gerelateerde drugs- en geweldsdelicten terug te dringen. Dat gebeurt met behulp van een integrale persoonsgebonden aanpak (maatwerk) gericht op mensen die meermaals verdacht zijn van en veroordeeld zijn voor dergelijke strafbare feiten. De aanpak is erop gericht om de criminaliteit te stoppen, de kansen en de kwaliteit van leven van deze personen te verbeteren, om de negatieve invloed van deze personen op hun eventueel aanwezige minderjarige broers en zussen, en hun minderjarige kinderen te voorkomen, en om de slachtoffers en de omgeving van deze personen te beschermen tegen alles wat uit het criminele gedrag voortkomt.\n\nHet verschil tussen de Top600 en de Top400 is dat de Top400 zich richt op de groep van 12 t/m 23 jaar oud, die strafrechtelijk nog minder ver is (bv. minder veroordelingen) maar met duidelijke zorg(elijke) signalen. De Top600 richt zich op personen met een stevige criminele (HIC) achtergrond, en die niet (meer) op de Top400 lijst voorkomen.\n\nDe Top600 en Top400 zijn twee programma\u2019s van het Actiecentrum Veiligheid en Zorg (AcVZ), waar een netwerk van (overheids)partijen gezamenlijk maatschappelijke problemen op het gebied van veiligheid en zorg aanpakken. Welke problemen dit zijn, wordt gezamenlijk bepaald door de organisaties die samen het AcVZ vormen, onder regie van de Gemeente Amsterdam.", + "application_url": null, + "publiccode": null, + "mprd": null, + "source_data": "Personen kunnen alleen instromen in de Top600 en Top400 wanneer ze voldoen aan de criteria van deze aanpakken. Wat deze criteria precies zijn bepaald door de gezamenlijke partners van het Actiecentrum Veiligheid en Zorg (AcVZ) en staan beschreven in het convenant AcVZ en de daaronder vallende regelingen voor gegevensverwerking die bij deze aanpakken horen. De criteria zijn beschikbaar op de website van het AcVZ, net als de convenanten, regelingen en wie de partners zijn.\n\nOver het algemeen zijn er twee keer per jaar \u2018instroommomenten\u2019 voor beide aanpakken. Personen die voldoen aan de criteria stromen in, personen die niet meer voldoen stromen uit.\n\nTop 400 criteria\n\nVoor het bepalen van het instromen voor de Top 400 wordt gebruik gemaakt van data van:\n\nPolitie criteria:\n\nAls verdachten worden aangehouden voor een High Impact Crime (minstens \u00e9\u00e9n keer aangehouden worden binnen vijf jaar) of als verdachten worden aangehouden voor een misdrijf (minstens twee keer binnen twee jaar)\nZorg criteria:\n\nBevat minstens drie van de onderstaande criteria\nheeft op de peildatum een justiti\u00eble maatregel;\nheeft op de peildatum een civielrechtelijke maatregel;\nproces-verbaal leerplicht of thuiszitter of absoluut verzuimer of voortijdig schoolverlater of meer dan 3x schoolwisselingen in de basisschool leeftijd of meer dan 2x schoolwisselingen in het voortgezet (speciaal) onderwijs;\nbetrokken bij huiselijk geweldsincident;\nals verdachte aangehouden tussen 12 en 14 jaar;\naangehouden voor APV (Algemene Plaatselijke Verordening) overtreding dealen in nepdope;\nmaakt op de peildatum onderdeel uit van een geprioriteerde jeugdgroep.\nDe datalijsten worden aangeleverd door verschillende partijen en aan de hand van de criteria komt er een lijst van personen uit die in aanmerking komen voor de aanpak.\n\nTop 600 criteria\n\nVoor de Top 600 voor de categorie HIC spelen de volgende criteria een rol:\n\nPolitie criteria:\n\nVariant 1:\naangehouden inzake HIC (drie keer of vaker binnen vijf jaar); en\nverdachte geweest van HIC (\u00e9\u00e9n keer of vaker binnen twee jaar); en\nvoorgeleid aan Officier van Justitie of Reclassering inzake HIC (\u00e9\u00e9n keer of vaker binnen vijf jaar).\nVariant 2:\naangehouden inzake HIC (\u00e9\u00e9n keer of vaker binnen vijf jaar); en\nverdachte geweest van HIC (\u00e9\u00e9n keer of vaker binnen twee jaar); en\nvoorgeleid aan OvJ/RC inzake HIC (\u00e9\u00e9n keer of vaker binnen vijf jaar); en\nverdachte geweest bij een incident (33 keer of vaker binnen vijf jaar).\nOM-criteria:\n\nVeelplegers: (\u226521 jr) veroordeling met strafoplegging waarvan \u22651x HIC (drie keer of vaker binnen vijf jaar);\nFirst offender jeugd: (<21 jr) veroordeling met strafoplegging voor HIC (1 keer of vaker binnen 5 jaar).\n\nBij de drugs- en geweldsdelicten worden de volgende criteria gebruikt:\n\nPolitie criteria:\n\nLeeftijd < 30 jaar;\nAangehouden inzake handel in harddrugs (1 keer of vaker binnen 5 jaar);\nAangehouden inzake een geweldsdelict, bedreiging of wapenbezit (1 keer of vaker binnen 5 jaar).\nOM criteria:\n\nVeroordeling met strafoplegging voor een misdrijf (2 keer of vaker binnen 5 jaar), waarvan:\nStrafoplegging voor art. 2 Opiumwet (1 keer of vaker binnen 3 jaar), of:\nGevangenisstraf voor art. in Wet Wapens en Munitie (1 keer of vaker binnen 3 jaar), of:\nGevangenisstraf voor zwaar geweldsdelict (1 keer of vaker binnen 3 jaar).\n\nEenmaal opgenomen in de Top600, stroomt een persoon weer uit indien hij of zij niet meer aan de criteria voldoet. Een persoon kan niet uitstromen wanneer hij of zij de afgelopen twee jaar meer dan 180 dagen in detentie is geweest. Eenmaal opgenomen in de Top400 blijft een persoon minimaal twee jaar in de aanpak. Daarna stroomt een persoon uit mits deze in het voorafgaande jaar niet vaker dan \u00e9\u00e9n keer is aangehouden. Een persoon kan niet uitstromen wanneer hij of zij de afgelopen twee jaar meer dan 100 dagen in detentie is geweest.\n\nVoor het bepalen van welke personen aan de criteria van deze aanpakken voldoen, wordt gebruik gemaakt van data van:\n\nGemeenten (Amsterdam, Amstelveen, Aalsmeer, Diemen, Ouder-Amstel, Uithoorn)\n\nInformatie over leerplicht;\nInformatie over jeugdgroepen;\nWoonplaats (feitelijk verblijf);\nLeeftijd.\nPolitie\n\nAanhoudingen, APV-overtredingen en verdachten in onderzoek(en)\nOpenbaar Ministerie\n\nVeroordelingen\nReclassering\n\nLopende justiti\u00eble maatregelen\nJeugdzorg (JBRA en William Schrikker Stichting)\n\nLopende justiti\u00eble en civiele maatregelen\n\nAan de in dit register beschreven criteria kunnen geen rechten worden ontleend. Voor de exacte criteria en juridische grondslagen op basis waarvan personen in een van de AcVZ-aanpakken worden opgenomen verwijzen wij u naar het Algemeen Convenant AcVZ en de daaronder vallende regelingen gegevensverwerking (waaronder regelingen voor de Top600 en Top400), zoals gepubliceerd op de website van het AcVZ.", + "methods_and_models": "Elke binnenkomende dataset is door de aanleverende partij reeds gefilterd op het betreffende onderdeel van de criteria. Zo levert de politie alleen de namen aan van personen die op dat moment aan het politie-deel van de criteria (aantal aanhoudingen, van een bepaald type, in de afgelopen 2 of 5 jaar) voldoen. Alle binnenkomende data wordt vervolgens gecontroleerd door analisten op juistheid, om zeker te zijn dat de personen in de ene dataset dezelfde zijn als in de andere dataset(s). Daarna worden de datasets naast elkaar gelegd, zodat zichtbaar wordt welke personen aan elk onderdeel van de criteria voldoen. Als dit met alle relevante onderdelen van de criteria is gedaan, blijven de personen over die op dat moment aan de criteria voldoen.\n\nDe selectie van personen in de Top400 en Top600 bestaat dus alleen uit het optellen van een bepaald criterium (bv aanhoudingen, of leerplicht processen verbaal) in een bepaalde periode (meestal 2 of 5 jaar), en het vervolgens naast elkaar leggen van die uitkomsten om te zien welke personen er aan elk onderdeel van de criteria voldoen.", + "monitoring": null, + "human_intervention": "De samenstelling van de lijsten wordt gedaan door een team van analisten op het AcVZ. Zij voeren diverse controles uit om de integriteit van de data (klopt de data?) te waarborgen. Na selectie wordt per persoon handmatig een dossier opgesteld waarin nogmaals duidelijk vastgelegd wordt op basis van welke informatie de selectie heeft plaatsgevonden. Na plaatsing op de lijst krijgt een, speciaal daartoe opgeleide regisseur de persoon (en dossier) in regie, waarin nogmaals duidelijk wordt waarom de betreffende persoon op de lijst staat. Bij elk van deze stappen bestaat uitdrukkelijk de mogelijkheid om de selectie ongedaan te maken indien de analist, de dossieropsteller, of de regisseur daar aanleiding voor ziet.", + "risks": "De methodiek om personen te selecteren voor de aanpak Top600 of Top400 heeft een laag risico. Deze bestaan met name uit het onterecht in de aanpak opgenomen worden, en onterecht niet in de aanpak opgenomen worden.", + "performance_standard": null, + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "create_dt": "2023-03-31 08:34:11.986578+00:00", + "lars": "75856898", + "owner": "gemeente-amsterdam", + "leverancier_id": null + }, + { + "name": "Vroeg eropaf", + "organization": "Gemeente Amsterdam", + "department": "Directie Inkomen", + "description_short": "In Amsterdam strijden we tegen armoede. Mensen die in armoede dreigen te raken proberen we zo vroeg mogelijk te helpen, om te voorkomen dat ze ernstige schulden krijgen of uit hun woning gezet worden. Als problemen nog klein zijn, kan een advies of een lichte interventie al voldoende zijn. Om dat te kunnen doen, moeten we weten wie er in de schulden dreigt te raken. Daarom krijgen we een melding van onder andere zorgverzekeraars, woningcorporaties, energieleveranciers en Waternet, als zij een klant hebben die een betalingsachterstand bij hen heeft. Dit heet ook wel de \u2018Amsterdamse aanpak vroegsignalering\u2019. Dat de schuldeiser deze gegevens mag doorgeven aan de gemeente, ook persoonsgegevens, staat in de Wet gemeentelijke schuldhulpverlening. Na de melding vult de gemeente de gegevens aan met informatie die bij ons bekend is over de gemelde persoon. Dat is informatie die nodig is om te bepalen of iemand wel of geen uitkeringsgerechtigden is, klant van WPI (de afdeling Werk, Participatie en Inkomen van de gemeente Amsterdam) en om te bepalen naar welke hulpverlener de melding het best doorgestuurd kan worden. Het aanvullen van de melding met de informatie die bij de gemeente bekend is, gebeurt automatisch, na een druk op een knop. Er is altijd iemand nodig om een controle op data te activeren.\n\nHet systeem stuurt de melding door naar een hulpverlener van de gemeente. Hij of zij probeert binnen 14 dagen contact te krijgen met de burger en maakt binnen 28 dagen een eerste analyse. Soms speelt er meer dan een betalingsachterstand. Als de burger hulp aanneemt, maken we gedetailleerde afspraken met hem of haar. De hulpverlener meldt bij het centrale meldpunt welke afspraken zijn gemaakt, zodat een schuldeiser weet wat de volgende stappen zijn voor de betalingsachterstand.", + "type": null, + "category": null, + "website": "https://algoritmeregister.amsterdam.nl/vroeg-eropaf/", + "status": null, + "goal": null, + "impact": null, + "proportionality": null, + "decision_making_process": null, + "documentation": "https://algoritmeregister.amsterdam.nl/vroeg-eropaf", + "competent_authority": "Team Armoedebestrijding", + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": "CIO-office@amsterdam.nl", + "area": "Amsterdam", + "lang": "Nederlands", + "revision_date": null, + "description": "In Amsterdam strijden we tegen armoede. Mensen die in armoede dreigen te raken proberen we zo vroeg mogelijk te helpen, om te voorkomen dat ze ernstige schulden krijgen of uit hun woning gezet worden. Als problemen nog klein zijn, kan een advies of een lichte interventie al voldoende zijn. Om dat te kunnen doen, moeten we weten wie er in de schulden dreigt te raken. Daarom krijgen we een melding van onder andere zorgverzekeraars, woningcorporaties, energieleveranciers en Waternet, als zij een klant hebben die een betalingsachterstand bij hen heeft. Dit heet ook wel de \u2018Amsterdamse aanpak vroegsignalering\u2019. Dat de schuldeiser deze gegevens mag doorgeven aan de gemeente, ook persoonsgegevens, staat in de Wet gemeentelijke schuldhulpverlening. Na de melding vult de gemeente de gegevens aan met informatie die bij ons bekend is over de gemelde persoon. Dat is informatie die nodig is om te bepalen of iemand wel of geen uitkeringsgerechtigden is, klant van WPI (de afdeling Werk, Participatie en Inkomen van de gemeente Amsterdam) en om te bepalen naar welke hulpverlener de melding het best doorgestuurd kan worden. Het aanvullen van de melding met de informatie die bij de gemeente bekend is, gebeurt automatisch, na een druk op een knop. Er is altijd iemand nodig om een controle op data te activeren.\n\nHet systeem stuurt de melding door naar een hulpverlener van de gemeente. Hij of zij probeert binnen 14 dagen contact te krijgen met de burger en maakt binnen 28 dagen een eerste analyse. Soms speelt er meer dan een betalingsachterstand. Als de burger hulp aanneemt, maken we gedetailleerde afspraken met hem of haar. De hulpverlener meldt bij het centrale meldpunt welke afspraken zijn gemaakt, zodat een schuldeiser weet wat de volgende stappen zijn voor de betalingsachterstand.", + "application_url": null, + "publiccode": null, + "mprd": null, + "source_data": "Melding schuldeiser\n\nSchuldeisers doen hun melding van een betalingsachterstand in een speciaal daarvoor ontwikkeld registratie- en informatiesysteem genaamd \u2018RIS Matching\u2019. De gegevens van deze dataset zijn allemaal gegevens die nodig zijn om de juiste burger aan te spreken, de juiste hulpverlener te vinden en om een advies te geven bij welke hulp de burger het meeste baat zou hebben. Alleen zorgverzekeraars hebben een wettelijke grondslag (Staatscourant 2015) voor het leveren van het BSN, de overige schuldeisers leveren geen BSN.\n\nDe schuldeiser kan bij de melding de volgende gegevens aanleveren:\n\nKlantnummer\nVroeg of crisis\nSchuldbedrag\nTermijnbedrag\nGeslacht\nVoorletters\nVoorvoegsel\nAchternaam\nStraat\nHuisnummer\nHuisletter\nHuisnummer of toevoegsel\nPostcode\nPlaats\nBSN (in geval van zorgverzekering)\nGeboortedatum\nExtra informatie (Bijvoorbeeld bij welk \u2018label\u2019 iemand verzekerd is. De hoofdmelder is Achmea, maar iemand kan bijvoorbeeld verzekerd zijn bij Zilveren Kruis, Avero, FBTO. Ook staan hier contactgegevens zoals telefoonnummer of mailadres als dit bekend is).\nDatawarehouse afdeling Armoedebestrijding\n\nEen medewerker van de gemeente koppelt de melding van de schuldeiser aan het datawarehouse van de afdeling Armoedebestrijding. Via het datawarehouse kan uit verschillende databases informatie opgevraagd worden, zodat we kunnen bepalen welke hulpverlener met de melding aan de slag kan gaan. In de lijst hieronder staat om welke informatie het precies gaat. De volgende informatie wordt, voor zover bekend en als het een klant van WPI betreft, vanuit het datawarehouse aan de melding gekoppeld. De informatie is niet alleen nodig om de juiste hulpverlener te koppelen aan de melding, maar ook voor de hulpverlener om samen met de juiste klantmanager het gesprek aan te gaan met de klant:\n\nHuisnummer\nHuisletter\nHuisnummer toevoeging\nPlaats\nStadsdeel\nGebied\nBuurt\nA- nummer\nGeboortedatum\nLeeftijd\nUitkering\nAdministratienummer\nCodering\nKlantmanager\nTeam klant manager\nExtra informatie\nKinderen aanwezig\nMeldingsnummer\nBepalen welke afdeling met de melding aan de slag gaat\n\nDe melding van de schuldeiser en de gegevens over de burger uit het datawarehouse van WPI worden vervolgens gekoppeld. Voor elke afdeling is er een unieke code van toepassing. Bijvoorbeeld: de combinatie van het adres Jan van Galenstraat 323 en een leeftijd jonger dan 27 levert de code 5 op, \u2018Dak- en thuisloze Jongeren\u2019. De koppeling zorgt ervoor dat de melding bij de juiste hulpverlener terechtkomt. De code heeft geen andere functie dan te bepalen of men een klant is of niet en bij welke schuldhulpverlener het hoort.\n\nHet systeem kan uit de volgende codes kiezen:\n\nActivering\nNiet-bijstandsgerechtigde\nOnduidelijk\nTraject Briefadressen\nDak- en thuisloze Jongeren\nFIBU (budgetbeheer)\nOndersteuning ondernemers\nWerk en Veiligheid\nKlanten zonder verblijfplaats\nTeam Entree\nWerk\nJongerenpunten\nKoers naar Werk\nGekoppelde gegevens\n\nDe resultaten van de koppeling van dataset 1, 2 en 3 worden opgeslagen in een aparte dataset. In deze dataset staan dus per melding de gegevens die door de schuldeiser zijn gemeld, de gegevens die vanuit de datawarehouse van de afdeling Armoedebestrijding zijn toegevoegd en de code van een afdeling.\n\nTerugkoppeling schuldeiser\n\nDe hulpverlener registreert in het registratie- en informatiesysteem (RIS Vroeg Eropaf) of contact is gelegd met de burger en of er afspraken zijn gemaakt. De schuldeiser kan in het systeem zien wat er met zijn melding is gebeurd. Bijvoorbeeld dat de melding in behandeling is genomen. De schuldeiser kan dan eventueel de automatische incasso stilleggen. Het kan natuurlijk zo zijn dat de burger hulp van de gemeente weigert. Ook dat registreren we in het systeem. De schuldeiser kan dan zelf bepalen om het incassotraject weer te starten.\n\nIn het systeem wordt \u00e9\u00e9n van de volgende opties geregistreerd:\n\nJa, contact met plan van aanpak\nJa, contact niet conform vereisten plan van aanpak\nJa, contact maar weigert hulp\nJa, contact betalingsregeling met melder\nLopend dossier\nGeen contact\nNiet opgepakt door verhuizing, overlijden, detentie, al een betalingsregeling, dubbele melding et cetera.\nNiet opgepakt door gebruik aan capaciteit\nJa, klant bereikt, niet declarabel (alleen contact)\nJa, maar stelt geen prijs op verdere hulpverlening\nNee, klant niet bereikt\nGeen actie ondernomen", + "methods_and_models": "Architectuur van het model\n\nDe schuldeiser doet een melding in het registratie- en informatiesysteem \u2018RIS Matching\u2019. Eens in de twee weken worden alle nieuwe meldingen door een medewerker van de gemeente gekoppeld (door een druk op de knop) aan gegevens over de gemelde persoon uit de datawarehouse van de afdeling Armoedebestrijding en aan gegevens over de verschillende schuldhulpverleningsprogramma\u2019s die beschikbaar zijn. Door die koppeling kan de gemeente bepalen of ze te maken heeft met de juiste burger en welke hulpverlener het best contact op kan nemen met de burger. Vervolgens wordt gecontroleerd of er sprake is van meerdere schuldachterstanden binnen \u00e9\u00e9n huishouden. Tot hier is er sprake van een geautomatiseerd proces. Vervolgens zijn er een paar mogelijkheden:\n\nBij een enkele betalingsachterstand van minder dan 250 euro wordt vanuit RIS Matching automatisch een sms, brief of mail gestuurd (afhankelijk van welke contactgegevens beschikbaar zijn). In dit geautomatiseerde bericht verwijzen we naar de website\nwww.amsterdam.nl/geldproblemen\n. Hier kunnen burgers de schuldhulpverlening in hun stadsdeel vinden. Daar kunnen ze dan zelf contact mee opnemen.\nIs de schuld hoger dan 250 euro dan wordt de melding op basis van informatie over het postcodegebied automatisch doorgestuurd naar een hulpverlener in het juiste stadsdeel of bij een WPI-afdeling. De hulpverlener probeert binnen 14 dagen contact te krijgen met de burger. De hulpverlener maakt binnen 28 dagen een eerste analyse. Vaak speelt er meer dan een betalingsachterstand. Als de burger hulp accepteert, worden er gedetailleerde afspraken met hem of haar gemaakt.\nAls uit de gegevens niet duidelijk wordt of de persoon met schulden bekend is bij de afdeling Armoedebestrijding, dan wordt dit geval in het systeem aangeduid als \u2018onduidelijk\u2019 en doorgezet naar het team Vroeg eropaf. In het uitzonderlijke geval dat een melding niet bij een hulpverlener in het juiste stadsdeel terecht komt, meldt de hulpverlener dit aan de systeembeheerder van RIS Matching. Deze verplaatst de melding dan naar de juiste hulpverlener.", + "monitoring": null, + "human_intervention": "Het systeem maakt een aantal keuzes zelfstandig (geautomatiseerd), bijvoorbeeld om een sms, email of brief te versturen bij een betalingsachterstand lager dan 250 euro, of naar welk postcodegebied de melding doorgestuurd moet worden. Tijdens het proces van gegevens koppelen is er \u00e9\u00e9n moment van menselijk toezicht: het koppelen van de melding van de schuldeisers met de gegevens van de afdeling Armoedebestrijding gebeurt geautomatiseerd, maar voor het starten van de koppeling is wel een menselijke handeling nodig. Vanaf het moment dat de melding doorgestuurd is naar de hulpverleners in het juiste stadsdeel is het proces niet meer geautomatiseerd. De maatschappelijk dienstverlener gaat langs bij de gemelde burger als de burger zelf geen contact opneemt.", + "risks": "Het registratie- en informatiesysteem genaamd \u2018RIS Matching\u2019 wordt geleverd door het bedrijf Inforing, een bedrijf dat dit systeem aan 200 gemeenten levert. Zij voeren regelmatig zogenaamde \u2018pen- en hacktesten\u2019 uit, om te controleren of het systeem niet gehackt kan worden door derden. Ook zorgen zij ervoor dat persoonsgegevens veilig beheerd zijn en niet worden verkocht aan derden. Ook de beveiliging ligt bij Inforing. De beveiliging voldoet aan de BIO-standaard.\n\nBurgers kunnen op elk moment aangeven dat zij niet in het systeem willen worden vermeld. De gegevens worden dan onmiddellijk verwijderd. Daarnaast kunnen burgers altijd inzage krijgen in het systeem. Het gaat hierbij om dataset 4, \u2018gekoppelde gegevens\u2019 (zie: Data). Voor de data in het datawarehouse van de afdeling Armoedebestrijding gelden andere regels, namelijk het Stedelijk Kader Verwerking van Persoonsgegevens en de Algemene Verordening Gegevensbescherming. De datawarehouse en de meldingen van schuldachterstanden zijn twee gescheiden systemen en de meldingen van schuldachterstanden komen niet in het datawarehouse terecht. Op het moment dat de gemeente de gegevens uit het RIS Matching systeem moet verwijderen, blijft er geen informatie over de schuldachterstanden achter bij de gemeente.\n\nDe gemeente Amsterdam, afdeling Armoedebestrijding is verantwoordelijk voor de verwerking van de gegevens die nodig zijn om het proces te doorlopen.", + "performance_standard": null, + "create_dt": "2023-03-31 08:34:11.997499+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "66453169", + "owner": "gemeente-amsterdam", + "leverancier_id": null + }, + { + "name": "Handhaving illegale vakantieverhuur", + "organization": "Gemeente Amsterdam", + "department": "Directie Wonen, Toezicht en Handhaving", + "description_short": "In Amsterdam is er beperkt woon- en verblijfsruimte, zowel voor Amsterdammers als voor bezoekers. Het verhuren van een woning of woonboot aan toeristen moet aan bepaalde voorwaarden voldoen. Het mag bijvoorbeeld maximaal 30 nachten per jaar en aan 4 personen per keer. Het moet gemeld worden bij de gemeente.\n\nNiet iedereen houdt zich aan die voorwaarden. De gemeente krijgt soms meldingen van buren die vermoeden dat een woning onterecht verhuurd is. Medewerkers van Toezicht & Handhaving doen daar onderzoek naar.\n\nHet algoritme helpt de meldingen te prioriteren zodat de beperkte handhavingscapaciteit effici\u00ebnt en effectief ingezet kan worden. Door gegevens te analyseren, schat het algoritme het risico in dat de woning op het gemelde adres illegaal wordt verhuurd. Het algoritme gebruikt daarvoor data uit onrechtmatige vakantieverhuur van de afgelopen 5 jaar. Het gaat om meldingen, gegevens die de gemeente tijdens het werkproces heeft verzameld, persoonsgegevens (Basisregistratie Personen) en gegevens over gebouwen (Basisregistratie Adressen en Gebouwen).", + "type": null, + "category": null, + "website": "https://algoritmeregister.amsterdam.nl/handhaving-illegale-vakantieverhuur/", + "status": null, + "goal": null, + "impact": null, + "proportionality": null, + "decision_making_process": null, + "documentation": "https://algoritmeregister.amsterdam.nl/handhaving-illegale-vakantieverhuur", + "competent_authority": "Team Vakantieverhuur/onderhuur", + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": "CIO-office@amsterdam.nl", + "area": "Amsterdam", + "lang": "Nederlands", + "revision_date": null, + "description": "In Amsterdam is er beperkt woon- en verblijfsruimte, zowel voor Amsterdammers als voor bezoekers. Het verhuren van een woning of woonboot aan toeristen moet aan bepaalde voorwaarden voldoen. Het mag bijvoorbeeld maximaal 30 nachten per jaar en aan 4 personen per keer. Het moet gemeld worden bij de gemeente.\n\nNiet iedereen houdt zich aan die voorwaarden. De gemeente krijgt soms meldingen van buren die vermoeden dat een woning onterecht verhuurd is. Medewerkers van Toezicht & Handhaving doen daar onderzoek naar.\n\nHet algoritme helpt de meldingen te prioriteren zodat de beperkte handhavingscapaciteit effici\u00ebnt en effectief ingezet kan worden. Door gegevens te analyseren, schat het algoritme het risico in dat de woning op het gemelde adres illegaal wordt verhuurd. Het algoritme gebruikt daarvoor data uit onrechtmatige vakantieverhuur van de afgelopen 5 jaar. Het gaat om meldingen, gegevens die de gemeente tijdens het werkproces heeft verzameld, persoonsgegevens (Basisregistratie Personen) en gegevens over gebouwen (Basisregistratie Adressen en Gebouwen).", + "application_url": null, + "publiccode": null, + "mprd": null, + "source_data": "Identiteits- en huisvestingsgegevens (BRP)\n\nEen beperkte set gegevens uit de Basisregistratie Personen (BRP) over de identiteit en huisvestingssituatie van de bewoners, namelijk:\n\nnaam van de geregistreerde bewoners;\ngeboortedatum;\nvertrekdatum Amsterdam;\nvertrekdatum adres;\nvestigingsdatum adres;\noverlijdensdatum.\nGegevens over gebouwen (BAG)\n\nEen beperkte set gegevens uit de Basisregistratie Adressen en Gebouwen (BAG) over het gebouw, namelijk:\n\nadres, straatcode, postcode;\nid-adres;\nomschrijving pand;\nAmsterdamse BAG-code, landelijke BAG-code;\ntype woning (huur, sociale huur / vrije sector, koop);\nadresseerbaar BAG-ID\naantal kamers;\nvloeroppervlak;\nbouwlaag van voordeur appartement;\naantal bouwlagen;\nomschrijving verdieping woonobject.\nGegevens uit illegale vakantieverhuurzaak\n\nGegevens uit de melding en eventuele gerelateerde illegale vakantieverhuurzaak, namelijk:\n\nzaak id;\ndatum van start van onderzoek / melding;\nstadium van behandeling van de melding;\nstadia nummer, omschrijving en id;\n(meld)code;\ncode overtreding;\ncode (behandelend) medewerker;\nwel / geen anonieme melder;\ndatum melding;\nsituatieschets;\nbevindingen onderzoek;\ngebruiker die melding heeft gecre\u00eberd (met datum), of aangepast (met datum aanpassing);\nbehandelcode (type zaak, indeling in team);\nresultaat;\ndatum wanneer zaak is afgesloten;\nreden waarom zaak is afgesloten.", + "methods_and_models": "Architectuur van het model\n\nGemeente Amsterdam heeft een algoritme ontwikkeld dat verbanden en patronen kan vinden in grote hoeveelheid informatie over illegale vakantieverhuur. Het algoritme berekent welke informatie vaker in verband kan worden gebracht met illegale vakantieverhuur en welke informatie niet. Het algoritme doet dit door wiskundige berekeningen uit te voeren volgens het kansboom-principe. Dat wil zeggen dat het algoritme op basis van een groot aantal kansberekeningen een gemiddelde neemt. Dit gemiddelde wordt gebruikt om de wiskundige verwachting te genereren van illegale vakantieverhuur op een adres. Het algoritme berekent deze verwachting pas als we een nieuwe melding (bijvoorbeeld van een omwonende of verhuurplatform) ontvangen van mogelijke illegale vakantieverhuur.\n\nDit algoritme wordt een \u2018random forest regressie algoritme\u2019 genoemd. Om de door het algoritme gemaakte afwegingen inzichtelijk te maken voor mensen passen we de \u201cSHAP\u201d-methodiek toe (SHapley Additive exPlanations; https://github.com/slundberg/shap). SHAP berekent voor iedere individuele zaak welke indicatoren hebben bijgedragen aan die voorspelling en of dit ervoor zorgde dat de voorspelling hoger of lager werd. Zo kan een medewerker altijd zien waar het algoritme de risico-inschatting op heeft gebaseerd en een afgewogen besluit nemen. Prestatie\n\nHet voordeel van een \u2018random forest regressie\u2019 is dat het een redelijk complex algoritme is dat de werkelijkheid goed kan benaderen. Maar er is wel een kans op overfitting. Een \u2018tree\u2019 met veel lagen perst de data uit om specifieke antwoorden te leveren. Er is onderzocht hoeveel lagen het model nodig heeft om generiek inzetbaar te blijven en dus niet te overfitten. Daarnaast worden continu datapunten gecategoriseerd (gegroepeerd), zodat het model een overzichtelijk aantal mogelijkheden heeft in plaats van een oneindig aantal met continue waarden. Hierdoor is het model beter in staat is om tot een conclusie te komen.", + "monitoring": null, + "human_intervention": "Er is geen sprake van geautomatiseerde besluitvorming. Als we een adres onderzoeken op het vermoeden van illegale vakantieverhuur komt dit voort uit een melding van bijvoorbeeld een omwonende of een verhuurplatform. Het algoritme helpt de medewerkers van Toezicht & Handhaving te bepalen bij welke meldingen de kans op illegale verhuur het grootst is, zodat die meldingen het eerst onderzocht kunnen worden. De medewerker krijgt een overzicht te zien, die toont op grond van welke criteria het algoritme het risico op illegale vakantieverhuur hoog of laag inschat. Op die manier maken we inzichtelijk waarop het algoritme de risico-inschatting heeft gebaseerd.\n\nOf er daadwerkelijk sprake is van illegale vakantieverhuur wordt vastgesteld door de verantwoordelijk toezichthouder en de projecthandhaver. Daarvoor wordt een voor- en buitendienstonderzoek uitgevoerd. Vervolgens wordt het dossier intensief besproken in een debriefing met de medewerkers die tot besluitvorming kunnen overgaan. Het algoritme heeft een wezenlijke invloed op de volgorde waarin we meldingen afhandelen, maar neemt niet zelfstandig de beslissingen of er al dan niet sprake is van illegale vakantieverhuur.\n\nOm te voorkomen dat medewerkers teveel vertrouwen in het algoritme hebben, is er iemand aangesteld om het algoritme en de werking daarvan te monitoren. Daarnaast is een werkinstructie opgesteld voor de medewerkers die met dit instrument gaan werken. Daarbij volgen de medewerkers workshop over de kansen en risico\u2019s van het gebruik van algoritmen.", + "risks": "Het systeem heeft uiteraard gevolgen voor de mogelijke overtreder. Een melding kan namelijk meer of minder prioriteit krijgen dan zonder het algoritme. We hebben verschillende maatregelen getroffen om ervoor te zorgen dat alle risico-inschattingen van het algoritme niet op toeval berusten. Een belangrijk maatregel is dat we dit algoritme in een pilotfase uitvoerig en voortdurend evalueren op bv. betrouwbaarheid, voordat het wordt ge\u00efmplementeerd in de bedrijfsvoering.", + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.002906+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "99175375", + "owner": "gemeente-amsterdam", + "leverancier_id": null + }, + { + "name": "Meldingen openbare ruimte", + "organization": "Gemeente Amsterdam", + "department": "Onderzoek, Informatie & Statistiek (OIS)", + "description_short": "Als er op straat of in een park iets gemaakt of opgeruimd moet worden, dan kan dat bij de gemeente worden gemeld via SIA, het online meldingensysteem. Ook een gevaarlijke verkeerssituatie of overlast van personen en horeca kan gemeld worden.\n\nVoorheen moesten mensen zelf kiezen bij welke categorie hun melding het beste paste (bijvoorbeeld \u2018overlast\u2019 of \u2018straatmeubilair\u2019), zodat de melding bij de juiste afdeling van de gemeente terecht kwam. Maar de gemeente is een complexe organisatie en de lijst met categorie\u00ebn is lang. Daardoor koos men niet altijd de juiste categorie. Dat zorgde soms voor vertraging in de afhandeling van meldingen.\n\nDaarom gebruiken we nu een algoritme dat woorden herkent, bijvoorbeeld \u2018afval\u2019 en \u2018stoep\u2019. Op basis daarvan wordt bepaald bij welke categorie de melding het best past en welke afdeling de melding moet afhandelen.\n\nDe melder hoeft dus geen categorie meer te kiezen, en de melding wordt sneller afgehandeld omdat hij bij de juiste afdeling terecht komt.", + "type": null, + "category": null, + "website": "https://algoritmeregister.amsterdam.nl/meldingen-openbare-ruimte/", + "status": null, + "goal": null, + "impact": null, + "proportionality": null, + "decision_making_process": null, + "documentation": "https://algoritmeregister.amsterdam.nl/meldingen-openbare-ruimte", + "competent_authority": "Adviseur Onderzoek en ontwikkeling", + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": "CIO-office@amsterdam.nl", + "area": "Amsterdam", + "lang": "Nederlands", + "revision_date": null, + "description": "Als er op straat of in een park iets gemaakt of opgeruimd moet worden, dan kan dat bij de gemeente worden gemeld via SIA, het online meldingensysteem. Ook een gevaarlijke verkeerssituatie of overlast van personen en horeca kan gemeld worden.\n\nVoorheen moesten mensen zelf kiezen bij welke categorie hun melding het beste paste (bijvoorbeeld \u2018overlast\u2019 of \u2018straatmeubilair\u2019), zodat de melding bij de juiste afdeling van de gemeente terecht kwam. Maar de gemeente is een complexe organisatie en de lijst met categorie\u00ebn is lang. Daardoor koos men niet altijd de juiste categorie. Dat zorgde soms voor vertraging in de afhandeling van meldingen.\n\nDaarom gebruiken we nu een algoritme dat woorden herkent, bijvoorbeeld \u2018afval\u2019 en \u2018stoep\u2019. Op basis daarvan wordt bepaald bij welke categorie de melding het best past en welke afdeling de melding moet afhandelen.\n\nDe melder hoeft dus geen categorie meer te kiezen, en de melding wordt sneller afgehandeld omdat hij bij de juiste afdeling terecht komt.", + "application_url": "https://github.com/maartensukel/example-textual-classification-citizen-reports, https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html", + "publiccode": null, + "mprd": null, + "source_data": "Meldingen\n\nDe dataset bestaat uit meldingen die eerder gedaan zijn (vrij tekstveld). In eerste instantie hebben we 300.000 meldingen uit de afgelopen jaren gebruikt om het algoritme te trainen. Regelmatig wordt het bijgetraind met nieuwe meldingen en uitgevoerde correcties op bestaande meldingen. Als het Actie Service Centrum of afdelingen een verkeerde categorisering zien, (zie Menselijk toezicht) corrigeren zij dit handmatig in het meldingensysteem. Deze correcties worden gebruikt bij het bijtrainen. We onderzoeken of het bijtrainen van het algoritme in de toekomst geautomatiseerd kan.\n\nDeze dataset kunnen we in dit register niet openbaar maken. Omdat de data uit een vrij tekstveld komen, kunnen daar persoonsgevegevens in staan, hoewel daar expliciet niet om wordt gevraagd.\n\nEmailadres en telefoonnummer voor vervolgvragen\n\nIemand die een melding doet, kan zijn of haar telefoonnummer en/of emailadres achterlaten als hij of zij dat wil. We houden de melder dan op de hoogte van de voortgang en we hebben de mogelijkheid om hem of haar terug te bellen. Deze informatie wordt niet langer bewaard dan voor dit doel nodig is en wordt dus niet door het algoritme gebruikt.\n\nVoor overige informatie over verwerking van persoonsgegevens, zie: https://www.amsterdam.nl/privacy/specifieke/privacyverklaringen-wonen/meldingen-overlast-privacy", + "methods_and_models": "Architectuur van het model\n\nDe tekst van de melding wordt opgedeeld in losse woorden. Van elk woord uit een melding wordt geanalyseerd hoe uniek het is voor die melding, afgezet tegen de de totale collectie woorden (\u2018TF-IDF\u2019 of \u2018term frequency-inverse document frequency\u2019). Een woord als \u2018de\u2019 of \u2018bedankt\u2019 krijgt daardoor een laag gewicht en een woord als \u2018vuilnis\u2019 krijgt een hoger gewicht.\n\nVan die combinatie van woorden wordt vervolgens met logistische regressie (een machine-learning-techniek) bepaald bij welke categorie de melding hoort en daarmee bij welke afdeling binnen de gemeente de melding het meest waarschijnlijk past.", + "monitoring": null, + "human_intervention": "Alle meldingen die met minder dan 40% zekerheid bij een bepaalde categorie ingedeeld worden, worden doorgestuurd naar het Actie Service Centrum. Vervolgens vindt een menselijke beoordeling plaats en wordt de melding alsnog gecategoriseerd. Ook de meldingen die onterecht doorgestuurd worden naar een verkeerde categorie, worden door de verantwoordelijke afdeling (soms via het Actie Service Centrum) handmatig in de juiste categorie geplaatst.", + "risks": "Er zitten weinig risico\u2019s aan dit algoritme. Het plaatst een melding in de juiste categorie en zorgt dat het sneller bij de juiste afdeling onder de aandacht is. Als het algoritme een melding niet met voldoende zekerheid in een categorie kan plaatsen, komt hij in de categorie \u2018Overig\u2019 terecht. Medewerkers van het Actie Service Centrum bekijken die meldingen en zetten ze handmatig in de juiste categorie. Als het algoritme niet naar behoren werkt, duurt het dus iets langer voordat de melding bij de juiste afdeling is. De melder kan persoonsgegevens toevoegen als hij of zij op de hoogte gehouden wil worden. Deze gegevens worden beveiligd opgeslagen en niet door het algoritme gebruikt.", + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.008382+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "21579514", + "owner": "gemeente-amsterdam", + "leverancier_id": null + }, + { + "name": "Parkeercontrole", + "organization": "Gemeente Amsterdam", + "department": "Parkeren, Team Analyse & Advies", + "description_short": "\"Om Amsterdam leefbaar en toegankelijk te houden, mag er maar een beperkt aantal auto\u2019s in de stad parkeren. De gemeente controleert of een geparkeerde auto het recht heeft om geparkeerd te staan, dus of iemand parkeergeld heeft betaald of een parkeervergunning heeft. Om effici\u00ebnter te werken doen we die controle met scanauto\u2019s. Daarmee controleren we momenteel meer dan 150.000 offici\u00eble parkeerplaatsen in Amsterdam.\n\nDe scanauto\u2019s zijn uitgerust met camera\u2019s en rijden langs parkeerplaatsen in de stad. De camera\u2019s leggen kentekens van auto\u2019s vast en gebruiken een beeldherkenningsalgoritme om kentekens te identificeren.\n\nHet kentekennummer wordt naar het Nationaal Parkeerregister gestuurd waar gecontroleerd wordt of de auto het recht heeft om geparkeerd te staan. Als blijkt dat iemand geen parkeergeld heeft betaald, dan beoordeelt een controleur aan de hand van omgevingsfoto\u2019s of er sprake is van een bijzondere situatie (laden of lossen, stilstaande auto\u2019s voor een verkeerslicht). Bij twijfel bekijkt een parkeercontroleur de situatie ter plaatse. Als er geen sprake is van een bijzondere situatie, volgt een parkeerbon (\u2018naheffingsaanslag parkeerbelasting\u2019).\n\nHet verhogen van de pakkans vergroot de rechtvaardigheid ten opzichte van degenen die wel betalen of een geldige parkeervergunning hebben. Door te handhaven op de overtreding \u2018stilstaan op de stoep\u2019 wordt de overlast beperkt en de leefbaarheid vergroot voor diegenen die wel betaald of een geldige parkeervergunning hebben.\"", + "type": null, + "category": null, + "website": "https://algoritmeregister.amsterdam.nl/parkeercontrole/", + "status": null, + "goal": null, + "impact": null, + "proportionality": null, + "decision_making_process": null, + "documentation": "https://www.amsterdam.nl/parkeren-verkeer/", + "competent_authority": "Afdelingsmanager straatparkeren", + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": "parkeerdata@amsterdam.nl", + "area": "Amsterdam", + "lang": "Nederlands", + "revision_date": null, + "description": "Om Amsterdam leefbaar en toegankelijk te houden, mag er maar een beperkt aantal auto\u2019s in de stad parkeren. De gemeente controleert of een geparkeerde auto het recht heeft om geparkeerd te staan, dus of iemand parkeergeld heeft betaald of een parkeervergunning heeft. Om effici\u00ebnter te werken doen we die controle met scanauto\u2019s. Daarmee controleren we momenteel meer dan 150.000 offici\u00eble parkeerplaatsen in Amsterdam.\n\nDe scanauto\u2019s zijn uitgerust met camera\u2019s en rijden langs parkeerplaatsen in de stad. De camera\u2019s leggen kentekens van auto\u2019s vast en gebruiken een beeldherkenningsalgoritme om kentekens te identificeren.\n\nHet kentekennummer wordt naar het Nationaal Parkeerregister gestuurd waar gecontroleerd wordt of de auto het recht heeft om geparkeerd te staan. Als blijkt dat iemand geen parkeergeld heeft betaald, dan beoordeelt een controleur aan de hand van omgevingsfoto\u2019s of er sprake is van een bijzondere situatie (laden of lossen, stilstaande auto\u2019s voor een verkeerslicht). Bij twijfel bekijkt een parkeercontroleur de situatie ter plaatse. Als er geen sprake is van een bijzondere situatie, volgt een parkeerbon (\u2018naheffingsaanslag parkeerbelasting\u2019).\n\nHet verhogen van de pakkans vergroot de rechtvaardigheid ten opzichte van degenen die wel betalen of een geldige parkeervergunning hebben. Door te handhaven op de overtreding \u2018stilstaan op de stoep\u2019 wordt de overlast beperkt en de leefbaarheid vergroot voor diegenen die wel betaald of een geldige parkeervergunning hebben.", + "application_url": null, + "publiccode": null, + "mprd": null, + "source_data": "Gescande kentekens\n\nScanauto\u2019s met geautomatiseerde kentekenherkenning rijden door de stad om kentekens van geparkeerde auto\u2019s te herkennen. De gegevens die door de scanauto\u2019s worden verwerkt zijn de gescande afbeeldingen van kentekenplaten, samen met de locatie van de auto en tijdstempelgegevens. Als parkeergeld is betaald, worden de gegevens na 48 uur geanonimiseerd (kentekenfoto\u2019s en omgevingsfoto\u2019s worden verwijderd; het kenteken wordt verwijderd uit de metagegevens). Als geen parkeergeld is betaald, worden gegevens zo lang bewaard als nodig is voor bezwaar en beroep.\n\nNationaal Parkeerregister (NPR)\n\nHet Nationaal Parkeerregister is een nationale database waarin alle actuele parkeerrechten van kentekens geregistreerd staan. Het register wordt beheerd door de RDW. De gegevens worden verzameld vanuit de parkeermeters en parkeerapps van gemeentelijke en commerci\u00eble parkeerbedrijven, parkeeraanbieders en handhavers. Gegevens over parkeerrechten worden tot 13 weken na het eindigen van het parkeerrecht in het register bewaard (alleen voor geautoriseerd personeel toegankelijk). De gegevens van het register worden gebruikt om te controleren of iemand ergens mag parkeren.", + "methods_and_models": "Architectuur van het model\n\nAlgoritmen worden gebruikt:\n\nom de kentekenplaat te lokaliseren in de camerabeelden;\nom de afbeeldingen aan te passen voor identificatie en;\nom de individuele karakters van de kentekenplaat te identificeren.\nAls een kentekenplaat is ge\u00efdentificeerd en verwerkt, dan worden de kentekengegevens voor verdere verwerking naar het Nationaal Parkeerregister gestuurd. Een algoritme van NPR controleert vervolgens de geldigheid van parkeerrechten voor het kenteken op een bepaalde tijd en locatie (voor informatie over dat algoritme, zie de informatie op de website van NPR: https://nationaalparkeerregister.nl/downloads/downloads-mobiel-parkeren.html \u2013 in het bijzonder de technische documentatie). Een positieve uitslag betekent dat de auto geldige parkeerrechten heeft. In dat geval worden de scangegevens van de kentekenplaat binnen 48 uur verwijderd. Bij een negatieve uitslag worden de beelden gecontroleerd door een medewerker van EGIS Parking Services B.V., die in opdracht van de gemeente Amsterdam de parkeercontrole uitvoert. EGIS beoordeelt of er sprake is van een bijzondere situatie, zoals laden en lossen of een verkeerslicht. Bij twijfel bekijkt een parkeercontroleur de situatie ter plaatse. Als een kenteken geen geldige parkeerrechten heeft worden de gegevens overgedragen aan de gemeentelijke belastingdienst. Zij gebruiken de database van de RDW om het kenteken te koppelen aan de persoonsgegevens van de eigenaar en stuurt een parkeerbon (\u2018naheffingsaanslag parkeerbelasting\u2019).\n\nDe scanauto wordt naast de controle op betaald parkeren en het handhaven op stilstaan op de stoep ingezet voor de opsporing van gestolen voertuigen en voertuigen met een vordering van de politie of het Openbaar Ministerie aan de hand van de gescande kentekens. Doordat de scanauto de gescande kentekens langs de openbare gegevens bij de RDW (voertuigen die als gestolen staan geregistreerd) legt, kan het Landelijk Informatiecentrum Voertuigcriminaliteit (evt. samen met politie) indien er een match is de opsporing van dat voertuig doen. Tevens worden data verzameld over de parkeerdruk en het type vergunninghouder.", + "monitoring": null, + "human_intervention": "Menselijke controleurs beoordelen de beelden om te zien of er sprake is van een speciale situatie, bijvoorbeeld laden of lossen, of stilstaande auto\u2019s voor een verkeerslicht. Zij controleren ook of kenteken goed gelezen is. Bij twijfel bekijkt een parkeercontroleur de situatie ter plaatse.", + "risks": "Het systeem heeft een laag risico. Het belangrijkste risico is dat het systeem een kenteken verkeerd herkent en iemand een boete krijgt die dat niet verdient.\n\nDit kan gebeuren als een letter of cijfer op het kenteken foutief wordt herkend door zowel het algoritme als de controleur. Om dit risico te beheersen, krijgen mensen de mogelijkheid om via een website (naheffingsaanslag.amsterdam.nl) binnen 6 weken schriftelijk bezwaar te maken. Wie bezwaar maakt, krijgt de gelegenheid om de foto van het kenteken te zien en een situatiefoto, als die beschikbaar is. Eventuele omstanders, ongerelateerde kentekens en andere privacygevoelige informatie worden onherkenbaar gemaakt op die foto\u2019s.", + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.013799+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "78451490", + "owner": "gemeente-amsterdam", + "leverancier_id": null + }, + { + "name": "Beeldherkenning reclamebelasting", + "organization": "Gemeente Amsterdam", + "department": "Directie Belastingen, Waarderen, Heffen en Toezich", + "description_short": "Amsterdam wil een rustiger straatbeeld en wil daarom reclamebelasting heffen. Voor uitingen die zichtbaar zijn van de openbare weg (zoals gevelreclames, uithangborden en raamreclames) moet reclamebelasting worden betaald. Het formaat van de reclame-uiting bepaalt, naast onder andere het tarief(gebied) en de soort uiting, het bedrag dat betaald moet worden. Om de belastingen te kunnen heffen rijden er een aantal keer per jaar scanauto\u2019s op straat. De camera\u2019s in de scanauto\u2019s herkennen:\n\nreclame-uitingen;\nvoorzien die van co\u00f6rdinaten;\nvan een datum;\nmeten de oppervlakte;\npersoonsgegevens zoals gezichten en kentekens worden geblurd en niet opgeslagen.\n\nHet systeem doet vervolgens een voorstel aan de medewerker voor de reclame-uiting. De medewerker kan de gemaakte afbeelding (foto) en de vastgelegde gegevens zien. De medewerker beoordeelt dit en bepaalt de belastingplichtige en de belastingplicht (soort reclame en oppervlakte). Het systeem leert hiervan, zodat de camera\u2019s de volgende keer op straat de reclame beter herkennen en inmeten.\n\nVoordat de aanslag wordt gemaakt kan de belastingplichtige in de digitale balie van Belastingen nog controleren of alles klopt en wijzigingen doorgeven. Dan wordt de belastingaanslag verstuurd en kan de Reclamebelasting worden betaald.", + "type": null, + "category": null, + "website": "https://algoritmeregister.amsterdam.nl/beeldherkenning-reclamebelasting/", + "status": null, + "goal": null, + "impact": null, + "proportionality": null, + "decision_making_process": null, + "documentation": "https://www.amsterdam.nl/belastingen-heffingen/", + "competent_authority": "Team Waarderen, Heffen en Toezicht", + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": "algoritmen@amsterdam.nl", + "area": "Amsterdam", + "lang": "Nederlands", + "revision_date": null, + "description": "Amsterdam wil een rustiger straatbeeld en wil daarom reclamebelasting heffen. Voor uitingen die zichtbaar zijn van de openbare weg (zoals gevelreclames, uithangborden en raamreclames) moet reclamebelasting worden betaald. Het formaat van de reclame-uiting bepaalt, naast onder andere het tarief(gebied) en de soort uiting, het bedrag dat betaald moet worden. Om de belastingen te kunnen heffen rijden er een aantal keer per jaar scanauto\u2019s op straat. De camera\u2019s in de scanauto\u2019s herkennen:\n\nreclame-uitingen;\nvoorzien die van co\u00f6rdinaten;\nvan een datum;\nmeten de oppervlakte;\npersoonsgegevens zoals gezichten en kentekens worden geblurd en niet opgeslagen.\n\nHet systeem doet vervolgens een voorstel aan de medewerker voor de reclame-uiting. De medewerker kan de gemaakte afbeelding (foto) en de vastgelegde gegevens zien. De medewerker beoordeelt dit en bepaalt de belastingplichtige en de belastingplicht (soort reclame en oppervlakte). Het systeem leert hiervan, zodat de camera\u2019s de volgende keer op straat de reclame beter herkennen en inmeten.\n\nVoordat de aanslag wordt gemaakt kan de belastingplichtige in de digitale balie van Belastingen nog controleren of alles klopt en wijzigingen doorgeven. Dan wordt de belastingaanslag verstuurd en kan de Reclamebelasting worden betaald.", + "application_url": "https://www.cyclomedia.com/nl", + "publiccode": null, + "mprd": null, + "source_data": "Reclame-uiting\n\nVan iedere herkende reclame-uiting in de openbare ruimte wordt (via de co\u00f6rdinaten) een afbeelding van de openbare ruimte gebruikt waarop die uiting is te zien. Persoonsgegevens worden geblurd en niet vastgelegd.\n\n \n\nLocatiegegevens\n\nDe camera en bijbehorende programmatuur registreren de locatie van de herkende reclame-uiting. Hiervoor worden o.b.v. de topografische basiskaart van Nederland geografische co\u00f6rdinaten vastgelegd bij de reclame-uiting.\n\n \n\nDatum\n\nDe datum van constatering wordt vastgelegd.\n\n \n\nSoort\n\nDe soort reclame-uiting wordt automatisch herkend en vastgelegd.\n\n \n\nMeting\n\nDe camera en bijbehorende programmatuur registreren de afmetingen van de reclame-uiting. Hiervoor worden meetpunten van het reclameobject vastgelegd.\n\n \n\nBelastingobject\n\nDe afbeelding, datum, locatie en meting worden naar de belastingapplicatie gestuurd. Het systeem maakt daarbij een nieuw belastingobject aan of koppelt deze gegevens aan een bestaand reclameobject. De fiscale geheimhouding geldt voor deze gegevens.\n\n \n\nFeedback\n\nDe resultaten van de beoordeling van de medewerker zoals soort reclameobject, locatie en afmetingen worden automatisch teruggegeven aan het systeem. Het systeem leert hiervan.\n\n \n\nBelastinggegevens\n\nDe locatiegegevens worden gebruikt om het reclameobject te koppelen aan het WOZ-object (bijvoorbeeld winkel). De belastinggegevens van dat WOZ-object worden gebruikt om de belastingplichtige te bepalen en de belastingplicht samen te stellen. Via een regulier proces worden belastingaanslagen gemaakt. De fiscale geheimhouding geldt voor deze gegevens.", + "methods_and_models": "Architectuur van het model:\n\nDe algoritmes worden gebruikt om:\n\nEen mogelijke reclame-uiting te herkennen en als afbeelding vast te leggen. We nemen de dienst van Cyclomedia af die breed gebruikt wordt om de openbare ruimte vast te leggen. Er wordt gebruik gemaakt van gepatenteerde positioneringstechnologie. Deze technologie wordt niet openbaar gemaakt omdat het bedrijfsinformatie is. In het beeldmateriaal zoekt het systeem de reclame-uitingen en legt die vast in co\u00f6rdinaten. Deze gegevens worden gebruikt om het belastingobject vast te stellen. De nauwkeurigheid in de herkende objecten is minimaal 95%. Door het lerend effect wordt dit percentage omhoog gebracht. Daarnaast is er een controleproces waarbij o.b.v. bestandsanalyse gekeken wordt of er belastingobjecten (bijv. restaurant) zijn waarbij wel reclame wordt verwacht, maar waarvoor geen belastingplicht is aangemaakt.\n\nDe locatiegegevens van de reclame-uiting vast te leggen. Deze gegevens worden gebruikt om de belastingplichtige vast te stellen.\n\nDe soort en afmetingen van de reclame-uiting te bepalen en vast te leggen. Deze gegevens worden gebruikt om de grondslag voor de belasting vast te stellen.\n\nDe datum van de constatering vast te leggen. Deze gegevens worden gebruikt om de heffingsperiode vast te stellen.\n\nTe leren van de door de medewerker bevestigde gegevens. Deze gegevens worden gebruikt om de beeldherkenning verder te optimaliseren.\n\nPrestatie\n\nEr is sprake van fotogrammetrie. De fotogrammetrie houdt zich bezig met de interpretatie en het opmeten van beeldmateriaal bij het bepalen en beschrijven van de vorm en afmeting en ligging van objecten. Hierbij worden de vorm, locatie en de afmetingen bepaald met behulp van wiskundige modellen binnen een geautomatiseerd algoritme. De toegepaste rekenmodellen zijn niet openbaar. Dit is vertrouwelijke bedrijfsinformatie. Er zijn geen (inter)nationale standaarden voor de terrestrische plaatsbepaling, fotogrammetrische en point cloud metingen beschikbaar.\n\nHet is de medewerker die de locatie bevestigt en de oppervlakte van de reclame-uiting berekent. De regels die hiervoor gelden staan in de belastingverordening. De toepassing van deze regels door de medewerker is daarmee bepalend voor de accuratesse en nauwkeurigheid van de meting.\n\nHet algoritme is zelflerend. Het gebruikt de resultaten van de controle door de medewerker om te leren, zodat de beeldherkenning nauwkeuriger wordt.", + "monitoring": null, + "human_intervention": "Het systeem doet alleen een voorstel voor de reclame-uiting aan de medewerker. De medewerker beslist altijd.\n\nDe belastingplichtige heeft de mogelijkheid om de reclame-uitingen die op aanslag worden gebracht te controleren en daarop wijzigingen in te dienen.\n\nDe mogelijkheid tot bezwaar en beroep tegen de aanslag bestaat. Hiervoor kan men terecht op de digitale balie van Belastingen.", + "risks": "Het systeem is qua privacy niet risicovol. Het legt geen persoonsgegevens vast en maakt alleen foto\u2019s van uitingen in de openbare ruimte. Grootste risico hier is dat de locatie van de reclame-uiting bekend wordt waardoor mogelijk het adres van een persoon of bedrijf achterhaald kan worden. Dit kan op straat ook. Onbevoegden kunnen niet bij de opgeslagen beelden door de gerealiseerde informatiebeveiliging.\n\nBeveiligingsrisico\u2019s zijn beheerst door de algehele ingerichte beveiliging op systemen en verbindingen. Deze voldoen aan de eisen.\n\nIn de uitvoering is het grootste risico dat een reclame-uiting niet juist wordt gescand of ingemeten waardoor iemand een verkeerde aanslag krijgt. De medewerker controleert echter altijd en stelt de belastingplicht vast. De belastingplichtige kan reageren op de vastgelegde reclame-uiting en kan in bezwaar en beroep tegen de belastingaanslag. \n\n\n\nIn de uitvoering is het grootste risico dat een reclame-uiting niet juist wordt gescand of ingemeten waardoor iemand een verkeerde aanslag krijgt. De medewerker controleert echter altijd en stelt de belastingplicht vast. De belastingplichtige kan reageren op de vastgelegde reclame-uiting en kan in bezwaar en beroep tegen de belastingaanslag. ", + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.019223+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "67971871", + "owner": "gemeente-amsterdam", + "leverancier_id": null + }, + { + "name": "Public Eye", + "organization": "Gemeente Amsterdam", + "department": "CTO Innovatieteam", + "description_short": "Amsterdam is een drukke stad. Dit kan soms leiden tot verkeersonveilige situaties. Door data te verzamelen over de aantallen voetgangers is het mogelijk om maatregelen te treffen, waardoor de drukte in goede banen geleid kan worden. Hierdoor blijft de stad comfortabel, bereikbaar en verkeersveilig. Als een situatie door te grote drukte onveilig wordt, kan de gemeente ingrijpen. Dit gebeurt bijvoorbeeld door digitale informatieborden te plaatsen, zodat mensen weten welke routes ze moeten nemen. Of er wordt \u00e9\u00e9nrichtingsverkeer ingesteld.\n\nMet het crowdmonitoring systeem \u2018Public Eye\u2019 brengen we op een paar plekken in Amsterdam de drukte in kaart. Op dit moment is het systeem actief op de Arena Boulevard, op het Marineterrein en op de Dam. Op deze plekken hangen camera\u2019s die zijn gekoppeld aan een server van de gemeente. Op de server analyseert een algoritme hoeveel mensen er op de beelden staan. De informatie over het aantal aanwezige personen wordt doorgestuurd naar medewerkers van de gemeente, die de telling kunnen gebruiken om het verkeer beter te reguleren. De beelden worden niet getoond, alleen de aantallen. Ook bewoners en bezoekers van de stad kunnen de informatie over het aantal aanwezige mensen inzien, via https://druktebeeld.amsterdam.nl/. Op dit moment kan dat alleen voor de locatie Marineterrein. De ambitie is om dit voor alle Public Eye locaties te realiseren.\n\nDe videobeelden worden \u2013 zodra het algoritme het aantal aanwezige mensen heeft geteld \u2013onmiddellijk gewist.\n\nBij elke nieuwe locatie waar Public Eye geplaatst wordt, wordt er een kleine hoeveelheid beeldmateriaal opgenomen waarvan er steekproefsgewijs ca. 300 beelden worden geannoteerd voor de training van het algoritme. Zo kan de drukte op die locatie ook goed geanalyseerd worden. Elke locatie is immers uniek en heeft bijvoorbeeld net een andere lichtinval of camerahoogte.", + "type": null, + "category": null, + "website": "https://algoritmeregister.amsterdam.nl/public-eye/", + "status": null, + "goal": null, + "impact": null, + "proportionality": null, + "decision_making_process": null, + "documentation": "https://algoritmeregister.amsterdam.nl/public-eye", + "competent_authority": "CTO Innovatieteam", + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": "CIO-office@amsterdam.nl", + "area": "Amsterdam", + "lang": "Nederlands", + "revision_date": null, + "description": "Amsterdam is een drukke stad. Dit kan soms leiden tot verkeersonveilige situaties. Door data te verzamelen over de aantallen voetgangers is het mogelijk om maatregelen te treffen, waardoor de drukte in goede banen geleid kan worden. Hierdoor blijft de stad comfortabel, bereikbaar en verkeersveilig. Als een situatie door te grote drukte onveilig wordt, kan de gemeente ingrijpen. Dit gebeurt bijvoorbeeld door digitale informatieborden te plaatsen, zodat mensen weten welke routes ze moeten nemen. Of er wordt \u00e9\u00e9nrichtingsverkeer ingesteld.\n\nMet het crowdmonitoring systeem \u2018Public Eye\u2019 brengen we op een paar plekken in Amsterdam de drukte in kaart. Op dit moment is het systeem actief op de Arena Boulevard, op het Marineterrein en op de Dam. Op deze plekken hangen camera\u2019s die zijn gekoppeld aan een server van de gemeente. Op de server analyseert een algoritme hoeveel mensen er op de beelden staan. De informatie over het aantal aanwezige personen wordt doorgestuurd naar medewerkers van de gemeente, die de telling kunnen gebruiken om het verkeer beter te reguleren. De beelden worden niet getoond, alleen de aantallen. Ook bewoners en bezoekers van de stad kunnen de informatie over het aantal aanwezige mensen inzien, via https://druktebeeld.amsterdam.nl/. Op dit moment kan dat alleen voor de locatie Marineterrein. De ambitie is om dit voor alle Public Eye locaties te realiseren.\n\nDe videobeelden worden \u2013 zodra het algoritme het aantal aanwezige mensen heeft geteld \u2013onmiddellijk gewist.\n\nBij elke nieuwe locatie waar Public Eye geplaatst wordt, wordt er een kleine hoeveelheid beeldmateriaal opgenomen waarvan er steekproefsgewijs ca. 300 beelden worden geannoteerd voor de training van het algoritme. Zo kan de drukte op die locatie ook goed geanalyseerd worden. Elke locatie is immers uniek en heeft bijvoorbeeld net een andere lichtinval of camerahoogte.", + "application_url": "https://github.com/Amsterdam/public-eye, https://www.tapp.nl/projects/public-eye", + "publiccode": null, + "mprd": null, + "source_data": "Trainingsdata: Marineterrein\n\nMet trainingsdata \u2018leert\u2019 het algoritme hoeveel mensen een afbeelding bevat. Deze dataset bevat beelden van vier camera\u2019s in het Marineterreingebied. Het gaat om enkele honderden beelden per camera. Het aantal mensen op de beelden varieert van 0 tot ongeveer 200. De camera\u2019s die gebruikt zijn voor deze beelden hingen tijdens de dataverzameling bij het Marineterrein op 3 tot 15 meter hoogte. In deze dataset hebben we handmatig aangegeven waar in het beeld de hoofden van mensen aanwezig zijn. Deze annotaties zijn in twee fases opgesteld, dat wil zeggen dat elke annotatie eenmaal is gecontroleerd is en zo nodig aangepast. Zo hebben we de kans op fouten bij het annoteren zo klein mogelijk gemaakt. Er is maar een beperkt aantal medewerkers van de gemeente dat rechten heeft om deze data te benaderen.\n\nTrainingsdata: Arena\n\nMet trainingsdata \u2018leert\u2019 het algoritme hoeveel mensen een afbeelding bevat. Deze dataset bevat beelden van vier camera\u2019s in het Arenagebied. Het gaat om ongeveer 300 geannoteerde beelden per camera. Het aantal mensen op de beelden varieert van 0 tot 100. De camera\u2019s die gebruikt zijn voor deze beelden hingen tijdens de dataverzameling rondom de Amsterdam Arena op 10 tot 15 meter hoogte. In deze dataset hebben we handmatig aangegeven waar in het beeld de hoofden van mensen aanwezig zijn. Deze annotaties zijn in drie fases opgesteld, dat wil zeggen dat elke annotatie twee keer gecontroleerd is en zo nodig aangepast. Zo hebben we de kans op fouten bij het annoteren zo klein mogelijk gemaakt. Er is maar een beperkt aantal medewerkers van de gemeente dat rechten heeft om deze data te benaderen.\n\nTrainingsdata: Dam dataset\n\nTrainingsdata: Dam Met trainingsdata \u2018leert\u2019 het algoritme hoeveel mensen een afbeelding bevat. Deze dataset bevat ongeveer 1000 beelden van de Dam in Amsterdam. Al deze beelden zijn opgenomen vanaf dezelfde locatie onder dezelfde hoek. Het zijn \u201cgestitchte\u201d beelden: de beelden van vier verschillende camera\u2019s zijn samengevoegd tot een enkel beeld. Op deze beelden staan tussen de 0 en 200 mensen, en de omstandigheden zijn steeds heel verschillend. Denk aan: weersomstandigheden, lichtinval, tijd van de dag, reflecties in de lens door zonlicht, et cetera. In deze beelden hebben we handmatig aangegeven (ofwel \u201cgeannoteerd\u201d) waar in het beeld de hoofden van mensen aanwezig zijn. Deze annotaties zijn in drie fases opgesteld, dat wil zeggen dat elke annotatie twee keer gecontroleerd is en zo nodig aangepast. Zo hebben we de kans op fouten bij het annoteren zo klein mogelijk gemaakt. Het is om te meten hoe druk het is natuurlijk niet nodig om te weten wie op de beelden staat, het is voldoende om te weten hoeveel mensen op de beelden staan. Er is maar een beperkt aantal medewerkers van de gemeente dat rechten heeft om deze data te benaderen.\n\nTrainingsdata: Shanghaitech Crowd CountingLink naar dataset\n\n\u2018Shanghaitech Part A\u2019 Deze dataset bevat 482 beelden van grote groepen mensen (gemiddeld 501,4 per beeld). Deze beelden zijn willekeurig vanaf het internet verzameld. Deze set bevat annotaties die de locaties van de hoofden van de mensen in het beeld weergeven.\n\n\u2018Shanghaitech Part B\u2019 Deze dataset bevat 716 beelden van groepen mensen (gemiddeld 123.6 per beeld), opgenomen door verscheidene camera\u2019s in de stad Shanghai, met verschillende beeldhoeken. Deze set bevat annotaties die de locaties van de hoofden van de mensen in het beeld weergeven.\n\nDe Gemeente Amsterdam heeft de beelden van de Shanghaitech Crowd Counting dataset niet zelf verzameld. Ze zijn vrij beschikbaar via het internet. Deze dataset wordt alleen gebruikt voor trainingsdoeleinden.\n\nCamerabeelden drukte-analyse\n\nOp dit moment is het systeem actief op de Arena Boulevard, op het Marineterrein en op de Dam. Op deze plekken hangen camera\u2019s die zijn gekoppeld aan een server van de gemeente. Op de server analyseert een algoritme hoeveel mensen er op de beelden staan. De videobeelden worden \u2013 direct na de analyse \u2013gewist.", + "methods_and_models": "Architectuur van het model\n\nEen camera maakt videobeelden van een bepaald gebied. De videobeelden worden \u2013beveiligd door end-to-end encryptie \u2013 naar een lokale server gestuurd. Het algoritme analyseert hoeveel mensen er op de beelden staan. Dat getal wordt gestuurd naar een overzichtspagina (dashboard) voor de operationeel medewerkers van de gemeente, zodat deze een accuraat beeld hebben van de drukte op dit moment. Daarnaast wordt het getal getoond op https://druktebeeld.amsterdam.nl/. Op dit moment wordt alleen de drukte op de locatie Marineterrein getoond, in de toekomst ook voor de andere Public Eye locaties. De videobeelden verlaten de server niet en worden niet opgeslagen. Alleen voor trainingsdoeleinden wordt een zeer beperkt aantal beelden bewaard, deze zijn versleuteld.\n\nPersoonsgegevens worden volgens de geldende wet- en regelgeving (AVG) en de leidraad voor transparantie (TADA) verwerkt. Bij dit project hoort een specifieke privacyverklaring. De locaties en functies van de camera\u2019s zijn opgenomen in het cameraregister van de gemeente Amsterdam.\n\nPrestatie\n\nHet algoritme moet ongeveer 70 procent nauwkeurig zijn om er relevante inzichten uit te kunnen halen om het verkeer te reguleren. In de praktijk levert het algoritme ongeveer 90 procent nauwkeurigheid. Dit leiden we af uit de trainingsbeelden.\n\nNaast de operationele werking wordt er in dit project constant ge\u00efnnoveerd. We zijn continu op zoek naar nieuwe functionaliteiten die het systeem kunnen verbeteren:\n\n\u00c9\u00e9n van de ambities is om het systeem nog privacy vriendelijker te bouwen en dat doen we door een model toe te voegen, waardoor het mogelijk is om met minder beelden per camera het algoritme te trainen. Dit wordt het ViCCT model genoemd.\nWe willen de analyse op de sensor uit laten voeren (de \u201con edge\u201d techniek).", + "monitoring": null, + "human_intervention": "Aan de hand van de trainingsdata wordt de kwaliteit en nauwkeurigheid van het algoritme periodiek ge\u00ebvalueerd door een klein aantal medewerkers van de gemeente die toestemming hebben om de beelden te bekijken. Zij bekijken of het algoritme terecht mensen herkent als mensen.", + "risks": "De videobeelden die gebruikt worden door Public Eye worden \u2013 zodra het algoritme het aantal aanwezige mensen heeft geteld \u2013 gewist. Alleen voor het trainen van het model wordt een klein aantal videobeelden bewaard (ongeveer 300 beelden per locatie).\n\nDe beelden bevinden zich op de gemeentelijke infrastructuur die voldoet aan de Baseline Informatiebeveiliging Overheid (https://www.informatiebeveiligingsdienst.nl/project/baseline-informatiebeveiliging-overheid). Indien de beelden toch ongeanonimiseerd in verkeerde handen zouden komen is het gevaar op van een inbreuk op de privacy relatief laag: de camera hangt op een zodanig grote hoogte, dat het lastig is om op de beelden personen te herkennen. Daarnaast wordt aan dataminimalisatie gedaan: de camera\u2019s in het ArenA-gebied worden uitsluitend aangezet vanaf twee uur voorafgaand aan een evenement totdat het evenement afgelopen is. Op andere tijden staan de camera\u2019s van Public Eye in het ArenA-gebied uit. Er wordt aan gewerkt om de camera\u2019s van Public Eye op de overige locaties ook uit te zetten op momenten dat deze camera\u2019s niet noodzakelijk zijn, bijvoorbeeld \u2019s nachts.\n\nOm Amsterdammers zo goed mogelijk te informeren hangt bij elke camera een sticker met een unieke ID code zodat je op maps.amsterdam.nl/privacy kunt herleiden waarvoor deze camera bedoeld is. In dit geval zijn het alleen telcamera\u2019s. Het privacybeleid van de gemeente Amsterdam is ook op deze website te vinden: https://www.amsterdam.nl/privacy/", + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.024175+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "38748497", + "owner": "gemeente-amsterdam", + "leverancier_id": null + }, + { + "name": "Druktebeeld (NL)", + "organization": "Gemeente Amsterdam", + "department": "CTO Innovatieteam", + "description_short": "Druktebeeld is een webapp, die een beeld geeft van de actuele drukte in de stad door verschillende informatiebronnen samen te brengen. Het laat bijvoorbeeld zien hoeveel bezoekers er op een locatie zijn of welke parkeerplaatsen in gebruik zijn. Om dit beeld te krijgen, maken we gebruik van de locatiegegevens van de bezoekers via bijvoorbeeld de webapp Weeronline.", + "type": null, + "category": null, + "website": "https://algoritmeregister.amsterdam.nl/druktebeeld-nl/", + "status": null, + "goal": null, + "impact": null, + "proportionality": null, + "decision_making_process": null, + "documentation": "https://algoritmeregister.amsterdam.nl/druktebeeld-nl/", + "competent_authority": "Directie", + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": "innovatie@amsterdam.nl", + "area": "Amsterdam", + "lang": "Nederlands", + "revision_date": null, + "description": "Drukte in de openbare ruimte is al jaren een probleem in Amsterdam. Sinds de coronapandemie is het alleen maar belangrijker geworden om een goed beeld te hebben van de drukte in de stad. Druktebeeld is een webapp, die een beeld geeft van de actuele drukte in de stad door verschillende informatiebronnen samen te brengen. Het laat bijvoorbeeld zien hoeveel bezoekers er op een locatie zijn of welke parkeerplaatsen in gebruik zijn. Om dit beeld te krijgen, maken we gebruik van de locatiegegevens van de bezoekers via bijvoorbeeld de webapp Weeronline.\n\nDruktebeeld is bedoeld om het publiek te informeren over de drukte in de openbare ruimte. Mensen kunnen zien hoe druk het ergens is, en er vervolgens voor kiezen om er op een rustiger moment naartoe te gaan, of om een andere route te nemen. Bovendien helpt Druktebeeld de gemeente bij het managen van drukte als dat nodig is.", + "application_url": null, + "publiccode": null, + "mprd": null, + "source_data": "CMSA\n\nHet Crowd Monitoring Systeem Amsterdam (CMSA) geeft informatie over het aantal passanten op een aantal drukke plekken in de stad. Het gaat hier om voetgangers. De gegevens zijn anoniem. In CMSA worden vooral 2D- en 3D-sensoren gebruikt. Hiermee meten we hoe druk het ergens is. \u201cDoor data te verzamelen over aantallen, dichtheden en stromen voetgangers, is het mogelijk slimmere maatregelen te nemen om drukte goed te laten verlopen.\u201d Zie hiervoor de link https://www.amsterdam.nl/privacy/specifieke/privacyverklaring-parkeren-verkeer-bouw/crowdmanagement/)\n\nhttps://api.data.amsterdam.nl/v1/crowdmonitor/passanten/?format=api\n\nResono\n\nOm de drukte in parken, op pleinen en in winkelgebieden in de stad aan te geven, maken we gebruik van gegevens van het bedrijf Resono. \u201cResono meet drukte op elke gewenste locatie met een mobiel panel van meer dan een miljoen mensen. Hiermee maken we een nauwkeurige schatting van de drukte binnen een bepaald tijdsbestek. Locaties kunnen vari\u00ebren in oppervlakte en type. Denk bijvoorbeeld aan een winkel, winkelgebied, parkeerplaats, wijk of stad. Met Resono hebben klanten integraal inzicht in bezoekersgedrag.\u201d (vertaald van reso.no) De gemeente bepaalt voor welke gebieden Resono de gegevens verzamelt. De dataset bevat een schatting van het aantal bewegende personen binnen die gebieden, per kwartier. De gemeente krijgt dus geen informatie over personen, alleen samengevoegde gegevens. Resono voldoet aan de Nederlandse en Europese privacywetgeving. Ze hebben geen persoonlijke informatie over mensen (zoals leeftijd, geslacht), alleen anonieme locatiegegevens. Het privacybeleid van Resono vindt u hier: https://reso.no/privacy-policy/\n\nParkeergaragebezetting\n\nDeze bron geeft bijna realtime de beschikbaarheid weer van parkeerlocaties in Amsterdam, waaronder enkele P+R-locaties. Het gaat om openbare parkeergarages en -terreinen, met een focus op grote locaties (200+ plekken) in de binnenstad. Het gaat hierbij dus niet om parkeren op straat. De gegevens komen van meerdere parkeerbeheersystemen, die de in- en uitrijdende auto\u2019s tellen. De gegevens worden verzameld en eenduidig gemaakt door het bedrijf Vialis. Dit zijn open gegevens die dus door iedereen gebruikt kunnen worden. Het zijn gegevens over de capaciteit en het aantal vrije plekken per locatie. Er wordt onderscheid gemaakt tussen plekken die voor korte termijn kunnen worden gebruikt (bezoekers) en plekken die voor langere tijd kunnen worden gebruikt (abonnementen en licentiehouders). Volledige beschrijving: https://open.data.amsterdam.nl/uploads/actuele_beschikbaarheid_parkeergarages/Beschrijving%20Dataset%20-%20Actuele%20beschikbaarheid%20Parkeergarages%20v2.pdf\n\nNationaal Dataportaal Wegverkeer\n\nFloating car data van het Nationaal Dataportaal Wegverkeer. Dit zijn open data, gebaseerd op samengevoegde en anonieme gegevens uit navigatiesystemen. Ze worden geleverd door Be-Mobile. De data geven de gemiddelde snelheid weer die over de afgelopen 15 minuten werd gereden. Dit wordt vergeleken met de snelheid die daar gemiddeld wordt gereden. Op deze manier kunnen gebruikers zien of er vertragingen zijn.\n\nDe gegevens zijn geanonimiseerd.\n\nGemeentevervoerbedrijf (GVB)\n\nDe gemeente ontvangt wekelijks een overzicht van hoe vaak er op de haltes van het GVB wordt ingecheckt en uitgecheckt. Op basis van deze gegevens maken we een verwachting van de drukte voor de grote metrostations. De gegevens zijn anoniem en samengevoegd per uur met een minimum aantal in- of uitchecks van 15.", + "methods_and_models": "Modelarchitectuur\n\nVoor de visualisaties in Druktebeeld hebben we gebruik gemaakt van drie modellen, \u00e9\u00e9n voor iedere databron. Het doel van de modellen is om een waarde te vertalen naar een drukte-indicator:\nniet druk: makkelijk 1,5m afstand houden / voldoende parkeerplaatsen (kleur groen)\ndruk: mogelijk 1,5m afstand houden / weinig beschikbare parkeerplaatsen (kleur oranje)\nte druk: moeilijk/niet mogelijk om 1,5m afstand te houden / (bijna) geen beschikbare parkeerplaatsen (kleur rood)\nDrukte is enigszins subjectief. Het doel is om via de kleuren in Druktebeeld de gemiddelde drukte van de gebruikers van de app te laten zienw. Toen de 1,5m-maatregel werd afgeschaft, hebben we de definities van de kleuren aangepast. We gebruiken de feedback van gebruikers bij het instellen van druktedrempels (niet direct wanneer de gebruikers feedback geven). De modellen cre\u00ebren twee drempelwaardes per locatie: drempelwaarde lage drukte en drempelwaarde hoge drukte. Deze waarden worden om de paar weken (Resono) of maanden (CMSA & parkeren) berekend en opgeslagen. Als de telling op een locatie, op een bepaald moment is:\nOnder druktedrempel laag, krijgt een locatie de aanduiding \u2018niet druk\u2019.\nTussen druktedrempel laag en druktedrempel hoog krijgt hij de aanduiding \u2018druk\u2019.\nBoven publieksdrempel hoog, krijgt het de aanduiding \u2018te druk\u2019.\nDeze drukte-indicaties worden elk kwartier per locatie (vanuit elke bron) berekend en weergegeven in de Druktebeeld-webapp.\nPassantenmodel (CMSA):\n\nHet doel van dit model is om drempels te cre\u00ebren voor het aantal mensen dat een sensor passeert. De druktedrempels worden direct berekend op basis van de breedte van de straat waar de sensor zich bevindt. Op de Public Eye-pagina van het algoritmeregister (\nhttps://algoritmeregister.amsterdam.nl/public-eye/\n) lichten we dit nader toe. Voor sommige locaties kan het crowdmanagementteam van de gemeente de waarden aanpassen op basis van de feedback van de bezoekers.\nImpressiemodel (Resono):\n\nHet doel van dit model is om drempels te berekenen om in te schatten hoeveel mensen er in een bepaald gebied zijn. Het model is een beslisboom met de volgende input:\nhistorische Resono-gegevens;\ntype locatie (park/plein/winkelstraat);\noppervlakte (vierkante meter van het park/plein/winkelstraat);\nlengte van paden binnen het gebied (verzameld met OpenStreetMap);\nfeedback van de gebruikers van de webapp (input van\nhttps://druktebeeld.amsterdam.nl/feedback\n); en\nfeedback van het crowdmanagementteam van de gemeente.\nDe resulterende druktedrempels verschillen uiteraard per locatie.\nParkeren model:\n\nMet druktedata uit het verleden kunnen we een indicatie geven hoe groot de kans is dat een locatie vol raakt op het moment dat de gebruiker Druktebeeld controleert. De druktedata geven ook een indicatie of er voldoende tijd zit tussen het moment dat een gebruiker Druktebeeld raadpleegt en het moment dat hij arriveert op de parkeerlocatie en een plek vindt.\n\nDe bezettingsgraad wordt bepaald op basis van:\n\nde beschikbare plaatsen;\nde totale capaciteit per garage als het verschil tussen het totaal aantal beschikbare plaatsen; en\nde beschikbare plaatsen van de afgelopen 5 kwartier.\nOp dit moment gebruiken we alleen informatie over kort parkeren. De drempels worden per locatie bepaald door een analyse van historische gegevens. Voor de meeste locaties is de druktedrempel \u2018laag\u2019 vastgesteld op een bezetting van 90 procent. Onder dit percentage zijn er voldoende plekken. Voor deze locaties is de druktedrempel \u2018hoog\u2019 vastgesteld op 95 procent. Tussen de 90% en 95% zijn er voldoende plekken beschikbaar, maar de kans is groot dat deze binnen 30 minuten vol zijn. Voor sommige locaties kunnen sneller vol raken. Op die locaties zijn de drempels \u2018laag\u2019 en \u2018hoog\u2019 respectievelijk 80 procent en 90 procent.\nDrukteverwachtingen metrohaltes:\n\nWe maken een drukteverwachting voor de komende week op de metrohaltes. Daarvoor gebruiken we gegevens over in- en uitchecken uit het verleden, weersdata en de weersverwachting. De drempelwaardes zijn per halte vastgesteld, afhankelijk van hun oppervlakte.\n\nDe drukteverwachting wordt bepaald op basis van:\n\nAantal in- en uitchecks afgelopen jaar\nOppervlakte van de metrohalte\nWeerdata afgelopen week\nWeersverwachting komende week", + "monitoring": null, + "human_intervention": "Er worden geen geautomatiseerde besluiten genomen op basis van de modellen van Druktebeeld. Elke beslissing op basis van drukte wordt genomen door mensen, dat kunnen zowel ambtenaren als burgers zijn, met ondersteuning van de Druktebeeld-data en webapp.\n\nUit de \u2018passer-by\u2019- en \u2018impression\u2019-modellen komen massa-indicaties. Die worden gemonitord door om de paar weken een rapport uit te brengen. Dit rapport evalueert de invoergegevens, de gebruikersfeedback op de drukte-indicaties en de feedback van het crowdmanagementteam op de drukte-indicaties. Het rapport bevat tabellen en grafieken met gegevens en resultaten die onverwacht/onregelmatig lijken. Naar aanleiding van de resultaten van het rapport worden de modellen zo nodig aangepast.", + "risks": "De ge\u00efdentificeerde risico\u2019s zijn:\n\nBesluit wordt genomen op onjuiste indicatie van menigte.\nBewoners/bezoekers hebben het gevoel dat ze bekeken worden door de gemeente.\nOnbedoeld gebruik van de informatie.\nDe gemeente heeft niet onafhankelijk kunnen vaststellen dat de data die Resono verkrijgt volledig geanonimiseerd zijn. ICT heeft een onafhankelijk onderzoek laten uitvoeren en heeft hiervoor een certificaat uitgegeven, zie risico \u2018verkregen data\u2019. Link: https://blog.reso.no/privacy-verified-certificering-toegekend-aan-resono-2/", + "performance_standard": "Key metric: drukte-indicatie (niet druk/druk/te druk) van het model is gelijk aan de crowd-indicatie van de gebruiker (feedback via de Druktebeeld-webapp). Prestaties (gemeten 29/1 \u2013 22/2): 77% ", + "create_dt": "2023-03-31 08:34:12.029161+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "16268148", + "owner": "gemeente-amsterdam", + "leverancier_id": null + }, + { + "name": "Wmo-voorspelmodel", + "organization": "Gemeente Den Haag", + "department": "Onderwijs, Cultuur en Welzijn", + "description_short": "Het Wmo-voorspelmodel geeft een voorspelling van het aantal unieke gebruikers en de kosten van de Wmo met een voorspelhorizon van zes jaar. Voorspellingen worden gedaan op wijkniveau voor zowel de Wmo-totaal als voor deelproducten van de Wmo (Hulp bij het Huishouden, Ondersteuning thuis en Hulpmiddelen en Diensten). ", + "type": "Op regels gebaseerd", + "category": null, + "website": null, + "status": "Actief", + "goal": "Het algoritme is ontwikkeld omdat de gemeente meer inzicht wil hebben in het gebruik en de kosten van de Wmo de komende jaren. De Haagse bevolking groeit en vergrijst waardoor het gebruik van de Wmo ook naar verwachting gaat toenemen. De vraag is met hoeveel mensen en in welke Haagse wijken en voor welke Wmo-voorzieningen? Het voorspelmodel beantwoordt deze vragen.", + "impact": "Het voorspelmodel doet geen uitspraken over (kansen van) individuele burgers en er is gekozen voor modellen die uitlegbaar zijn. Dit betekent dat we als gemeente geen modellen gebruiken waarvan niet goed is vast te stellen hoe het model tot een bepaalde uitkomst is gekomen (zgn. Black Box modellen). Het Wmo-voorspelmodel vervangt op geen enkele manier de kennis en kunde van onze consulenten en uitvoering. Het instrument is voor hen niet bedoeld, maar vooral voor beleid en het maken en onderbouwen van beleidskeuzes voor de langere termijn. Juist door de kennis van het Wmo-voorspel kunnen we tijdig anticiperen en alle individuen beter blijven ondersteunen. ", + "proportionality": "Er zijn geen alternatieven overwogen om het doel te bereiken. ", + "decision_making_process": "Met de inzichten uit het Wmo-voorspelmodel wordt beleid en uitvoering ondersteund bij beantwoorden van tactische en strategische vragen. Dit zijn vragen en onderwerpen die op de langere termijn spelen (bijvoorbeeld 5 \u00e1 10 jaar). Het model is niet bedoeld voor het beantwoorden van operationele vragen (onderwerpen die op korte termijn spelen) en er is geen sprake van geautomatiseerde besluiten. ", + "documentation": null, + "competent_authority": "Het Wmo-voorspelmodel maakt geen gebruik van persoonskenmerken.", + "lawful_basis": "Er is geen wettelijke grondslag voor het voorspelmodel, maar de gemeente is verantwoordelijk voor de uitvoering van de Wmo en door het model kan de gemeente beter anticiperen op verwachte ontwikkelingen en burgers beter ondersteunen.", + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": "Gezien de aard van het model is dit niet geregeld.", + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": "Nederlands", + "revision_date": null, + "description": null, + "application_url": null, + "publiccode": null, + "mprd": "Nee", + "source_data": "Er is alleen gebruikgemaakt van open data, namelijk van het bestand Kerncijfers Wijken en Buurten CBS en van het bestand Wmo-cli\u00ebnten; type maatwerkarrangement CBS.", + "methods_and_models": "Het gaat om een regressie model. De prestaties van dit model worden afgemeten aan de hand van de maten RMSE, MAE en MAPE. Dit zijn maten die op verschillende manieren vaststellen hoe groot de voorspelfout is. ", + "monitoring": "Indien het noodzakelijk is een nieuw model te bouwen/te trainen, wordt de privacy officer betrokken bij de keuze van features en zal bij een geheel nieuw model ook opnieuw naar het ethisch kader worden gekeken.", + "human_intervention": "Er is geen sprake van een geautomatiseerd systeem. De inzichten uit het voorspelmodel kunnen alleen door tussenkomst van mensen en met de contextkennis en ervaring van betrokken medewerkers worden gebruikt. ", + "risks": "De risico's van het algoritme zijn vooraf en tijdens het bouwen van het voorspelmodel in kaart gebracht. Omdat het voorspelmodel geen uitspraken doet over individuele personen maar over het gebruik van voorzieningen in wijken, was er geen risico dat met de uitkomsten uit het model de privacy van specifieke individuele personen zou kunnen worden geschonden. Verder is alleen gewerkt met wijken die voldoende groot zijn (meer dan 100 inwoners) en waar voldoende mensen gebruikmaakten van de Wmo (meer dan 100 gebruikers). Een reden hiervoor is dat hierdoor geen onthulling mogelijk is. Dat wil zeggen dat we niet door het combineren van kenmerken kunnen vaststellen wie de mogelijke gebruikers van Wmo-voorzieningen zijn. Verder is bij het bouwen van het model samen met de privacy officer afgewogen welke variabelen wel en welke variabelen niet vanuit privacy overwegingen meegenomen konden worden. Hierbij vormde de AVG steeds het uitgangspunt. Daarnaast is uitlegbaarheid van het model en de uitkomsten een relevant en doorslaggevend criterium. Tenslotte is gebruikgemaakt van De Ethische Data Assistent van de Universiteit van Utrecht om mogelijke ethische problemen vooraf in kaart te brengen. Dit heeft geleid tot het opstellen van een ethisch kader. De vraag welke rol bias speelt in het gebruik van het algoritme is een veel te algemene vraag, aangezien er vele vormen van bias zijn. Als het gaat om vooringenomenheid gericht op specifieke bevolkingsgroepen, dan speelt dat bij dit model geen rol. We zijn niet op zoek naar specifieke individuele personen met specifieke kenmerken, maar willen een inschatting maken van het gebruik van de Wmo in de hele wijk en voor heel Den Haag.", + "performance_standard": "Het model wordt jaarlijks geactualiseerd. De voorspellingen van het oude model worden vergeleken met voorspellingen van het nieuwe model en vergeleken met de realisaties.", + "create_dt": "2023-03-31 08:34:12.034983+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "97246956", + "owner": "gemeente-den-haag", + "leverancier_id": null + }, + { + "name": "Scanauto kentekenherkenning", + "organization": "Gemeente Den Haag", + "department": "Stadsbeheer", + "description_short": "Het doel van het algoritme is om kentekens automatisch te scannen ten behoeve van parkeerhandhaving en handhaving milieuzones.", + "type": "Op regels gebaseerd", + "category": null, + "website": null, + "status": "Actief", + "goal": "Het doel van het algoritme is de herkenning van kentekens van voertuigen die in overtreding zijn voor respectievelijk naheffing parkeerbelasting en Boete Milieuzone (Wet Mulder).", + "impact": "Een burger komt in aanraking met de uitkomst van het algoritme bij een overtreding - Uitgebreide informatiepagina op www.denhaag.nl", + "proportionality": "Nee, dit is in een aanvulling op de handmatige handhaving.", + "decision_making_process": "Met het algoritme wordt het proces ondersteund om te bepalen of een auto fout geparkeerd is (Fiscale Parkeerhandhaving) en om te bepalen of een auto/vrachtauto ten onrechte in een bepaald gebied rijdt (Handhaving Milieuzones).", + "documentation": null, + "competent_authority": "Gemeente Den Haag", + "lawful_basis": "Gemeentelijke verordeningen voor fiscale parkeerhandhaving en handhaving Milieuzones.", + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": "Ja, respectievelijk Bezwarenprocedure Parkeerhandhaving en idem Milieuzones.", + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": "Nederlands", + "revision_date": null, + "description": null, + "application_url": "Verwerkersovereenkomsten en de (duur van de) contracten die de gemeente sloot met de leveranciers. De gemeente bezit geen uitgebreide documentatie over de toegepaste algoritmes.", + "publiccode": null, + "mprd": "Ja", + "source_data": "RDW, Vergunningen/ontheffingen, GBA, Nationaal Parkeer Register", + "methods_and_models": "Algoritme berust bij de leveranciers. Gemeente neemt dienstverlening af en heeft geen inhoudelijke kennis van de werking van het algoritme.", + "monitoring": "Door tussenkomst van een BOA (wel/geen naheffing/boete of. Wel/niet ontvankelijk / gegrond bezwaar). Dit proces en informatiestroom lopen via de dienstdoende BOA (opsporingsambtenaar).", + "human_intervention": "Door tussenkomst van een BOA (wel/geen naheffing/boete of. Wel/niet ontvankelijk / gegrond bezwaar). Dit proces en informatiestroom lopen via de dienstdoende BOA (opsporingsambtenaar).", + "risks": "Inkoop van dienstverlening van leveranciers die ISO gecertificeerd zijn. Algoritmes blijven berusten bij de leveranciers. Er is sprake van een verwerkersovereenkomst en een DPIA om de risico's voor de gemeente en de burgers zo klein mogelijk te houden.", + "performance_standard": "Er zijn geen specifieke prestaties van het algoritme afgesproken. Dienstverlening door de leverancier wordt periodiek besproken. ", + "create_dt": "2023-03-31 08:34:12.041137+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "94936689", + "owner": "gemeente-den-haag", + "leverancier_id": null + }, + { + "name": "Zicht op ondermijning", + "organization": "Gemeente Den Haag", + "department": "Bestuursdienst", + "description_short": "Er worden meerdere analyses uitgevoerd in het project Zicht op Ondermijning, zie ook website www.zichtopondermijning.nl. Er wordt continu doorgewerkt aan het toevoegen van inzichten en (nieuwe) analyses.", + "type": "Op regels gebaseerd", + "category": null, + "website": "www.zichtopondermijning.nl ", + "status": "Actief", + "goal": "In de analyses die voor het dashboard Zicht op Ondermijning worden uitgevoerd, worden regelmatig algoritmen toegepast. Soms zijn dit heel eenvoudige algoritmen. Waar rekenregels worden toegepast, is in strikte zin immers al sprake van een algoritme. Er worden ook methodologisch ingewikkeldere algoritmen gebruikt, zoals een beslisboomalgoritme bij de analyse naar\u00a0jonge aanwas\u00a0en\u00a0subgroup discovery\u00a0bij de groepsanalyse naar betrokkenen bij verdachte transacties. Voor het dashboard Zicht op Ondermijning worden algoritmen nooit toegepast om op het niveau van individuele adressen, bedrijven, huishoudens of personen inzichten te bieden of conclusies te trekken. Individuele gegevens zijn gepseudonimiseerd en uitkomsten zijn altijd geaggregeerd. Iedere analyse op het dashboard wordt in het onderdeel\u00a0Verdiepende informatie\u00a0in detail beschreven. Daar staat uitgelegd welke analysemethoden worden toegepast, of dit algoritmen zijn, welke keuzes daarbij gemaakt zijn en welke kenmerken van adressen, bedrijven, huishoudens of personen zijn beschouwd. Migratieachtergrond wordt in dit dashboard alleen gebruikt als kenmerk in beschrijvende statistieken van groepen huishoudens of personen, mits daar voldoende onderbouwing voor bestaat. Het wordt niet gebruikt als kenmerk in classificeringsalgoritmen die worden toegepast op huishoudens of personen.", + "impact": "Er is voor burgers geen dagelijks effect. De analyses uit de City Deal zijn bedoeld om trends en patronen van ondermijnende criminaliteit in kaart te brengen, deze worden niet in individuele gevallen benut. De opbrengsten van analyses worden publiekelijk gedeeld via een dashboard. De gegevens zijn veelal historisch (hebben betrekking op eerdere jaren) en zijn niet real time", + "proportionality": "De beoogde resultaten en inzichten zijn enkel en alleen te bereiken door te werken met microdata van het CBS binnen de kaders van de CBS-wet. Om die reden is daar in 2017 de City Deal 'Zicht op Ondermijning' voor opgesteld en ondertekend. Zie ook: https://zoek.officielebekendmakingen.nl/stcrt-2017-48699.html ", + "decision_making_process": "De uitkomsten van de analyses (en dus algoritmes) worden niet direct gebruikt voor beslissingen in individuele gevallen, hoogstens als input voor beleidskeuzes op hoger abstractieniveau.", + "documentation": null, + "competent_authority": "De verwerking van persoonsgegevens ten behoeve van de uit te voeren analyses geschiedt met inachtneming van de Wet bescherming persoonsgegevens (Wbp) en met ingang van 25 mei 2018 de Algemene verordening gegevensbescherming (AVG) en de Uitvoeringswet Algemene verordening gegevensbescherming alsmede, afhankelijk van de aard van de te verwerken persoonsgegevens, andere relevante wettelijke bepalingen met betrekking tot de bescherming van persoonsgegevens, zoals de Wet politiegegevens (Wpg), de Wet justiti\u00eble en strafvorderlijke gegevens (Wjsg) en de Wet op het Centraal bureau voor de statistiek (Wet CBS).", + "lawful_basis": "Verwerkingen voor wetenschappelijk en historisch onderzoek, statistische doeleinden en archivering in het algemeen belang worden altijd verenigbaar geacht met het oorspronkelijke verzameldoel. Maar ook als het geen verdere verwerkingen zijn, mogen persoonsgegevens worden verwerkt voor deze doeleinden, mits aan de vereisten in de Verordening wordt voldaan. De Verordening eist dat voor de bescherming van de rechten en vrijheden van betrokkenen passende waarborgen worden getroffen. Die waarborgen moeten er onder andere voor zorgen dat technische en organisatorische maatregelen zijn getroffen om zo min mogelijk persoonsgegevens te verwerken, zoals pseudonimiseren of anonimiseren. ", + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": "n.v.t.", + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": "Nederlands", + "revision_date": null, + "description": null, + "application_url": "https://zoek.officielebekendmakingen.nl/stcrt-2017-48699.html ", + "publiccode": null, + "mprd": "Ja", + "source_data": "Omdat er met meerdere algoritmes wordt gewerkt is dit lastig om in een veld op te sommen. Het CBS maakt gebruik van de BRP, BAG, WOZ, Kadaster.", + "methods_and_models": "Zie eerdere opmerking, hangt af van type analyse", + "monitoring": "Alle onderzoeksvragen worden voorgelegd aan de ethische commissie van het CBS voordat een onderzoeksvraag door een analist in behandeling wordt genomen.", + "human_intervention": "Ja, voordat een analyse-uitkomst openbaar wordt gemaakt, controleert het CBS het inzicht op onthullingsrisico.", + "risks": "Het CBS hoeft in belangrijke mate toezicht op het gehele project en waakt o.a. voor onthullingsrisico's. ", + "performance_standard": "N.v.t., gezien de rol/benutting van algoritmen binnen het project Zicht op Ondermijning.", + "create_dt": "2023-03-31 08:34:12.046042+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "83779930", + "owner": "gemeente-den-haag", + "leverancier_id": null + }, + { + "name": "Regionaal verkeersmodel: V-MRDH", + "organization": "Gemeente Den Haag", + "department": "Stedelijke Ontwikkeling", + "description_short": "Het V-MRDH is een verkeersmodel in de software Omnitrans (ontwikkelaar is DAT-Mobility, Deventer). Het algoritme berekent de hoeveelheid verplaatsingen (auto, OV en fiets) op basis van inputgegevens zoals netwerken en demografische data. Het model wordt gebruikt, intern bij Den Haag, bij andere gemeenten en bij verkeerskundige adviesbureaus.", + "type": "Op regels gebaseerd", + "category": null, + "website": null, + "status": "Actief", + "goal": "De hoeveelheid verkeer op de weg ten gevolge van een plan wordt berekend. Het plan kan zijn: een nieuwe weg of de bouw van een aantal woningen. Het model berekent de hoeveelheid verkeer op hoofdlijnen., bedoeld om scenario's (varianten) met elkaar te vergelijken. ", + "impact": "De burger krijgt nooit te maken met een directe uitkomst van een berekening met het verkeersmodel.", + "proportionality": "Voor de hele MRDH is er een verkeersmodel om toekomstige situaties door te rekenen. Wanneer in een studie ook rijkswegen zijn betrokken, wordt vaak samengewerkt met RWS omdat RWS modellen heeft voor het verkeer op rijkswegen.", + "decision_making_process": "Een berekening wordt gebruikt om beleid op het gebied van mobiliteit te maken of te onderbouwen (mobiliteit is hier de verplaatsing van mensen en goederen). Het algoritme levert nooit direct een besluit op.", + "documentation": null, + "competent_authority": "Er zijn geen persoonsgegevens.", + "lawful_basis": "Input is noodzakelijk voor gemeentelijk beleid.", + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": "Daar is nooit sprake van. Binnen projecten kunnen mensen discussi\u00ebren over de uitkomsten van het model. De uitkomst van het model wordt gebruikt om een advies te onderbouwen.", + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": "Nederlands", + "revision_date": null, + "description": null, + "application_url": "Verkeersmodel | MRDH Metropoolregio Rotterdam Den Haag.", + "publiccode": null, + "mprd": "Ja", + "source_data": "Aantallen inwoners en arbeidsplaatsen van het CBS. Plannen van alle betrokken wegbeheerders, rijk, gemeenten en provincie. Ook bestaande en toekomstige netwerken zijn input voor de berekeningen. ", + "methods_and_models": "De algoritmes in het model behoren tot de standaard-software van de producent van de software: DAT-Mobility, Deventer. ", + "monitoring": "Resultaten van het model worden altijd geanalyseerd door specialisten.", + "human_intervention": "Resultaten van het model worden altijd geanalyseerd door specialisten.", + "risks": "Resultaten van het model worden altijd geanalyseerd door specialisten.", + "performance_standard": "Geen afspraken en geen monitoring van toepassing.", + "create_dt": "2023-03-31 08:34:12.052331+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "58239517", + "owner": "gemeente-den-haag", + "leverancier_id": null + }, + { + "name": "Verkeersmodel bereikbaarheidsregie", + "organization": "Gemeente Den Haag", + "department": "Stadsbeheer", + "description_short": "Het is een verkeersmodel om stadsbreed de hinder van activiteiten (bouwwerkzaamheden, wegwerkzaamheden en evenementen) op het netwerk Bereikbaarheidsregie (het Haags hoofd verkeersnetwerk) inzichtelijk te maken, te objectiveren en zo te ondersteunen bij de afstemming en planning van die activiteiten zodat de Haagse Bereikbaarheid zo veel mogelijk geborgd blijft.", + "type": "Op regels gebaseerd", + "category": null, + "website": "https://www.dat.nl/", + "status": "Actief", + "goal": "Het doel van het model is om de impact op de verkeersdoorstroming van een enkele activiteit of de samenhang tussen meerdere activiteiten te zien in een gemodelleerde en geabstraheerde omgeving.", + "impact": "Een burger krijgt niet direct met het algoritme te maken. Als een burger gebruikmaakt van de openbare ruimte als deelnemer aan het verkeer en er zijn omleidingen dan merkt de burger dat het algoritme is gebruikt om te komen tot een zo optimaal mogelijke omleiding met zo min mogelijk overlast. ", + "proportionality": "Ja, maar na een marktconsultatie bleek er niets te bestaan dat aan de vraag voldeed. Dit model is nieuw voor de gemeente Den Haag ontwikkeld door de markt.", + "decision_making_process": "De output van het model wordt gebruikt ter onderbouwing van het afgeven van een positief besluit voor een bouwwerk, wegwerk of evenement met impact op het Haagse hoofd verkeersnetwerk in het Stedelijke BereikbaarheidsOverleg (SBO). Daarmee vormt het input voor het instemmingsbesluit.", + "documentation": null, + "competent_authority": "Er is geen sprake van verwerking van persoonsgegevens.", + "lawful_basis": "n.v.t.", + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": "n.v.t.", + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": "Nederlands", + "revision_date": null, + "description": null, + "application_url": null, + "publiccode": null, + "mprd": "Nee", + "source_data": "Er is initieel gebruikgemaakt van het V-MRDH model (HB-matrix, routekeuzes en intensiteiten) aangevuld met anonieme data uit de koplussen (nullen en enen) van 50 geregelde kruispunten.", + "methods_and_models": "n.v.t.", + "monitoring": "n.v.t.", + "human_intervention": "Het model wordt door een medewerker gevoed met data waarna het kan gaan rekenen. Het model wordt gebruikt als analyse voor de duiding van verkeersstromen door activiteiten. De output wordt gewogen in relatie tot de gesprekken met initiatiefnemers. ", + "risks": "Er zijn geen specifieke risico's in de zin van privacyaspecten rondom persoonsgegevens. Bias speelt geen rol. ", + "performance_standard": "Er zijn geen specifieke afspraken gemaakt om het algoritme te toetsen. Er is een beheer- en onderhoudscontract met de leverancier afgesproken.", + "create_dt": "2023-03-31 08:34:12.057799+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "98936960", + "owner": "gemeente-den-haag", + "leverancier_id": null + }, + { + "name": "Dynamische microsimulatiemodellen", + "organization": "Gemeente Den Haag", + "department": "Stadsbeheer", + "description_short": "Het programma geeft een visuele weergave van de verkeersafwikkeling op wegen en kruispunten. De werkelijkheid en mogelijke toekomstige werkelijkheid worden geschetst/gesimuleerd op basis van de input. Met dit computermodel kunnen opties voor weg- en kruispuntsinrichtingen en verkeersregelingen vergeleken worden en helpt het dus bij advies en keuzes.", + "type": "Op regels gebaseerd", + "category": null, + "website": "www.ptvgroup.com", + "status": "Actief", + "goal": "Het is bedoeld als hulpmiddel voor de wegbeheerderstaken om de werkzaamheden adequaat te kunnen uitvoeren, eventueel verbeteren en keuzes te onderbouwen.", + "impact": "De burger merkt niet direct iets van het programma. Uiteindelijk merkt de burger als verkeersdeelnemer iets van de keuzes die de gemeente als wegbeheerder, mede op basis van uitkomsten van simulaties, heeft gemaakt voor de verkeersafwikkeling/ een goede doorstroming. ", + "proportionality": "Dit is het meest gebruikte en beproefde microsimulatiepakket voor verkeersafwikkeling. Er is geen aanleiding om iets anders te gebruiken. ", + "decision_making_process": "Het programma wordt gebruikt als hulpmiddel bij (bestuurlijke) besluitvorming over voorgenomen herinrichting van wegen en/of kruispunten en analyse van de werking van verkeersregelingen voor kruispunten. Er wordt dan gekeken wat de herinrichting en/of het regelprogramma voor consequentie heeft in termen van verkeersafwikkeling.", + "documentation": null, + "competent_authority": "Er is geen sprake van persoonsgegevens, alleen verkeersgegevens, weggegevens en verkeerslichtgegevens.", + "lawful_basis": "N.v.t. De wettelijke basis ligt in een goede uitvoering van de wegenverkeerswet. Het is een hulpprogramma voor het werk van de wegbeheerder.", + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": "nee", + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": "Nederlands", + "revision_date": null, + "description": null, + "application_url": "www.ptvgroup.com", + "publiccode": null, + "mprd": "Nee", + "source_data": "Er wordt gebruikgemaakt van anonieme verkeersdata (aantallen voertuigen, fietsers etc. per uur/etmaal), de indeling van de weg, instellingen van het verkeersregelprogramma.", + "methods_and_models": "zie website www.ptvgroup.com ", + "monitoring": "Via de gebruikersgroepen genoemd in de vorige regel.", + "human_intervention": "De uitkomsten zijn input voor verdere verkeerskundige analyse.", + "risks": "Er zijn geen specifieke risico's in de zin van privacyaspecten rondom persoonsgegevens. Bias speelt geen rol. ", + "performance_standard": "Er zijn gebruikersgroepen van wegbeheerders waarmee periodiek wordt afgestemd door de leverancier om eventuele verbeteringen door te voeren.", + "create_dt": "2023-03-31 08:34:12.064225+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "93839192", + "owner": "gemeente-den-haag", + "leverancier_id": null + }, + { + "name": "Microsimulatiemodellen geregelde kruispunten", + "organization": "Gemeente Den Haag", + "department": "Stadsbeheer", + "description_short": "COCON\u00a0is het acroniem voor \"COherent CONglomeraat van verkeersregeltechnische software\" en is in de verkeersregeltechnische wereld binnen Nederland het meest gebruikte programma om de volgorde waarin verkeersstromen op kruisingen worden afgewikkeld (en wat wel en niet tegelijk mag) te bepalen. De uitkomst is input voor het voor elk kruispunt te maken verkeersregelprogramma.", + "type": "Op regels gebaseerd", + "category": null, + "website": "https://dtvconsultants.nl/producten-en-diensten/cocon-en-graphium/", + "status": "Actief", + "goal": "Het ontwerpen van fasevolgordes van verkeerslichten.", + "impact": "Als een burger gebruikmaakt van de openbare ruimte als deelnemer aan het verkeer komt men indirect in aanraking met de uitkomsten van COCON-berekeningen voor kruispunten. De burger merkt dit aan de volgordeverdeling en tegelijk of juist niet tegelijk mogen kruisen in de groenfases van verkeerslichten.", + "proportionality": "Er zijn geen alternatieven overwogen. Binnen de verkeerskundige wereld is dit product onomstreden. ", + "decision_making_process": "Er is niet echt sprake van de ondersteuning van een besluitvormingsproces, maar een primaire overheidstaak in relatie tot de verkeersveiligheid namelijk het ontwerp van (veilige) en optimaal functionerende kruispunten.", + "documentation": null, + "competent_authority": "Geen sprake van persoonsgegevens.", + "lawful_basis": "Dit volgt uit de wettelijke taak van de wegbeheerder en de wegenverkeerswet. ", + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": "n.v.t.", + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": "Nederlands", + "revision_date": null, + "description": null, + "application_url": "https://dtvconsultants.nl/producten-en-diensten/cocon-en-graphium/", + "publiccode": null, + "mprd": "Nee", + "source_data": "Er wordt gebruikgemaakt van anonieme data over verkeersintensiteiten in relatie tot hoe een met verkeerslichten geregeld kruispunt het beste kan worden ingericht, rekening houdend met de indeling van de rijstroken, de opstellengten, verdeling van de verkeersbewegingen.", + "methods_and_models": "zie website https://dtvconsultants.nl/producten-en-diensten/cocon-en-graphium/", + "monitoring": "n.v.t.", + "human_intervention": "Ja", + "risks": "Er zijn geen specifieke risico's in de zin van privacyaspecten rondom persoonsgegevens. Bias speelt geen rol. ", + "performance_standard": "Leverancier heeft een gebruikersgroep wegbeheerders en aan de hand van periodieke afstemming voeren ze verbeteringen door.", + "create_dt": "2023-03-31 08:34:12.069994+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "64871989", + "owner": "gemeente-den-haag", + "leverancier_id": null + }, + { + "name": "Automatische regelsoftware verkeerslichten ", + "organization": "Gemeente Den Haag", + "department": "Stadsbeheer", + "description_short": "TLCGen is een applicatie voor het maken/genereren van uniforme, hoogwaardige en beheerbare verkeersregelprogramma's voor verkeerslichten.", + "type": "Op regels gebaseerd", + "category": null, + "website": "https://www.codingconnected.eu/software/tlcgen/", + "status": "Actief", + "goal": "Het ontwerpen van regelprogramma's voor in verkeerslichten. Dit wordt ontworpen met TLCGen. Het functioneert goed als TLCGen het goede regelprogramma genereert dat voldoet aan de wetten en regels over verkeerslichten. En als het regelprogramma goed afgesteld is voor die specifieke kruising in termen van veilig en vlot.", + "impact": "Als een burger gebruikmaakt van de openbare ruimte als deelnemer aan het verkeer en dan in aanraking komt met het regelprogramma dat met TLCGen gemaakt is. De burger merkt dit aan de optimale afstelling van de groenfases van verkeerslichten.", + "proportionality": "Nee, er zijn geen serieuze alternatieven. Er zijn andere generatoren van verkeersregelprogramma's beschikbaar echter deze leveren minder kwaliteit, meer handwerk op dan TLCGen en dus een groter risico voor de wegbeheerder en een lagere beheerbaarheid.", + "decision_making_process": "Er is niet echt sprake van de ondersteuning van een besluitvormingsproces. Het is een primaire overheidstaak van de gemeente als wegbeheerder om het verkeer veilig te ordenen en vlot te geleiden. ", + "documentation": null, + "competent_authority": "Er is geen sprake van verwerking van persoonsgegevens. ", + "lawful_basis": "Dit volgt uit de wettelijke taak van de wegbeheerder en de wegenverkeerswet. ", + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": "nee", + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": "Nederlands", + "revision_date": null, + "description": null, + "application_url": "https://www.codingconnected.eu/software/tlcgen/", + "publiccode": null, + "mprd": "Nee", + "source_data": "Dit zijn data gerelateerd aan de fysieke indeling van kruispunten en de verkeerskeuzes die daaruit volgen. De fysieke eigenschappen van het kruispunt en de volgordeverdeling van verkeerstromen die wenselijk zijn voor de veilige en vlotte verkeersafwikkeling.", + "methods_and_models": "zie website https://www.codingconnected.eu/software/tlcgen/", + "monitoring": "n.v.t.", + "human_intervention": "Menselijke tussenkomst is puur gericht om de input te leveren voor het regelprogramma.", + "risks": "Er zijn geen specifieke risico's in de zin van privacyaspecten rondom persoonsgegevens. Bias speelt geen rol. ", + "performance_standard": "TLCGen is gecertificeerd door de Statistic Committee van Talking Traffic (landelijk samenwerkingsverband). Daarmee voldoen we aan de hoogste standaarden.", + "create_dt": "2023-03-31 08:34:12.075311+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "48633752", + "owner": "gemeente-den-haag", + "leverancier_id": null + }, + { + "name": "Voorspellen en voorkomen verkeersongevallen", + "organization": "Gemeente Den Haag", + "department": "Stedelijke Ontwikkeling", + "description_short": "Voorspelmodel dat op basis van een brede dataset met wegkenmerken en ongevallen risicoscores geeft op verkeersongevallen.", + "type": "Zelflerend", + "category": null, + "website": null, + "status": "In ontwikkeling", + "goal": "Het doel van het model is tweeledig. In de eerste plaats het ontwikkelen van effectief verkeersveiligheidsbeleid. Daarnaast kan het model worden ingezet om in concrete projecten twee of meer ontwerpen met elkaar te vergelijken op de score van verkeersveiligheid.", + "impact": "Specifiek voor verkeerskundigen, burgers zien uiteindelijk aanpassingen aan de weg, minder ongevallen (is doel).", + "proportionality": "Destijds was dit het enige model dat correlaties onderzoekt tussen ongevalcijfers en kenmerken van de weg, het kruispunt of de omgeving. ", + "decision_making_process": "Het model is een hulpmiddel voor het prioriteren van verkeersveiligheidsbeleid. Er is dus geen sprake van geautomatiseerde besluitvorming.", + "documentation": null, + "competent_authority": "Er is geen sprake van werken met persoonsgegevens. ", + "lawful_basis": "Noodzakelijk voor gemeentelijk beleid.", + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": "Het algoritme zoekt een verband tussen objectief vast te stellen variabelen. Het gaat om de correlatie van geregistreerde ongevallen en objectief waarneembare data van de weg of de omgeving. De gebruiker besluit hier wel of geen consequentie aan te verbinden. Daarom is er geen sprake van een mogelijkheid om hier bezwaar tegen te maken. ", + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": "Nederlands", + "revision_date": null, + "description": null, + "application_url": "www.ongevalrisico.nl\nhttps://docs.google.com/presentation/d/1_Kt3_mMHhjH-KZgKJxmmqlf9rlRdJr9mgaUUBcGtBDU/edit?authuser=1#slide=id.p4", + "publiccode": null, + "mprd": "Ja", + "source_data": "www.ongevalrisico.nl\nhttps://docs.google.com/presentation/d/1_Kt3_mMHhjH-KZgKJxmmqlf9rlRdJr9mgaUUBcGtBDU/edit?authuser=1#slide=id.p4 O.a. BGT, NWB en BRON", + "methods_and_models": "Algoritme is XGBoost. Validatie: AUC, ROC, confusion matrix, subjectieve meldingen van burgers over verkeersveiligheid.", + "monitoring": "Door de expert.", + "human_intervention": "Ja, adviserende uitkomsten voor wegexperts. Modeluitkomsten worden nooit 1 op 1 overgenomen.", + "risks": "Er wordt uitdrukkelijk geen data gekoppeld die is te herleiden naar persoonlijk niveau. De uitkomsten worden door een expert beoordeeld voor gebruik.", + "performance_standard": "Hier zijn geen afspraken voor gemaakt.", + "create_dt": "2023-03-31 08:34:12.081003+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "56214518", + "owner": "gemeente-den-haag", + "leverancier_id": null + }, + { + "name": "PDF naar 3D-objecten (Vector-data)", + "organization": "Gemeente Den Haag", + "department": "Publiekszaken", + "description_short": "Uit diverse soorten tekeningen gegevens over gebouwen zoals oppervlakte/grootte, type, indeling, geometrie (vorm en ligging) herleiden voor gebruik in (basis)registraties. De status van PDF2GIS is 'in ontwikkeling'. PDF2GIS bevindt zich in de testfase van fase 1 appartementstekening (van 3 fasen).", + "type": "De algoritmen zijn zowel op regels gebaseerd als t.z.t. zelflerend. Er wordt gebruik gemaakt van bestaande algoritmen. Die worden zo mogelijk verbeterd. Correcties door de gebruiker van PDF2GIS voeden in de toekomst het zelflerend vermogen, bijv. in het tekenen van lijnen en lezen van tekstlabels. Voor fase 2 bouwtekeningen wordt voor het zelflerende algoritme traindata opgebouwd door zelf bouwtekeningen te annoteren. ", + "category": null, + "website": "De code wordt niet openbaar gepubliceerd. De applicatie PDF2GIS wordt in opdracht van de gemeente Den Haag ontwikkeld door Coders Co. De businesscase en het intellectueel eigendom liggen bij de leverancier. PDF2GIS is ge\u00efnitieerd vanuit project Startup in Residence.", + "status": "In ontwikkeling", + "goal": "De applicatie PDF2GIS is bedoeld om gegevens over gebouwen te herleiden uit splitsingstekeningen (fase 1), bouwtekeningen (fase 2) en plattegronden van makelaars (fase 3). Het betreft het in samenhang inwinnen van objecten, relaties en attributen van objecten zoals onder meer pand, verblijfsobject, gebouwzone, bouwlaag, ruimte en het appartementsrecht. Het in samenhang inwinnen komt de kwaliteit (o.a. volledigheid, consistentie en nauwkeurigheid) ten goede. Een hogere kwaliteit vermindert vragen en afstemmingsproblemen tussen bijv. (basis)registraties. De applicatie komt uiteindelijk in de plaats van het meten in een papieren tekening of in een digitale tekening met bijv. Bluebeam (waarbij bestaande lijnen worden overgetekend). Een gegevensbeheerder of geo-informatiebeheerder bedient de applicatie en kan in elk van 13 stappen ingrijpen om correcties aan te brengen. De gegevens worden gebruikt in (basis)registraties zoals WOZ, BAG en in de toekomst wellicht SOR (Samenhangende objectenregistratie). Het programma functioneert goed wanneer de kwaliteit van de gegevens zich kan meten aan handmatig ingewonnen gegevens.", + "impact": "Het effect op het dagelijks leven van burgers en bedrijven is dat de applicatie PDF2GIS gegevens oplevert over woningen en bedrijfsgebouwen. Dit soort gegevens, zoals grootte/oppervlakte en geometrie, wordt in de basisregistratie BAG vastgelegd en in de (basis)registratie WOZ in het taxatieproces gebruikt ten behoeve van het nemen van de WOZ-beschikkingen. Een burger of bedrijf kan de gegevens zelf zien via de bagviewer.kadaster.nl of het woz-waardeloket.nl. Voor een direct belanghebbende eigenaar/gebruiker van een gebouw kunnen gegevens in detail getoond worden op een WOZ-taxatieverslag. Wellicht worden gegevens ook opgenomen in een Twin City nederlandin3d.nl/denhaag en t.z.t. in de SOR (samenhangende objectenregistratie).", + "proportionality": "Er bestaat geen alternatief voor de algoritmen van PDF2GIS. PDF2GIS wordt juist zelf gezien als alternatief voor een traditionele manier van inwinnen van gebouwengegevens. Bij een traditionele manier van werken maken individuele, gemeentelijke medewerkers elk op hun eigen wijze een interpretatie van lijnen en tekst om daaruit gebouwgegevens te herleiden. Hierbij worden verhoudingsgewijze minder consequente interpretaties gedaan en verhoudingsgewijze meer fouten gemaakt, bijv. in het kalibreren. De kracht van PDF2GIS is het in samenhang kunnen inwinnen van gegevens die nu nog in verschillende basisregistraties afzonderlijk worden bijgehouden. De huidige praktijk is dat gegevens in vier verschillende registraties (WOZ, BAG, BGT, 3D-stadsmodel) niet gelijktijdig en vanuit verschillende bronnen worden bijgehouden. Dit is verhoudingsgewijze duur (verschillen terugmelden e.d.) en de kwaliteit is verhoudingsgewijze laag (door o.a. verschillen in tijd, nauwkeurigheid, precisie enz.). Er bestaan geen andere programma's met algoritmen die gebouwengegevens in samenhang kunnen inwinnen en die daarbij gebruik maken en daarbij gebruikmaken van bestaande, bekende gegevens over gebouwen, zoals in het stelsel van basisregistraties of de WOZ-registratie.", + "decision_making_process": "PDF2GIS ondersteunt geen besluitvormingsproces. PDF2GIS wordt beoogd een rol te spelen in primaire processen waarin gebouwengegevens worden toegepast. O.a. het beheren van basisregistraties (o.a. BAG over adressen en gebouwen) en de uitvoering van de Wet WOZ (waardering onroerende zaken). Indirect spelen de gegevens uit PDF2GIS een rol in de heffing van belastingen door overheden (via de grootte en de WOZ-waarde die mede op de oppervlakte/grootte gebaseerd is).", + "documentation": null, + "competent_authority": "Er is geen sprake van de verwerking van persoonsgegevens.", + "lawful_basis": "Op grond van o.a. Wet BAG (over het beheren adressen en gebouwen-gegevens) wordt de grootte van het verblijfsobject gemeten, op grond van de Wet WOZ (over de waardering van onroerende zaken) de grootte van gebouwzones op bouwlagen binnen het WOZ-object. WOZ maakt gebruik van BAG en in Den Haag is WOZ ook nog eens gedelegeerd bronhouder voor oppervlaktegegevens in de BAG (WOZ meet voor BAG om gemeentebreed voor elk gebouw dezelfde oppervlakte-gegevens te hanteren).", + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": "Er kan 'bezwaar' gemaakt worden tegen de uitkomst van het proces waarin het algoritme PDF2GIS wordt gebruikt. Websites zoals bagviewer.kadaster.nl en wozwaardeloket.nl tonen enkele basale basisgegevens van gebouwen. Bij de BAG kan op grond van gerede twijfel altijd een terugmelding worden ingediend. Bij de WOZ kan de belanghebbende (eigenaar/gebruiker) van een gebouw na ontvangen van een WOZ-beschikking en een taxatieverslag gemotiveerd een bezwaar indienen (een vraag stellen kan altijd) en daarbij wijzen op onjuiste gegevens. In het kader van het bezwaar (of als vraag) wordt dit beoordeeld en indien nodig verbeterd.", + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": "Nederlands", + "revision_date": null, + "description": null, + "application_url": "Documentatie van relevante algoritmen is hier te vinden: https://paperswithcode.com/paper/east-an-efficient-and-accurate-scene-tekst; https://tesseract-ocr.github.io/tessdoc/Home.html; https://docs.opencv.org/4.5.3/d6/d10/tutorial_py_houghlines.html", + "publiccode": null, + "mprd": "Ja", + "source_data": "Er wordt in het algoritme PDF2GIS gebruikgemaakt van gegevens in basisregistraties. Dit betreft de WOZ (waardering onroerende zaken), BAG (adressen en gebouwen), BGT (grootschalige topografie) en BRK (kadaster) als gegevensbron. Het resultaat van PDF2GIS wordt idealiter verwerkt naar (basis)registraties WOZ en BAG, in de toekomst naar de SOR (samenhangende objectenregistratie). Het algoritme verwerkt een tekening (appartementstekening fase 1, bouwtekening in fase 2 en plattegrond van makelaar in fase 3) tezamen met bekende gegevens uit basisregistraties. De bewerking leidt zoveel mogelijk tot gegevens over gebouwen. Dit zijn de objecten, relaties en attributen zoals genoemd in informatiemodellen van BAG (IMBAG), WOZ (IMWOZ) en de SOR.", + "methods_and_models": "PDF2GIS maakt onder meer gebruik van algoritmen zoals tekst-detectie (EAST algoritme), tekstherkenning (Tesseract OCR), lijn-herkenning (Hough Line Transform), polygonen-vormende algoritmen alsmede algoritmen voor het georefereren (rubber-sheeting e.d.).", + "monitoring": "De risico's worden gemonitord bij elke tekening die wordt verwerkt. Beoordeeld wordt of de tekening overeenkomt met de werkelijkheid. En de uitkomst van het algoritme wordt afgezet tegen bekende gegevens van het gebouw op tekening.", + "human_intervention": "Ja, zeker is er sprake van tussenkomst van de mens in de zin van gebruiker van het algoritme PDF2GIS. Het destilleren van gebouwengegevens uit gescande (soms oude, minder goed leesbare) tekeningen is (nog) te complex om 'blind' uitsluitend aan een algoritme over te kunnen laten. Het verwerken van een tekening wordt in fase 1 in 13 stappen uitgevoerd. En in elke stap wordt de gebruiker geacht correcties aan te brengen als dat nodig is. De gebruiker moet het resultaat ook voorlopig nog zelf verwerken in evt. afnemende (basis)registraties.", + "risks": "Aan het werken met de algoritmen van PDF2GIS zijn geen risico's verbonden. De grootste valkuil is het werken met een tekening die niet een actuele situatie weergeeft. De medewerker die met PDF2GIS werkt let hierop door beeldmateriaal te bestuderen zoals luchtfoto's. Bovendien vormt de output van PDF2GIS op termijn de input van een keten waarin gebouwgegevens gevalideerd en gedistribueerd worden. Van bias, in die zin dat het algoritme een systematisch verschil in representativiteit kan opleveren ('discrimineert'), is geen sprake. Hooguit kan het zijn dat algoritmen beter werken op tekeningen van veel voorkomende gebouwen (appartementen) en minder goed op unieke gebouwen, waardoor de gebruiker vaker handmatige correcties moet uitvoeren.", + "performance_standard": "De prestatie van de algoritmen in PDF2GIS wordt beoordeeld op basis van vakmanschap van de gebruikers van de applicatie. De gebruiker van de applicatie PDF2GIS toetst de output van PDF2GIS op basis van vakmanschap en aan de hand van reeds bekende gegevens van de gebouwen die op tekening staan. Voor de grootte/oppervlakte van objecten zijn meetinstructies op basis van NEN 2580 hiervoor een leidraad. Voor nauwkeurigheid van oppervlaktegegevens zijn criteria geformuleerd in BAG- en WOZ-regelgeving leidend. In beginsel worden tekeningen ingepast op gebouwen die veelal met terrestrische landmeettechnieken zijn ingemeten met hoge nauwkeurigheid (centimeters nauwkeurigheid).", + "create_dt": "2023-03-31 08:34:12.087049+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "56889459", + "owner": "gemeente-den-haag", + "leverancier_id": null + }, + { + "name": "Tactisch capaciteitsoptimalisatiemodel", + "organization": "Gemeente Den Haag", + "department": "Onderwijs, Cultuur en Welzijn", + "description_short": "Het algoritme berekent hoeveel medewerkers er nodig zijn om verzuimmeldingen op te pakken. Binnen het algoritme kunnen verschillende doelstellingen worden gedefinieerd , om de benodigde capaciteit te kunnen bepalen. ", + "type": "Op regels gebaseerd. (Mixed Lineair Programming Model). ", + "category": null, + "website": "Er is (nog) geen openbare publicatie van het algoritme. ", + "status": "Actief", + "goal": "Het algoritme wordt gebruikt om te berekenen a) hoeveel medewerkers er nodig zijn om de werkzaamheden uit te kunnen voeren, ter ondersteuning van de werkprocessen en b) introduceert een innovatieve technologie (beslsimodellen) , met name bedoelt om te kunnen evalueren of beslismodellen modellen ingezet kunnen worden op dagelijks (operationeel) niveau. ", + "impact": "Bij een goede interpretatie van de modelresultaten kan er een keuze gemaakt worden voor een verdeelstrategie van de verzuimmeldingen. Mogelijke impact: a) kortere doorlooptijden, b) lagere werkvoorraden , c) rationalisering van prioriteiten om verzuimmeldingen op te pakken, d) efficientere inzet FTE's", + "proportionality": "Het alternatief voor het gebruik van een algoritme is een handmatige berekening. Bij een handmatige berekening kan een optimale toewijzing niet bepaald kan worden ( er zijn teveel mogelijkheden. Een wiskundig model kan wel de optimale oplossing vinden). Daarnaast kan een handmatige berekening tot fouten leiden en vergt het erg veel tijd.", + "decision_making_process": "Het model dient op dit moment met name als een Proof of Concept om te kunnen beslissen of een operationeel planningmodel geimplementeerd kan worden ( zie Operationeel capaciteitsoptimalisatiemodel). ", + "documentation": null, + "competent_authority": "Niet relevant; de gebruikte gegevens zijnniet herleidbaar naar individuele personen.", + "lawful_basis": "Leerplichtwet.", + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": "Nee, algoritme slechts voor intern gebruik.", + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": "Nederlands", + "revision_date": null, + "description": null, + "application_url": "Algoritmiek is gedocumenteerd, maar niet openbaar gemaakt, omdat het model slechts voor intern gebruik is bedoeld. ", + "publiccode": null, + "mprd": "Nee", + "source_data": "Geanonimiseerde gegevens over casemanagers (id en beschikbaarheid), type en aantal verzuimmeldingen", + "methods_and_models": "Mixed Integer Lineair Programeren", + "monitoring": "Op dit moment worden de uitkomsten van het model nog niet gebruikt voor de besluitvorming.", + "human_intervention": "Er vindt geen geautomatiseerde besluitvorming plaats. Het model wordt slechts gebruikt voor analyses voor intern gebruik, waarbij er geen koppeling met verschillende bronnen plaatsvindt.", + "risks": "Geen risco. De model uitkomsten zijn zogenaamde adviezen, die gebaseerd zijn op veronderstellingen waar het model mee wordt gevoed. Het is van belang om de veronderstellingen goed te begrijpen, zodat de modeluitkomsten goed geinterpreteerd kunnen worden. Het model is beslissingsondersteunend en niet beslissingsnemend. ", + "performance_standard": "Hoogte werkvoorraad, gemiddelde doorlooptijd verzuimmelding, aantal FTE's", + "create_dt": "2023-03-31 08:34:12.093210+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "42584722", + "owner": "gemeente-den-haag", + "leverancier_id": null + }, + { + "name": "Bevolkingsprognosemodel", + "organization": "Gemeente Den Haag", + "department": "Stedelijke Ontwikkeling", + "description_short": "De bevolkingsprognose geeft Inzicht in de samenstelling, spreiding en de toekomstige omvang van de bevolking.", + "type": "Op regels gebaseerd", + "category": null, + "website": null, + "status": "Actief", + "goal": "Inzicht te hebben in de (mogelijke) toekomstige ontwikkeling van de Haagse bevolking naar leeftijd.", + "impact": "Het model heeft geen directe invloed op het dagelijks leven van burgers. ", + "proportionality": "GBPRO is een model dat gemaakt is door en voor Nederlandse gemeenten. Er zijn geen vergelijkbare alternatieven beschikbaar waarbij je op lokaal (gemeente) niveau de situatie qua sterfte, geboorte en migratie zo goed mogelijk kan inschatten.", + "decision_making_process": "De uitkomsten zijn input voor gemeentelijke beleidsmakers zoals bv op het gebied van ruimtelijke ordening, stedelijke ontwikkeling, sociale ontwikkeling, arbeidsmarkt, volkshuisvesting, economie, zorg en welzijn en onderwijs.", + "documentation": null, + "competent_authority": "Niet relevant; de gebruikte gegevens zijn geaggregeerd en niet herleidbaar naar individuele personen.", + "lawful_basis": "Input is noodzakelijk voor gemeentelijk beleid.", + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": "Geen persoonsgegevens dus niet van toepassing.", + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": "Nederlands", + "revision_date": null, + "description": null, + "application_url": "Opvraagbaar.", + "publiccode": null, + "mprd": "Nee", + "source_data": "Geaggregeerde gegevens van minimaal 5 jaar voor: Basisbevolking naar leeftijd en geslacht\nGeboorten naar leeftijd moeder\nSterfte naar leeftijd en geslacht\nVertrek Binnenland naar leeftijd en geslacht\nVertrek Buitenland naar leeftijd en geslacht\nVestiging Binnenland naar leeftijd en geslacht\nVestiging Buitenland naar leeftijd en geslacht", + "methods_and_models": "Op basis van de aanname van de (gecorrigeerde) kansen wordt de prognose voor het eerste jaar\nper leeftijd en geslacht opgesteld.\nDit gebeurt door eerst de correctie voor het binnenlands vertrek te bepalen, waarna het totaal\nvertrek binnenlands en buitenlands bepaald wordt. Om vervolgens het aantal geboorten te kunnen\nbepalen worden eerst vestiging, vertrek, zowel binnenlands als buitenlands berekend en de sterfte\nberekend, waarna het totaal aantal geboorten kan worden berekend. Als het aantal geboorten is\nberekend worden deze nuljarig gemaakt en verdeeld over de geslachten. In het proces wordt\ndaarna weer het vertrek bepaald, de instroom en de sterfte. De laatste stap is de beginbevolking\nnaar leeftijd en geslacht plus de vestiging naar leeftijd en geslacht min het vertrek naar leeftijd en\ngeslacht min de sterfte naar leeftijd en geslacht. Deze laatste cyclus levert de eindbevolking van\nhet eerste prognosejaar. Deze bevolking is de startbevolking van het tweede prognosejaar. Op\ndeze wijze wordt de prognose het ingesteld aantal jaren vooruit berekend. Met behulp van de\ncorrectiematrix is het mogelijk om de prognose met een gewijzigde aanname opnieuw door te\nrekenen.", + "monitoring": "Resultaten van het model worden altijd geanalyseerd door specialisten.", + "human_intervention": "Ja, opgeven van parameters zoals toekomstige vruchtbaarheid, sterftekansen, immigratie en emigratie, woningvoorraad. De uitkomsten van het model zijn input voor verwerking door diverse beleidsvelden, via menselijke tussenkomst.", + "risks": "Resultaten van het model worden altijd geanalyseerd door specialisten.", + "performance_standard": "Jaarlijks worden de uitkomsten van de prognose vergeleken met de realisatie.", + "create_dt": "2023-03-31 08:34:12.100137+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "91458197", + "owner": "gemeente-den-haag", + "leverancier_id": null + }, + { + "name": "Algoritme datakwaliteit", + "organization": "Gemeente Den Haag", + "department": "Stedelijke Ontwikkeling", + "description_short": "Quality-Bot (Q-Bot) ontdekt zelfstandig bestaande en nieuwe patronen in de data. Deze gebruiken we als Quick Scan om de datakwaliteit in te schatten en mogelijke fouten te ontdekken. Vervolgens kunnen goede patronen geadopteerd worden als datakwaliteitsregels om de datakwaliteit continu te monitoren. ", + "type": "Zelflerend", + "category": null, + "website": "n.v.t., proprietary code", + "status": "Actief", + "goal": "Doel van het algoritme is om patronen om mogelijke (structurele) fouten in data te ontdekken om deze te vertalen naar kwaliteitsregels. Het is bedoeld om de bronhouder te voeden met nieuwe inzichten over de data kwaliteit. Het is niet bedoeld om zelfstandig data te corrigeren.", + "impact": "Het effect is indirect voor de burger. Het effect is direct voor de medewerkers van Den Haag die ondersteund worden om de kwaliteit van de dienstverlening naar de burger te verbeteren. De kwaliteit van de registratie wordt beter en daarmee ook de kwaliteit van de dienstverlening.", + "proportionality": "Ja, Q-bot brengt focus aan bij het verbeteren van datakwaliteit. Het helpt dataspecialisten gericht fouten of bijzonderheden in data op te sporen en op te lossen.", + "decision_making_process": "Draagt bij aan het data controle en correctie proces. De rol van het algoritme is om suggesties te doen voor verbetering met als doel om de data beter kloppend te maken. Beleid en besluitvorming blijven bij de bronhouder liggen.", + "documentation": null, + "competent_authority": "Er worden geen persoonsgegevens verwerkt.", + "lawful_basis": "Geen, er worden geen persoonsgegevens verwerkt.", + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": "Ja door de medewerkers erfpacht, en dat is juist de bedoeling.", + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": "Nederlands", + "revision_date": null, + "description": null, + "application_url": "n.v.t., Phinion biedt dienst aan als een SaaS.", + "publiccode": null, + "mprd": "Nee", + "source_data": "Erfpacht contracten, eigendommen en kadasterpercelen. Deze zijn aan elkaar verbonden.", + "methods_and_models": "Zelfgebouwd algoritme dat gebruik maakt van verschillende, bestaande machine learning algoritmes. Diverse bestaande algoritmes worden toegepast op de data en resultaten hieruit worden verzameld. Vervolgens selecteert het eigen algoritme welke patronen relevant en sterk zijn.", + "monitoring": "Risico's worden beheerst door middel van evaluatie van medewerkers.", + "human_intervention": "Ja, dit is de kern van de applicatie.", + "risks": "Beheersing van de risico's ligt bij de gemeente. De risico's zijn beperkt omdat het algoritme geen zelfstandige beslissingen neemt. De bias is uitsluitend technisch van aard en heeft geen impact op de besluitvorming en de burger.", + "performance_standard": "Prestatie gebeurt via gebruikersevaluatie. De medewerkers bepalen welke patronen ze willen gebruiken en hoe goed deze zijn.", + "create_dt": "2023-03-31 08:34:12.105792+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "67582219", + "owner": "gemeente-den-haag", + "leverancier_id": null + }, + { + "name": "Herkenning bijplaatsing ORAC's", + "organization": "Gemeente Den Haag", + "department": "Stadsbeheer", + "description_short": "Digitaal scannen en categoriseren van types bijplaatsingen bij Orac\u2019s.", + "type": "Zelflerend", + "category": null, + "website": null, + "status": "Gestopt", + "goal": "De technische ontwikkeling inzake beeldherkenning uitbaten in het operationeel proces door gebruik te maken van de scanauto\u2019s van parkeerhandhaving. Beeldherkenning kan een goede toevoeging zijn aan de verschillende manieren waarop bijplaatsingen worden gesignaleerd, aangezien scanauto\u2019s nu ook al door de stad rijden. Het doel is het versterken van de MOR-keten en opvolging te versnellen. Reductie op herhaalmeldingen, dubbelmeldingen, handmatige handelingen en de opvolgtijd van opruimen is -naast de dienstverlening aan de burger- een significante verbetering van de bedrijfsvoering voor de ketenpartners. Met toepassing van scantechnologie wordt beoogd om met -uitbreiding van- bestaande middelen de meldingenketen extra te voeden. De opruiming van afval en de handhaving erop kunnen mogelijk nog sneller worden opgevolgd. ", + "impact": "\u2022 Bijplaatsingen worden sneller gedetecteerd en opgeruimd (schone stad);\n\u2022 De melder wordt sneller ge\u00efnformeerd (betere dienstverlening), wanneer een melding tevens m.b.v. de scantechnologie wordt gedetecteerd.", + "proportionality": "Ja, er zijn verschillende initiatieven om de overlast van afval te bestrijden. Dit project is een aanvulling in de aanpak en geen alternatief.", + "decision_making_process": "De raad nam op 20 februari 2020 een motie aan waarin de raad het college oproept een onderzoek uit te voeren naar de inzet van scanauto\u2019s (RIS 304747), uit dit onderzoek bleek de technologie voor handen. \nHet college wilde ook onderzoeken of de data verkregen door de scantechnologie ge\u00efntegreerd kunnen worden met meldingen uit het meldsysteem (zodat ze samen \u00e9\u00e9n informatiebron vormen voor de planning van de operatie op straat) en/of de data gebruikt kunnen worden voor informatiegestuurd werken in de capaciteitsplanning en de beleidsmatige aanpak van bijplaatsingen. Het onderzoek is uitgevoerd en heeft uitgewezen dat koppeling van gegevens te realiseren is. ", + "documentation": null, + "competent_authority": "Er worden geen persoonsgegevens verwerkt.", + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": "n.v.t.", + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": "Nederlands", + "revision_date": null, + "description": null, + "application_url": null, + "publiccode": null, + "mprd": "Nee", + "source_data": "Beeldopnames van orac's.", + "methods_and_models": null, + "monitoring": "n.v.t.", + "human_intervention": "Een deskforce monitort de beeldherkenning met name om het zelflerend effect van de toegepaste kunstmatige intelligentie te bevorderen op automatische toekenning aan de juiste afvalcategorie en de opvolging van de informatievoorziening naar de betrokken ketenpartners.", + "risks": "Er zijn risico's m.b.t. opslag beelden, deze zijn nog niet in kaart gebracht.", + "performance_standard": "n.v.t.", + "create_dt": "2023-03-31 08:34:12.111557+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "44714491", + "owner": "gemeente-den-haag", + "leverancier_id": null + }, + { + "name": "Smartcity/ geluidsherkenning", + "organization": "Gemeente Den Haag", + "department": "Bedrijfsvoering", + "description_short": "Algoritme dat op basis van spectrogrammen detecteert welk geluid in het spectrogram te zien is. In ontwikkeling, nog niet actief, er wordt nog geen data gedeeld. ", + "type": "Op regels gebaseerd", + "category": null, + "website": "De Cyrb-sensoren zijn toegevoegd aan onderstaande kaart.\nhttps://ddh.maps.arcgis.com/apps/webappviewer/index.html?id=8531785e9a8c4450be8839385003f1bc", + "status": "In productie", + "goal": "Het algoritme is ontwikkeld om geluiden te herkennen. In de huidige toepassing wordt voor geluiden die boven een bepaald decibelniveau liggen vastgesteld wat de aard van het luide geluid was. Dit geeft inzicht in het soort geluiden dat overlast geeft. Het algoritme is bedoeld om een globaal beeld te krijgen waar, wanneer er wat voor soorten geluidsoverlast aanwezig zijn zodat daar verder onderzoek naar gedaan kan worden. De uitkomsten van het algoritme zijn niet bedoeld als grond voor directe besluiten of acties zonder verificatie van de uitkomsten.", + "impact": "Het effect van de uitkomst van het algoritme: Door een beter inzicht in de oorzaak van geluidsoverlast die wordt ervaren door burgers, kan de gemeente haar taak in het handhaven van een prettige comfortabele buitenruimte beter uitvoeren. Naast het kunnen vaststellen van het type geluid (geluidherkenning) werd in een testopstelling ook het geluidniveau (decibel) gemeten. Op dit moment zijn er geen burgers die in contact komen met het algoritme. Twee bewoners van de omgeving waar dit algoritme is getest zijn tijdens de duur van de test betrokken geweest om te onderzoeken of de beoogde concept toepassing werkt. Zij hebben middels een dashboard inzicht gekregen in de decibelniveau\u2019s die gemeten worden in de buitenruimte (nb: het algoritme zelf meet geen decibels). Bij deze twee bewoners is een sensor aan hun gevel opgehangen om te kunnen verifi\u00ebren wat de geluidsniveau\u2019s bij hun woning zijn. Naast deze twee intensief betrokken bewoners is tijdens de zomer van 2020 een groter evenement georganiseerd om bezoekers en bewoners van en aan de boulevard te informeren, tijdens het Smart @Sea festival. Via publicaties in de (lokale) kranten, op websites van de gemeente Den Haag en Provincie Zuid Holland worden bewoners ge\u00efnformeerd over de diverse testen die worden uitgevoerd in het kader van het Living Lab Scheveningen programma. Deze test om inzicht te krijgen in geluidsoverlast en geluidsbeleving valt ook binnen dat programma. https://www.denhaag.nl/nl/in-de-stad/wonen-en-bouwen/ontwikkelingen-in-de-stad/ontwikkelingen-scheveningen-kust/nieuwe-uitvindingen-in-living-lab-scheveningen.htm", + "proportionality": "Er is geen alternatief voor het geluidsherkenningsalgoritme. Het algoritme is een toevoeging op het meten van geluidsniveau\u2019s. ", + "decision_making_process": "Het algoritme wordt niet gebruikt voor besluitvorming. Het algoritme bepaalt uitsluitend welk geluid zichtbaar is in een spectrogram.", + "documentation": null, + "competent_authority": "De gemeente Den Haag is de Verwerkingsverantwoordelijke, Cyrb de verwerker. Er is geen verstrekker of ontvanger.", + "lawful_basis": "Er is geen wettelijke grondslag gekozen. Zo lang het systeem nog niet werkt, is het ook niet nodig om de DPIA uit 2019 bij te werken. ", + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": "Er is geen formele bezwaarprocedure. Het algoritme herkent geluiden in de openbare ruimte. Op basis van het algoritme worden geen besluiten genomen waar individuen mee tekort kunnen worden gedaan. Mochten burgers onverhoopt bezwaar willen maken dan kan dit door het bezwaar kenbaar te maken via info@cyrb.nl.", + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": "Nederlands", + "revision_date": null, + "description": null, + "application_url": "Niet beschikbaar", + "publiccode": null, + "mprd": "Nee", + "source_data": "Het algoritme verwerkt uitsluitend spectrogrammen die weer zijn gegenereerd op basis van zelf ingewonnen audiobestanden.", + "methods_and_models": "Bij het evalueren van het model wordt de confusion matrix gebruikt en de categorical-crossentropy als metric. ", + "monitoring": null, + "human_intervention": "Nee", + "risks": "Het algoritme is getraind op openbare datasets van vergelijkbare geluiden. Omdat deze niet altijd hetzelfde klinken en dezelfde karakteristieken hebben (en aard) als de geluiden die op locatie worden opgevangen zou het algoritme fouten kunnen maken in de geluidsherkenning. Omdat het algoritme alleen ter beeldvorming dient levert dit niet direct risico's op voor de betrokken burgers en ondernemers. Het risico op uitlekken van data (opgenomen geluiden) is ondervangen door het geluid niet op het apparaat op te slaan maar direct de geluidsherkenning op het apparaat uit te voeren.", + "performance_standard": "Er zijn geen afspraken vastgelegd om de kwaliteit van de geluidsherkenning te verifi\u00ebren. Het algoritme geeft zelf overigens ook aan met welke mate van zekerheid een geluid is herkend.", + "create_dt": "2023-03-31 08:34:12.119050+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "32429839", + "owner": "gemeente-den-haag", + "leverancier_id": null + }, + { + "name": "Uitrekenen WOZ-waarde", + "organization": "Gemeente Den Haag", + "department": "Publiekszaken", + "description_short": "Het bepalen en fiatteren van de WOZ-waarde op basis van taxatiemodellen en het opstellen van een taxatieverslag. De status van 4Woz 2.0 is in productie. In de gemeente Den Haag worden in 2022 voor het eerst taxatiewaarden bepaald met 4Woz. Dit taxatieproces wordt momenteel (november 2021) ontworpen. Nu gebeurt het taxeren nog met vergelijkbare taxatiemodellen binnen IBS (Integraal Belasting Systeem), dat door de gemeente Den Haag zelf is gebouwd.", + "type": "De algoritmen van de huidig te implementeren taxatiemodellen van 4Woz zijn volledig op regels gebaseerd. Een toekomstig in gebruik te nemen taxatiemodel binnen 4Woz is gebaseerd op machine learning.", + "category": null, + "website": "De code wordt niet openbaar gepubliceerd. De applicatie 4Woz is een standaard WOZ-taxatiesysteem van het bedrijf 4Value, dat ook door andere gemeenten in Nederland wordt gebruikt.", + "status": "Actief", + "goal": "De applicatie 4Woz ondersteunt in het taxatieproces ten behoeve van de uitvoering van de wet WOZ. 4Woz ondersteunt het beheren van objectkenmerken, het analyseren van marktgegevens, het bepalen van taxatiewaarden, het controleren en fiatteren van de taxatiewaarden tot (in IBS) te beschikken WOZ-waarden en het opstellen van het taxatieverslag als onderbouwing van de WOZ-waarde. De algoritmen spelen met name een rol bij het bepalen van de taxatiewaarden en het opstellen van het taxatieverslag omdat hieraan complexe berekeningen en vergelijkingen ten grondslag liggen. Het algoritme voor het taxeren functioneert goed wanneer het waardeniveau correct is, de onderlinge waardeverhoudingen goed zijn en er een aansluiting is van de getaxeerde waarden op de geanalyseerde marktgegevens. Het algoritme voor het opstellen van het taxatieverslag werkt goed als taxatieverslagen de getaxeerde waarde aannemelijk maken, bijv. door de presentatie van alle objectkenmerken van het object zelf, het vermelden van de eigen marktgegevens en (bij woningen) de verwijzing naar drie vergelijkbare verkochte woningen met een WOZ-waarde.", + "impact": "Het effect op het dagelijks leven van burgers en bedrijven is dat de applicatie 4Woz de gemeente Den Haag in staat stelt jaarlijks voor alle WOZ-objecten in Den Haag een nieuwe, actuele WOZ-taxatie te maken en deze te onderbouwen met een taxatieverslag. De WOZ-taxaties worden jaarlijks bij een voor bezwaar en beroep vatbare WOZ-beschikking aan burgers en bedrijven verzonden (op papier of digitaal). Daarover wordt gecommuniceerd via lokale media, de website van de gemeente Den Haag en MijnDenHaag.nl. De WOZ-waarde van de woning is beperkt openbaar en te raadplegen via het wozwaardeloket.nl. Burgers en bedrijven kunnen van de WOZ-objecten waarvan zij belanghebbende (eigenaar en/of gebruiker) zijn het taxatieverslag opvragen. Afnemers van de WOZ-waarde, zoals de Rijksbelastingdienst en het Hoogheemraadschap, gebruiken de WOZ-waarde voor o.a. belastingheffing.", + "proportionality": "Er bestaat geen beter alternatief voor de algoritmen van 4Woz. 4Woz wordt momenteel juist zelf gezien als alternatief voor een traditionele manier van taxeren waarbij buiten het taxatiemodel van IBS om individuele taxaties gemaakt kunnen worden. Bij een volledig traditionele manier van werken maken individuele, gemeentelijke taxateurs elk op hun eigen wijze een interpretatie van objectkenmerken en marktgegevens tot een taxatiewaarde. Een geautomatiseerd taxatiemodel dat werkt volgens algoritmen draagt er in het algemeen aan bij dat de analyse van marktgegevens, het taxeren van objecten en het onderbouwen door middel van een taxatieverslag veel consistenter en eenduidiger verloopt. De frequentie van jaarlijks taxeren en WOZ-beschikkingen nemen is alleen mogelijk dankzij algoritmen zoals in 4Woz opgenomen.", + "decision_making_process": "De applicatie 4Woz ondersteunt in het taxatieproces ten behoeve van de uitvoering van de wet WOZ. Dit is een wettelijke taak die aan alle gemeenten in Nederland is opgedragen. De Wet WOZ heeft ten doel de waardebepaling van onroerende zaken in de gemeente ten behoeve van onder meer belastingheffing door overheden Rijk, Hoogheemraadschap en gemeente. In 4Woz worden de taxaties bepaald en door WOZ-taxateurs gefiatteerd. De WOZ-waarden en taxatieverslagen worden aan het IBS (Integraal Belasting Systeem) geleverd, dat de voor bezwaar en beroep vatbare besluiten neemt, die WOZ-beschikkingen worden genoemd. Deze worden tezamen met de aanslagen van gemeentelijke belastingen aan de burgers en bedrijven kenbaar gemaakt binnen acht weken na 1 januari van elk jaar.", + "documentation": null, + "competent_authority": "De verwerkingsverantwoordelijke is de gemeente Den Haag. De rechtmatige grondslag is de Wet WOZ.", + "lawful_basis": "De wettelijke basis die het werken met algoritmen/taxatiemodellen zoals 4Woz noodzakelijk maakt is de Wet WOZ (waardering onroerende zaken). Hierbij stelt de gemeente Den Haag jaarlijks van alle WOZ-objecten de waarde vast via een voor bezwaar en beroep vatbare WOZ-beschikking. De getaxeerde waarde wordt onderbouwd met een taxatieverslag dat voor belanghebbenden beschikbaar is. De gemeente voert de Wet WOZ mede uit voor de afnemers, o.a. de Rijksbelastingdienst en het Hoogheemraadschap. Gegevens worden aan de afnemers geleverd via de Landelijke Voorziening WOZ (LV WOZ).", + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": "Er kan bezwaar gemaakt worden tegen de uitkomst van het proces waarin het algoritme 4Woz wordt gebruikt. De uitkomst van de algoritmen is de WOZ-waarde die bij voor bezwaar en beroep vatbare WOZ-beschikking is vastgesteld. Een andere uitkomst van het algoritme is een taxatieverslag dat de WOZ-waarde onderbouwt. Volgens de Wet WOZ kan de belanghebbende (eigenaar/gebruiker) van een WOZ-beschikking binnen zes weken na dagtekening van de beschikking gemotiveerd een bezwaar indienen en daarbij wijzen op onjuiste gegevens. In het kader van de behandeling van het bezwaar worden de grieven beoordeeld en aan de WOZ-beschikking ten grondslag liggende gegevens incl. WOZ-waarde indien nodig verbeterd. De uitspraak op het bezwaarschrift staat open voor beroep. Ook kan de belanghebbende altijd een vraag richten aan de Belastingzaken van de gemeente Den Haag. Dit kan soms leiden tot ambtshalve aanpassingen.", + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": "Nederlands", + "revision_date": null, + "description": null, + "application_url": "Niet van toepassing.", + "publiccode": null, + "mprd": "Ja", + "source_data": "Bij de Wet WOZ wordt zeer veel gebruik gemaakt van basisregistraties. Het WOZ-object wordt afgebakend op basis van gegevens over eigendom vastgelegd in de Basisregistratie Kadaster, BRK. En het gebruik wordt gebaseerd op natuurlijke en niet-natuurlijke personen die in de Basisregistratie Personen (BRP) en/of het Handelsregister (NHR) zijn vermeld. Bij de afbakening van WOZ-objecten wordt ook de relatie gelegd naar panden en adresseerbare objecten uit de Basisregistratie Adressen en Gebouwen (BAG). Een deel van de belastingapplicatie IBS vormt tevens de Basisregistratie WOZ (waardering onroerende zaken), waarin het object, het belang (de belastingplicht) en de WOZ-waarde zijn vastgelegd. Het sectormodel WOZ geeft inzicht in de honderden gegevens die in een belastingapplicatie en taxatiesysteem zoals 4Woz zijn opgenomen. Het voert te ver dit hier uit te schrijven. Twee hoofdgroepen data worden via het algoritme verwerkt, In de eerste plaats zijn dit objectkenmerken zoals primaire objectkenmerken (soort object, grootte, bouwjaar, bijgebouwen e.d.), secundaire objectkenmerken die een kwalificatie zijn van bijv. ligging, onderhoud, kwaliteit en uitstraling. De tweede groep data omvat marktgegevens, zoals vraagprijzen, koopsommen, huurprijzen, stichtingskosten en grondprijzen. Deze worden veelal tot kengetallen herleid. Het algoritme rekent vervolgens met objectkenmerken x kengetallen de waarden van WOZ-objecten in onderdelen uit. De opstelsom van de waarde van onderdelen is de taxatiewaarde die na controle wordt gefiatteerd en geleverd aan IBS (Integraal Belasting Systeem).", + "methods_and_models": "In feite zijn de algoritmen zeer eenvoudige wiskundige bewerkingen zoals optellen, aftrekken, vermenigvuldigen en delen bij het bereken van taxatiewaarden uit objectkenmerken en prijzen per eenheid. Ditzelfde geldt bij het opstellen van taxatieverslagen. Ingewikkeldere deelprocessen zoals het coderen en opmeten van objectkenmerken en het classificeren van objecten in groepen e.d. is nog ouderwets handwerk. Dit geldt ook voor het instellen van de prijzen per eenheid waarmee gerekend wordt. Dat er toch algoritmen worden toegepast in de vorm van 4Woz heeft te maken met het feit dat bijna 300.000 WOZ-objecten met een veelvoud aan WOZ-deelobjecten en objectkenmerken) in een jaarlijks proces getaxeerd worden. Daarbij helpt het algoritme dit op een consistente wijze te doen zodat zo goed mogelijk kan worden gewaarborgd dat gelijke objecten gelijk behandeld worden. ", + "monitoring": "De uitkomsten van de algoritmen van 4Woz zijn afhankelijk van de kwaliteit van objectkenmerken, een juiste analyse van marktgegevens en de juiste inrichting van de uitgangspunten van de taxatiemodellen. Er wordt aan de voorkant van dit taxatieproces een groot belang gehecht aan het vakmanschap van de gegevensbeheerders WOZ voor een eenduidige en volledige registratie van objectkenmerken. Op dezelfde wijze wordt belang gehecht aan vakmanschap van de WOZ-taxateur voor de juiste marktanalyse, kennis van de markt, de inrichting en werking van de taxatiemodellen en de controle van taxaties. Via informeel contact zijn ook vele burgers en bedrijven in staat informatie te verschaffen ten behoeve van het taxatieproces en/of de bezwarenbehandeling.", + "human_intervention": "Ja, zeker is er sprake van tussenkomst van de mens in de zin van de gebruiker van de applicatie 4Woz. Gegevensbeheerders WOZ verzorgen het op consistente wijze beheren van objectkenmerken, WOZ-taxateurs analyseren marktgegevens in wisselwerking met belanghebbenden (burgers en bedrijven). WOZ-taxateurs richten de modellen in, wat neerkomt op het bepalen van prijzen per eenheid en het instellen van de invloed van objectkenmerken op de taxatiewaarde. De uitkomst van het taxatiemodel wordt ten slotte gecontroleerd door WOZ-taxateurs voordat de WOZ-waarden worden vastgesteld.", + "risks": "Voor geautomatiseerde taxatiemodellen zijn risico's met name een gebrekkige kwaliteit van objectkenmerken, onvoldoende of onvoldoende geanalyseerde marktgegevens, de inrichting van de taxatiemodellen met kengetallen en een gebrekkig controleproces van getaxeerde waarden. De uitkomsten van de algoritmen van 4Woz zijn afhankelijk van de kwaliteit van objectkenmerken, een juiste analyse van marktgegevens en de juiste inrichting van de uitgangspunten van de taxatiemodellen. Er wordt aan de voorkant van dit taxatieproces een groot belang gehecht aan het vakmanschap van de gegevensbeheerders WOZ voor een eenduidige en volledige registratie van objectkenmerken. Op dezelfde wijze wordt belang gehecht aan vakmanschap van de WOZ-taxateur voor de juiste marktanalyse, kennis van de markt, de inrichting en werking van de taxatiemodellen en de controle van taxaties. Via informeel contact zijn ook vele burgers en bedrijven in staat informatie te verschaffen ten behoeve van het taxatieproces en/of de bezwarenbehandeling.", + "performance_standard": "Bij de uitvoering van de Wet WOZ wordt voor beoordeling van de uitkomsten van het taxatieproces (met de algoritmen van o.a. 4Woz) gebruikgemaakt van controleprotocollen die als voorbeeld zijn opgesteld door de Waarderingskamer. De Waarderingskamer is een onderdeel van het Ministerie van Financi\u00ebn dat toezicht houdt op de uitvoering van de Wet WOZ. In het kader van de toepassing van de beoordelingsprotocollen wordt onder meer de aansluiting op marktniveau beoordeeld op basis van ratio's en kengetallen. Dit gebeurt zowel voor de hele gemeente als voor groepen objecten en individuele objecten. Ook wordt gekeken naar vraagprijzen in relatie tot WOZ-waarden (van te koop staande objecten), naar een consistente waardeontwikkeling ten opzichte van een vorige waarde peildatum, naar de marktontwikkeling van wel/niet verkochte objecten, naar bevindingen uit de bezwarenbehandeling en ten slotte worden de taxatieverslagen beoordeeld.", + "create_dt": "2023-03-31 08:34:12.126607+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "41525861", + "owner": "gemeente-den-haag", + "leverancier_id": null + }, + { + "name": "Model van Bijstand naar Werk", + "organization": "Gemeente Den Haag", + "department": "Sociale Zaken en Werkgelegenheidsprojecten", + "description_short": "Algoritme dat op grond van kenmerken doelgroepen kan identificeren binnen de groep mensen in de bijstand. Het doel is: op maat dienstverlening naar werk of participatie. ", + "type": "Op regels gebaseerd", + "category": null, + "website": null, + "status": "Gestopt", + "goal": "Doel was om op grond van kenmerken een passend aanbod te kunnen bepalen voor mensen in de bijstand naar werk of participatie trajecten. ", + "impact": "Het algoritme was een eenmalige manuele analyse. Het is te vroeg om te zeggen hoe gebruik, risico beheersing en communicatie precies vorm zouden krijgen. ", + "proportionality": "De standaard dienstverlening is dat consulenten op grond van gesprekken en data de keuzes voor dienstverlening maken. Een advies op grond van het algoritme zou hier een aanvulling op kunnen zijn.", + "decision_making_process": "Het algoritme had kunnen helpen te bepalen welke burger in de bijstand gebaat is bij bepaalde dienstverlening van de gemeente. Het gaat om een advies aan de consulent. Besluitvorming is niet geautomatiseerd. Alle burgers in de bijstand krijgen dienstverlening, niemand wordt uitgesloten.", + "documentation": null, + "competent_authority": "De gemeente Den Haag is verantwoordelijk voor de verwerking. Eenmalig is met een leverancier gewerkt en werd een verwerkersovereenkomst gesloten. Er worden persoonsgegevens verwerkt. De juridische grondslag is uitvoering van de wettelijke taak Participatiewet. De verwerkingsverantwoordelijke is de gemeente Den Haag.", + "lawful_basis": "De juridische grondslag is uitvoering van de wettelijke taak Participatiewet.", + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": "Het algoritme is niet gefinaliseerd. Sowieso geldt: de consulent spreekt de kandidaat en neemt de uitkomst van het algoritme mee in het gesprek. Op grond van dit gesprek wordt een vervolgtraject afgesproken.", + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": "Nederlands", + "revision_date": null, + "description": null, + "application_url": null, + "publiccode": null, + "mprd": "Nee", + "source_data": "Bijstandsgegevens, gegevens over re-integratie en participatie trajecten, over schuldhulpverlening en zelfredzaamheid. De output wordt niet gebruikt als input in een ander geautomatiseerd proces. ", + "methods_and_models": "Data analyse m.b.v. Excel en R. Decision tree. Cluster algoritme. Tekstmining.", + "monitoring": "Het algoritme is niet in productie genomen. Als het in productie zou komen worden de uitkomsten van het algoritme regelmatig ge\u00ebvalueerd om eventuele biases te herkennen. Ook zal worden ge\u00ebvalueerd hoe het algoritme wordt toegepast door de consulent. ", + "human_intervention": "Ja", + "risks": "Er is een DEDA traject uitgevoerd (De Ethische Data Assistent) om potenti\u00eble ethische problemen te herkennen. Ook is een DPIA uitgevoerd om privacy risico's te herkennen. Tijdens ontwikkeling van het algoritme houdt de projectgroep de risico's in de gaten. Mocht het algoritme klaar zijn en ge\u00efmplementeerd worden dan zal extra bewaking op de risico's worden ingericht. Het bewust vermijden van bias en aandacht voor inclusie blijven een aandachtspunt in de operatie.", + "performance_standard": "Eerst wordt bepaald of onderscheidende klantsegmenten mogelijk zijn met de beschikbare data. Vervolgens wordt getoetst of bepaalde segmenten een grotere kans op uitstroom naar werk hebben en of er andere belangrijke focusgebieden zijn voor dienstverlening op maat. Het algoritme functioneert goed als het de kans op uitstroom naar werk verhoogt of zorgt voor een betere dienstverlening naar participatie. ", + "create_dt": "2023-03-31 08:34:12.132776+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "71627856", + "owner": "gemeente-den-haag", + "leverancier_id": null + }, + { + "name": "Aanvraag uitkering Bijstand /Bbz Levensonderhoud", + "organization": "Gemeente Den Haag", + "department": "Sociale Zaken en Werkgelegenheidsprojecten", + "description_short": "Het algoritme wordt gebruikt door de 4 grootste Nederlandse gemeenten (G4) en controleert op basis van ingevulde velden in het aanvraagformulier of een persoon in aanmerking komt voor een uitkering.", + "type": "Op regels gebaseerd", + "category": null, + "website": null, + "status": "Actief", + "goal": "Doel is om het proces van het aanvragen van een uitkering te standaardiseren zodat de kwaliteit geborgd is. ", + "impact": "Dit algoritme heeft betrekking op bewoners van Den Haag die een aanvraag doen voor een uitkering Bijstand/ Bbz Levensonderhoud. We communiceren de uitkomst naar de ontvanger van de uitkering. De gebruikte beslisregels in het algoritme zijn verplicht vanuit de Participatiewet.", + "proportionality": "Voor aanvragers zonder DIGID of iemand uit een kwetsbare doelgroep zal een consulent aan de gemeentebalie het formulier helpen invullen en dan doorzetten naar Galo. De aanvraag doorloopt daarna hetzelfde proces met het algoritme. ", + "decision_making_process": "Na ontvangst van het aanvraagformulier worden ingevulde gegevens door het algoritme in het systeem Galo gecontroleerd. Ook worden brongegevens uit de Suwi-keten gebruikt, een verplichting vanuit de Participatiewet. Op basis van deze informatie volgt een signalering aan de consulent die de aanvraag afhandelt. Besluitvorming is niet geautomatiseerd, de consulent beslist. ", + "documentation": null, + "competent_authority": "De gemeente Den Haag is verantwoordelijk voor de verwerking. Het technisch onderhoud van het algoritme is uitbesteed aan Wigo4IT. Er worden persoonsgegevens verwerkt. De juridische grondslag is uitvoering van de wettelijke taak Participatiewet. ", + "lawful_basis": "De juridische grondslag is uitvoering van de wettelijke taak Participatiewet (met als onderdeel de wet SUWI) en WEU (wet eenmalige uitvraag). ", + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": "Er kan bezwaar gemaakt worden tegen het besluit.", + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": "Nederlands", + "revision_date": null, + "description": null, + "application_url": null, + "publiccode": null, + "mprd": "Ja", + "source_data": "Gegevens van de aanvrager(s) en personen die invloed hebben op de hoogte en het recht van de uitkering. \nBRP, persoons-, familie-en adresgegevens.\nUWV: dienstverbanden, uitkeringen, inkomsten\nRDW: voertuigbezit\nKvk: gegevens onderneming\nDUO: Studie en ontvangst WSF", + "methods_and_models": "Beslisboom", + "monitoring": "Door in het aanvraagformulier vragen te stellen die met ja/nee te beantwoorden zijn of door een vooraf aangegeven optie. Daardoor zijn de gegevens optimaal betrouwbaar. Het enige risico bij het aanvraagproces is dat een burger, door het formulier verkeerd in te vullen een onterecht negatief of positief advies krijgt (van algoritme en consulent). Dit risico wordt geminimaliseerd door het formulier zo eenvoudig mogelijk te maken. Het aanvraagformulier en de bevraging van de brongegevens voldoen aan het wettelijke kader waarbinnen de gegevens mogen worden opgevraagd. (participatiewet, wet Suwi, WEU)", + "human_intervention": "Ja", + "risks": "Het aanvraagformulier is dusdanig vormgegeven dat de ingevulde informatie eenduidig is (door bijv. vooringevulde waarden te selecteren en geen open tekstvelden te gebruiken) zodat er geen risico is om tot de verkeerde conclusie te komen. De signaleringen vanuit dit proces worden periodiek getoetst met de geldende wetgeving in de Participatiewet. De uitkomst beperkt zich tot een signalering, het besluit ligt altijd bij een medewerker. ", + "performance_standard": "Criterium is de juistheid van de signalering. De signaleringen vanuit dit proces worden periodiek getoetst met de geldende wetgeving in de Participatiewet. De uitkomst beperkt zich tot een signalering, het besluit ligt altijd bij een medewerker. ", + "create_dt": "2023-03-31 08:34:12.139937+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "54281370", + "owner": "gemeente-den-haag", + "leverancier_id": null + }, + { + "name": "Ondersteuning berekening uitkering", + "organization": "Gemeente Den Haag", + "department": "Sociale Zaken en Werkgelegenheidsprojecten", + "description_short": "Het algoritme wordt gebruikt door de 4 grootste Nederlandse gemeenten (G4) en bepaalt op grond van wet- en regelgeving of er recht is op een uitkering, soort uitkering, hoogte en duur en geeft dit als advies aan de consulent.", + "type": "Op regels gebaseerd", + "category": null, + "website": null, + "status": "Actief", + "goal": "Doel is een correct besluit op grond van wet- en regelgeving.", + "impact": "Dit algoritme heeft betrekking op bewoners van Den Haag die een aanvraag doen voor een uitkering of een uitkering ontvangen, bijvoorbeeld voor levensonderhoud. Zij hebben ermee te maken op het moment dat zij een uitkering ontvangen. We communiceren de uitkomst naar de ontvanger van de uitkering. ", + "proportionality": "Een alternatief zou zijn: handmatige opvoer en controle van de uitkeringscomponenten. Maar dit vraagt veel kennis van de consulent op het gebied van wet en regelgeving en is daarmee een te groot risico op fouten. ", + "decision_making_process": "Het gaat om het besluitvormingsproces over het recht op uitkering, welke uitkering, de hoogte en de duur. Het algoritme is een advies aan de consulent. Besluitvorming is niet geautomatiseerd, de consulent beslist. ", + "documentation": null, + "competent_authority": "De gemeente Den Haag is verantwoordelijk voor de verwerking. Het technisch onderhoud van het algoritme is uitbesteed aan Wigo4IT. Er worden persoonsgegevens verwerkt. De juridische grondslag is uitvoering van de wettelijke taak Bijstandswet. ", + "lawful_basis": "De juridische grondslag is uitvoering van de wettelijke taak Bijstandswet.", + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": "Er kan bezwaar gemaakt worden tegen het besluit.", + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": "Nederlands", + "revision_date": null, + "description": null, + "application_url": null, + "publiccode": null, + "mprd": "Ja", + "source_data": "Er is o.a. een koppeling met de BRP en Suwinet. Gezinssituatie, woonsituatie, inkomen, vermogen, persoonlijke gegevens. Normgegevens vanuit wet en regelgeving. ", + "methods_and_models": "Beslisboom", + "monitoring": "Het algoritme werkt met gegevens uit de basisregistratie van de gemeente. Aanpassingen door consulenten zijn herleidbaar. En daarnaast op basis van gegevens die gestructureerd zijn ingevoerd op basis van voorgedefinieerde waarden. De consulent is alert op het checken van de uitkomsten. De burger kan vragen stellen of vragen om herziening. ", + "human_intervention": "Ja", + "risks": "De afdeling Beleid werkt de wet en regelgeving uit. Bij de automatisering van dit proces zijn de risico's in kaart gebracht. Het systeem wordt bij elke release opnieuw getest. Dagelijks vindt technische en menselijkse controle plaats.", + "performance_standard": "Er vinden dagelijks technische controles plaats. Daarnaast kan de consulent fouten constateren en geeft deze door aan functioneel beheer. Bij nieuwe releases wordt getest door Wigo4IT, functioneel beheer en consulenten.", + "create_dt": "2023-03-31 08:34:12.145741+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "86652588", + "owner": "gemeente-den-haag", + "leverancier_id": null + }, + { + "name": "Cyrb geluidsherkenning", + "organization": "Gemeente Den Haag", + "department": "Stadsbeheer", + "description_short": "Algoritme dat een geluid detecteert en vaststelt wat voor soort geluid het is. Het soort geluid wordt vastgelegd.", + "type": "Op regels gebaseerd", + "category": null, + "website": null, + "status": "Actief", + "goal": "Het gaat om een pilot. Het algoritme is ontwikkeld om geluiden te herkennen. Daarnaast is het bedoeld om een beeld te krijgen waar, wanneer er wat voor soorten geluidsoverlast aanwezig is. Een derde doel is om eventueel direct te acteren als het type geluid of het geluidsniveau daar aanleiding toe geeft. ", + "impact": "De uitkomsten van het algoritme zijn gevalideerd met bewoners om te onderzoeken of de beleving van het geluid overeenkomt met de gemeten waardes. Als een burger/bezoeker/bedrijf zorgt voor geluidsoverlast of een verontrustend type geluid (bijv. pistoolschot) krijgt de burger te maken met handhaving of politie.", + "proportionality": "Er is geen alternatief; dit is de simpelste en minst inbreukmakende meting.", + "decision_making_process": "Het algoritme wordt gebruikt om een handhaver af te sturen op een situatie waar mogelijk wat mis is, afgaande op het type geluid. Er is geen sprake van geautomatiseerde besluitvorming. ", + "documentation": null, + "competent_authority": "Er worden geen persoonsgegevens verwerkt. De gemeente Den Haag is verantwoordelijk. Cyrb zorgt voor de verwerking.", + "lawful_basis": "Gemeentewet. Artikel 172 Handhaving openbare orde", + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": "Er is geen formele bezwaarprocedure. Er vindt altijd een menselijke check plaats van de uitkomsten. Mochten burgers onverhoopt bezwaar willen maken dan kan dit door het bezwaar kenbaar te maken bij de gemeente.", + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": "Nederlands", + "revision_date": null, + "description": null, + "application_url": "Zie Cyrb.nl", + "publiccode": null, + "mprd": "Nee", + "source_data": "Geluidsfragmenten", + "methods_and_models": "Bij het evalueren van het model wordt de confusion matrix gebruikt en de categorical-crossentropy als metric. ", + "monitoring": "Kritisch zal bekeken worden of de sensoren de verwachte meerwaarde ook echt bieden. Bevindingen van burgers zijn welkom en worden mee-overwogen", + "human_intervention": "Ja", + "risks": "Het algoritme is getraind op openbare datasets van vergelijkbare geluiden. Omdat deze niet altijd hetzelfde klinken en dezelfde karakteristieken hebben (en aard) als de geluiden die op locatie worden opgevangen zou het algoritme fouten kunnen maken in de geluidsherkenning. Omdat het algoritme alleen ter beeldvorming dient levert dit niet direct risico's op voor de betrokken burgers en ondernemers. Er is geen risico op schending van de privacy doordat het geluid zelf niet wordt opgeslagen. Bij de categorisering van het geluid zijn geen aspecten meegenomen die zouden kunnen leiden tot bias, bijv. nationaliteit. ", + "performance_standard": "Voor de totale oplossing geldt dat de effectiviteit onderzocht wordt. Daarvoor wordt gemeten of de signalen nuttig waren, de drempelwaardes goed staan, of de locatie van de microfoon goed is, of er genoeg opvolging gegeven kan worden, etc. ", + "create_dt": "2023-03-31 08:34:12.153015+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "22733216", + "owner": "gemeente-den-haag", + "leverancier_id": null + }, + { + "name": "Left luggage detection", + "organization": "Gemeente Den Haag", + "department": "Stadsbeheer", + "description_short": "Herkennen van bijgeplaatst afval naast ondergrondse containers", + "type": "Op regels gebaseerd", + "category": null, + "website": "https://zoek.officielebekendmakingen.nl/gmb-2021-464650.pdf ", + "status": "Gestopt", + "goal": "Het algoritme is oorspronkelijk ontwikkeld voor de detectie van vergeten bagage. Functioneert goed bij vaste camera's (niet draaibaar of inzoombaar) en bij voldoende licht. Werkt niet goed bij dynamische omgevingen of in het duister.", + "impact": "Het algoritme detecteert vermoedelijke bijplaatsingen van afval. Vervolgens kijkt een handhaver op de video of het echt een bijplaatsing is. Daarna worden de bijbehorende beelden bekeken door een handhaver om te zien of de bijplaatser in beeld is. Daarna kan de handhaver de bijplaatser - als die wordt herkend door de handhaver - een bestuurlijke boete geven. Dat is wat de burger ervan merkt. Camera's worden geplaatst op grond van het Aanwijzingsbesluit van de burgemeester: https://zoek.officielebekendmakingen.nl/gmb-2021-464650.pdf", + "proportionality": "Alle 'lichtere' middelen (meer toezicht, meer informatie over regels, meer containers en nog tientallen andere middelen) zijn uitgeprobeerd en leverden niet het gewenste resultaat. De camera's worden nu ook ingezet als aanvullend instrument.", + "decision_making_process": "Handhaving Afvalstoffenverordening, geen geautomatiseerde besluiten", + "documentation": null, + "competent_authority": "Verwerkingsverantwoordelijk is de gemeente Den Haag. De rechtmatige grondslag: zie volgende regel. Er is geen sprake van verwerking van persoonsgegevens in het algoritme: het algoritme geeft een hit als hij detecteert dat een niet bewegend object langere tijd blijft staan. Op de camerabeelden zijn wel personen herkenbaar in beeld maar deze worden alleen bekeken door hiervoor aangewezen handhavers na een signaal van het algoritme. ", + "lawful_basis": "Art. 151c Gemeentewet, jo. APV en Afvalstoffenverordening Den Haag", + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": " Nee, maar de uitkomsten van het algoritme worden altijd beoordeeld door een persoon. Bezwaar kan worden gemaakt tegen een boete. ", + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": "Nederlands", + "revision_date": null, + "description": null, + "application_url": "Het algoritme is ontwikkeld en geinstalleerd door de leverancier van het camerasysteem, Connection Systems. Daar is de documentatie op te vragen. ", + "publiccode": null, + "mprd": "Nee", + "source_data": "Camerabeelden", + "methods_and_models": "Het algoritme berust bij de leveranciers. Gemeente neemt dienstverlening af en heeft geen inhoudelijke kennis van de werking van het algoritme.", + "monitoring": "Er zijn geen risico's omdat er altijd een persoon de uitkomsten beoordeelt.", + "human_intervention": "Ja, zie de beschrijving.", + "risks": "Voor het project is een Gegevensbeschermings effectbeoordeling (GEB) uitgevoerd en een Data privacy impact assessment (DPIA). Het enige risico is een vals positief (het lijkt op een bijplaatsing, maar is het niet) of een vals negatief (het was een bijplaatsing, maar het algoritme heeft dat niet herkend). In beide gevallen zijn de gevolgen voor de betrokkene nihil. Bij een vals positief verwijdert de handhaver de beelden na beoordeling. Bij een vals negatief gebeurt er niks met de beelden. Beelden zonder herkenning worden automatisch verwijderd door het systeem.", + "performance_standard": "Aan het eind van het project wordt het in totaal ge\u00ebvalueerd. O.a. het aantal vals positieve herkenning en vals negatieve herkenning door het algoritme.", + "create_dt": "2023-03-31 08:34:12.158885+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "53531982", + "owner": "gemeente-den-haag", + "leverancier_id": null + }, + { + "name": "Voorspelling drukte en stembiljettengebruik bij stembureaus", + "organization": "Gemeente Den Haag", + "department": "Publiekszaken", + "description_short": "Op basis van de opkomst in de eerste 3 uren (volgens de StembureauApp) wordt een prognose over de komende 10 uren gemaakt voor drukte en afname stembiljetten. ", + "type": "Op regels gebaseerd", + "category": null, + "website": null, + "status": "Actief", + "goal": "Voor signalering van mogelijke drukte en daaraan gekoppelde stembiljettenverbruik. Het algoritme geeft een score normaal, rustig en druk. Deze score wordt zichtbaar op de Wachtrij app voor het publiek. Daarnaast gebruikt de controlekamer van de verkiezingen de gegevens voor advies aan de voorzitter van het stembureau over benodigde extra stembiljetten. Ook kan besloten worden door de voorzitter van het stembureau om mensen naar een ander bureau te verwijzen.", + "impact": "De kiezer beslist zelf of hij/zij gebruik maakt van de Wachtrij app en de gegevens die het algoritme gegenereerd heeft.", + "proportionality": "Eerste versie was een telling van het daadwerkelijk aantal bezoekers in het Stembureau als input voor voorraadbeheersing van het aantal stembiljetten. Dit werkte minder goed.", + "decision_making_process": "Geen directe besluitvorming, indicatie van mogelijke drukte en/of lage voorraad stembiljetten. Voor actie wordt concreet gekeken naar voorraden en drukte bij specifieke stembureaus", + "documentation": null, + "competent_authority": "Gemeente Den Haag is verwerkingsverantwoordelijke. Er is geen sprake van persoonsgegevens, slechts van tellingen.", + "lawful_basis": "Kieswet", + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": "Nee ", + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": "Nederlands", + "revision_date": null, + "description": null, + "application_url": null, + "publiccode": null, + "mprd": "Nee", + "source_data": "De StembureauApp registreert dat er mensen gestemd hebben maar niet wie. De aantallen worden gebruikt voor het algoritme. Geen afhankelijkheden", + "methods_and_models": "Gemiddelden per uur, historische curves over tijd en lineaire regressie.", + "monitoring": "Nvt", + "human_intervention": "Ja", + "risks": "Geen risico want kiezer beslist zelf welk stembureau hij/zij bezoekt. Geen geautomatiseerde besluitvorming. Bias speelt geen rol want het aantal kiezers wordt geteld onafhankelijk van persoonsgegevens.", + "performance_standard": "Algoritme is simpel, foutloos, telt en geeft weer.", + "create_dt": "2023-03-31 08:34:12.165697+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "27924554", + "owner": "gemeente-den-haag", + "leverancier_id": null + }, + { + "name": "Druktemeting - personen tellen", + "organization": "Gemeente Den Haag", + "department": "Stadsbeheer", + "description_short": "Algoritme dat het aantal personen telt in een camerabeeld", + "type": "Op regels gebaseerd", + "category": null, + "website": "De camera's zijn toegevoegd aan onderstaande kaart.\nhttps://ddh.maps.arcgis.com/apps/webappviewer/index.html?id=8531785e9a8c4450be8839385003f1bc", + "status": "Actief", + "goal": "Het gaat om een pilot. Doel is effici\u00ebnte handhaving op drukte. Het algoritme is niet bedoeld om mensen te herkennen of iets te doen met persoonsgegevens.", + "impact": "Burgers krijgen met het effect van het algoritme te maken als de handhaver besluit langs te komen. Communicatie wordt voorbereid.", + "proportionality": "Het is een eerste experiment om geautomatiseerd te tellen in plaats van alleen gebruik te maken van inzet van handhavers.", + "decision_making_process": "Als het aantal personen in Scheveningen op een aantal locaties op de boulevard boven een bepaalde waarde komt komt er een signaal naar de Centrale van Handhaving (met geblurrde beelden - zie algoritme Druktemeting - blurren). De Centrale kan ervoor kiezen een handhaver er naartoe te sturen. Er zijn geen geautomatiseerde besluiten. Een communicatieuiting over het beleid wordt voorbereid (juli 2022).", + "documentation": null, + "competent_authority": "Gemeente Den Haag dienst Stadsbeheer is de verwerkingsverantwoordelijke. Verwerking vindt plaats door de leverancier Natix (Hamburg), met wie een verwerkingsovereenkomst is gesloten. ", + "lawful_basis": "Gemeentewet. Artikel 172 Handhaving openbare orde (camerabeelden) en Artikel 151C (verwerking camerabeelden onder regie van de politie).", + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": "N.v.t. Een handhaver trekt zelf conclusies.", + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": "Nederlands", + "revision_date": null, + "description": null, + "application_url": "N.v.t. want wordt uitgevoerd door een leverancier.", + "publiccode": null, + "mprd": "Nee", + "source_data": "Camerabeelden. ", + "methods_and_models": "Convolutional Neural Network / Feature Pyramid Networks.", + "monitoring": "De risico's van de camera's worden gevolgd. Het algoritme zelf heeft geen risico's. ", + "human_intervention": "Ja, de handhaver.", + "risks": "Er is een ethische toetsing gedaan en een impact assessment (AIIA). Ook is een DPIA uitgevoerd (de DPIA druktemeting en groepsdynamiek) waarin de risico's en maatregelen zijn beschreven t.a.v. privacy. Er is geen bias, want de personen worden geteld zonder voorkeur. De keuze waar de camera's hangen is gemaakt samen met de handhavers. ", + "performance_standard": "Signalen moeten waardevol zijn. Er zullen evaluaties worden gehouden. Na het experiment zal de toegevoegde waarde tegen het belang worden afgewogen.", + "create_dt": "2023-03-31 08:34:12.173767+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "46779276", + "owner": "gemeente-den-haag", + "leverancier_id": null + }, + { + "name": "Druktemeting - groepsdynamiek inschatting", + "organization": "Gemeente Den Haag", + "department": "Stadsbeheer", + "description_short": "Algoritme dat bewegingen in een groep op camerabeelden classificeert", + "type": "Op regels gebaseerd", + "category": null, + "website": "De camera's zijn toegevoegd aan onderstaande kaart.\nhttps://ddh.maps.arcgis.com/apps/webappviewer/index.html?id=8531785e9a8c4450be8839385003f1bc", + "status": "Actief", + "goal": "Het gaat om een pilot. Doel is effici\u00ebnte handhaving op drukte. Het algoritme is niet bedoeld om mensen te herkennen of iets te doen met persoonsgegevens.", + "impact": "Burgers krijgen met het effect van het algoritme te maken als de handhaver besluit langs te komen. Communicatie wordt voorbereid.", + "proportionality": "Het is een eerste experiment om geautomatiseerd de groepsdynamiek vast te stellen in plaats van alleen gebruik te maken van inzet van handhavers.", + "decision_making_process": "Als op Scheveningen op camerabeelden een groep een bepaalde snelheid heeft komt er een signaal naar de Centrale van Handhaving (met geblurrde beelden - zie algoritme Druktemeting - blurren). De Centrale kan ervoor kiezen een handhaver er naartoe te sturen. Er zijn geen geautomatiseerde besluiten. Een communicatieuiting over het beleid wordt voorbereid (juli 2022).", + "documentation": null, + "competent_authority": "Gemeente Den Haag dienst Stadsbeheer is de verwerkingsverantwoordelijke. Verwerking vindt plaats door de leverancier Natix (Hamburg), met wie een verwerkingsovereenkomst is gesloten. ", + "lawful_basis": "Gemeentewet. Artikel 172 Handhaving openbare orde (camerabeelden) en Artikel 151C (verwerking camerabeelden onder regie van de politie).", + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": "N.v.t. Een handhaver trekt zelf conclusies.", + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": "Nederlands", + "revision_date": null, + "description": null, + "application_url": "N.v.t. want wordt uitgevoerd door een leverancier.", + "publiccode": null, + "mprd": "Nee", + "source_data": "Camerabeelden. ", + "methods_and_models": "Niet bekend bij de gemeente.", + "monitoring": "De risico's van de camera's worden gevolgd. Het algoritme zelf heeft geen risico's. ", + "human_intervention": "Ja, de handhaver.", + "risks": "Er is een DPIA uitgevoerd (DPIA druktemeting en groepsdynamiek) waarin de risico's en maatregelen zijn beschreven. Er is geen bias, want de dynamiek wordt bepaald zonder voorkeur op type personen. De keuze waar de camera's hangen is gemaakt samen met de handhavers. ", + "performance_standard": "Signalen moeten waardevol zijn. Er zullen evaluaties worden gehouden. Na het experiment zal de toegevoegde waarde tegen het belang worden afgewogen.", + "create_dt": "2023-03-31 08:34:12.179388+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "95818782", + "owner": "gemeente-den-haag", + "leverancier_id": null + }, + { + "name": "Druktemeting - blurren van het beeld", + "organization": "Gemeente Den Haag", + "department": "Stadsbeheer", + "description_short": "Algoritme dat op de Scheveningse boulevard zorgt dat (na tellen en bepalen van de groepsdynamiek) het camerafragment geblurrd wordt.", + "type": "Op regels gebaseerd", + "category": null, + "website": "De camera's zijn toegevoegd aan onderstaande kaart.\nhttps://ddh.maps.arcgis.com/apps/webappviewer/index.html?id=8531785e9a8c4450be8839385003f1bc", + "status": "Actief", + "goal": "Het gaat om een pilot. Doel is effici\u00ebnte handhaving op drukte. Het algoritme is bedoeld om mensen niet herkenbaar te laten zijn. Zelfs persoonsgegevens als lengte en dikte mogen niet herleidbaar zijn.", + "impact": "Burgers krijgen met het effect van het algoritme te maken als de handhaver besluit langs te komen. Communicatie wordt voorbereid.", + "proportionality": "Het is een eerste experiment om met geblurrde (=geanonimiseerde) beeldfragmenten te werken, naast het alleen werken met handhavers.", + "decision_making_process": "Als op Scheveningen op grond van camerabeelden een signaal wordt afgegeven naar de Centrale van Handhaving wordt een geblurrd beeldfragment aangemaakt. De Centrale kan ervoor kiezen een handhaver er naartoe te sturen. Er zijn geen geautomatiseerde besluiten. Een communicatieuiting over het beleid wordt voorbereid (juli 2022).", + "documentation": null, + "competent_authority": "Gemeente Den Haag dienst Stadsbeheer is de verwerkingsverantwoordelijke. Verwerking vindt plaats door de leverancier Natix (Hamburg), met wie een verwerkingsovereenkomst is gesloten. ", + "lawful_basis": "Gemeentewet. Artikel 172 Handhaving openbare orde (camerabeelden) en Artikel 151C (verwerking camerabeelden onder regie van de politie).", + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": "N.v.t. Een handhaver trekt zelf conclusies.", + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": "Nederlands", + "revision_date": null, + "description": null, + "application_url": "N.v.t. want wordt uitgevoerd door een leverancier.", + "publiccode": null, + "mprd": "Nee", + "source_data": "Camerabeelden. ", + "methods_and_models": "Niet bekend bij de gemeente.", + "monitoring": "De risico's van de camera's worden gevolgd. Het algoritme zelf heeft geen risico's. ", + "human_intervention": "Ja, de handhaver.", + "risks": "Er is een DPIA uitgevoerd (DPIA druktemeting en groepsdynamiek) waarin de risico's en maatregelen zijn beschreven. Er is geen bias, want de blurring wordt bepaald zonder voorkeur op type personen. De keuze waar de camera's hangen is gemaakt samen met de handhavers. ", + "performance_standard": "Onherkenbaarheid van de personen. Daarnaast moeten signalen bruikbaar zijn om te zien of actie nodig is. Er zullen evaluaties worden gehouden. Na het experiment zal de toegevoegde waarde tegen het belang worden afgewogen.", + "create_dt": "2023-03-31 08:34:12.187683+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "57517331", + "owner": "gemeente-den-haag", + "leverancier_id": null + }, + { + "name": "Voorspelmodel Jeugdhulp", + "organization": "Gemeente Den Haag", + "department": "Onderwijs, Cultuur en Welzijn", + "description_short": "Het voorspelmodel voor Jeugdhulp voorspelt het aantal unieke jongeren met Jeugdhulp zonder verblijf met een voorspelhorizon van zes jaar. Naast het aantal jongeren worden ook voorspellingen gedaan over de kosten. Voorspellingen worden gedaan op wijkniveau, voor de stadsdelen en voor heel Den Haag. ", + "type": "Op regels gebaseerd", + "category": null, + "website": null, + "status": "Actief", + "goal": "Het algoritme is ontwikkeld omdat de gemeente Den Haag beter voorbereid wil zijn op de toekomst. Als de gemeente weet hoeveel jongeren naar verwachting de komende zes jaar gebruik gaan maken van Jeugdhulp zonder verblijf en van de kosten die dat met zich meebrengt, kan zij beter anticiperen op deze vraag en de ondersteuning blijven bieden aan alle jongeren die daar in de toekomst behoefte aan hebben. ", + "impact": "Het voorspelmodel doet geen uitspraken over (kansen van) individuele burgers en er is gekozen voor modellen die uitlegbaar zijn. Dit betekent dat we als gemeente geen modellen gebruiken waarvan niet goed is vast te stellen hoe het model tot een bepaalde uitkomst is gekomen (zgn. Black Box modellen). Het Jeugdvoorspelmodel vervangt op geen enkele manier de kennis en kunde van onze consulenten en uitvoering. Het instrument is voor hen niet bedoeld, maar vooral voor beleid en het maken en onderbouwen van beleidskeuzes voor de langere termijn. Juist door de kennis van het Jeugdvoorspelmodel kunnen we tijdig anticiperen en alle individuen beter blijven ondersteunen. ", + "proportionality": "Nee", + "decision_making_process": "Met de inzichten uit het Jeugdvoorspelmodel wordt beleid en uitvoering ondersteund bij beantwoorden van tactische en strategische vragen. Dit zijn vragen en onderwerpen die op de langere termijn spelen (bijvoorbeeld 5 \u00e1 10 jaar). Het model is niet bedoeld voor het beantwoorden van operationele vragen (onderwerpen die op korte termijn spelen) en er is geen sprake van geautomatiseerde besluiten. ", + "documentation": null, + "competent_authority": "Het voorspelmodel Jeugdhulp maakt geen gebruik van kenmerken op persoonsniveau", + "lawful_basis": "Er is geen wettelijke grondslag voor het voorspelmodel, maar de gemeente is verantwoordelijk voor de uitvoering van de Jeugdwet en door het model kan de gemeente beter anticiperen op verwachte ontwikkelingen en burgers beter ondersteunen.", + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": "Gezien de aard van het model is dit niet geregeld.", + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": "Nederlands", + "revision_date": null, + "description": null, + "application_url": null, + "publiccode": null, + "mprd": "Nee", + "source_data": "Er is alleen gebruikgemaakt van open data, namelijk van het bestand Kerncijfers Wijken en Buurten CBS en van het bestand 'Jongeren met jeugdzorg en jeugdzorgtrajecten in natura; wijken' van het CBS.", + "methods_and_models": "Het gaat om een regressie model. De prestaties van dit model worden afgemeten aan de hand van de maten RMSE, MAE en MAPE. Dit zijn maten die op verschillende manieren vaststellen hoe groot de voorspelfout is. ", + "monitoring": "Indien het noodzakelijk is een nieuw model te bouwen/te trainen, wordt de privacy officer betrokken bij de keuze van features en zal bij een geheel nieuw model ook opnieuw naar het ethisch kader worden gekeken.", + "human_intervention": "Er is geen sprake van een geautomatiseerd systeem. De inzichten uit het voorspelmodel kunnen alleen door tussenkomst van mensen en met de contextkennis en ervaring van betrokken medewerkers worden gebruikt. ", + "risks": "De risico's van het algoritme zijn vooraf en tijdens het bouwen van het voorspelmodel in kaart gebracht. Omdat het voorspelmodel geen uitspraken doet over individuele personen maar over het gebruik van voorzieningen in wijken, was er geen risico dat met de uitkomsten uit het model de privacy van specifieke individuele personen zou kunnen worden geschonden. Verder is alleen gewerkt met wijken die voldoende groot zijn (meer dan 100 inwoners) en waar voldoende mensen gebruikmaakten van de Jeugdhulp (meer dan 70 gebruikers). Een reden hiervoor is dat hierdoor geen onthulling mogelijk is. Dat wil zeggen dat we niet door het combineren van kenmerken kunnen vaststellen wie de mogelijke gebruikers van Jeugdhulpvoorzieningen zijn. Verder is bij het bouwen van het model samen met de privacy officer en de ethical officer afgewogen welke variabelen wel en welke variabelen niet vanuit privacy overwegingen meegenomen konden worden. Hierbij vormde de AVG steeds het uitgangspunt. Daarnaast is uitlegbaarheid van het model en de uitkomsten een relevant en doorslaggevend criterium. De vraag welke rol bias speelt in het gebruik van het algoritme is een veel te algemene vraag, aangezien er vele vormen van bias zijn. Als het gaat om vooringenomenheid gericht op specifieke bevolkingsgroepen, dan speelt dat bij dit model geen rol. We zijn niet op zoek naar specifieke individuele personen met specifieke kenmerken, maar willen een inschatting maken van het gebruik van Jeugdhulp zonder verblijf in de hele wijk en voor heel Den Haag.", + "performance_standard": "Het model wordt jaarlijks geactualiseerd. De voorspellingen van het oude model worden vergeleken met voorspellingen van het nieuwe model en vergeleken met de realisaties.", + "create_dt": "2023-03-31 08:34:12.193147+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "46768937", + "owner": "gemeente-den-haag", + "leverancier_id": null + }, + { + "name": "Geluidsmodel", + "organization": "Gemeente Utrecht", + "department": "Ruimte", + "description_short": "Het voorspellen of de geluidsnormen worden overtreden in een bepaald gebied. Meer specifieke informatie mbt dit algoritme volgt.", + "type": null, + "category": null, + "website": null, + "status": null, + "goal": null, + "impact": null, + "proportionality": null, + "decision_making_process": "Het algoritme combineert criteria aan een bestand van bepaalde gebieden en geeft informatie of er sprake is van overschrijding van de geluidsnormen", + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": null, + "revision_date": null, + "description": null, + "application_url": null, + "publiccode": null, + "mprd": null, + "source_data": null, + "methods_and_models": null, + "monitoring": null, + "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker", + "risks": null, + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.201043+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "84217598", + "owner": "gemeente-utrecht", + "leverancier_id": null + }, + { + "name": "Luchtkwaliteitsmodel", + "organization": "Gemeente Utrecht", + "department": "Ruimte", + "description_short": "Het voorspellen of de luchtkwaliteitsnormen worden overtreden in een bepaald gebied. Meer specifieke informatie mbt dit algoritme volgt.", + "type": null, + "category": null, + "website": null, + "status": null, + "goal": null, + "impact": null, + "proportionality": null, + "decision_making_process": "Het algoritme combineert criteria aan een bestand van bepaalde gebieden en geeft informatie of er sprake is van overschrijding van de luchtkwaliteitsnormen", + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": null, + "revision_date": null, + "description": null, + "application_url": null, + "publiccode": null, + "mprd": null, + "source_data": null, + "methods_and_models": null, + "monitoring": null, + "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker", + "risks": null, + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.206564+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "25883972", + "owner": "gemeente-utrecht", + "leverancier_id": null + }, + { + "name": "Signaleren vogels", + "organization": "Gemeente Utrecht", + "department": "Ruimte", + "description_short": "Het voorspellen van het aantal vogels in een bepaald gebied. Meer specifieke informatie mbt dit algoritme volgt.", + "type": null, + "category": null, + "website": null, + "status": null, + "goal": null, + "impact": null, + "proportionality": null, + "decision_making_process": "Het algoritme combineert historische data tot informatie over het aantal vogels in een bepaald gebied in de nabije toekomst", + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": null, + "revision_date": null, + "description": null, + "application_url": null, + "publiccode": null, + "mprd": null, + "source_data": null, + "methods_and_models": null, + "monitoring": null, + "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker", + "risks": null, + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.212571+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "59635361", + "owner": "gemeente-utrecht", + "leverancier_id": null + }, + { + "name": "Woonbouwlocaties", + "organization": "Gemeente Utrecht", + "department": "Ruimte", + "description_short": "Het voorspellen van vraag en aanbod van het aantal woonbouwlocaties in een bepaald gebied. Meer specifieke informatie mbt dit algoritme volgt.", + "type": null, + "category": null, + "website": null, + "status": null, + "goal": null, + "impact": null, + "proportionality": null, + "decision_making_process": "Het model combineert veel verschillende soorten data (bijv demografie, economie) tot informatie over de woningmarkt in de nabije toekomst in een bepaald gebied\nHet model vindt zijn neerslag in de Woonvisie 'Utrecht beter in balans' en de monitor Wonen.", + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": null, + "revision_date": null, + "description": null, + "application_url": null, + "publiccode": null, + "mprd": null, + "source_data": null, + "methods_and_models": null, + "monitoring": null, + "human_intervention": "We verzamelen cijfers (zoals prognoses, woningbehoefte, voorraadsamenstelling) en houden de voortgang (productie, meer menging) bij. Het model geeft informatie over de woningvoorraaad en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het model heeft dus niet het laatste woord, maar een medewerker", + "risks": null, + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.221590+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "54946936", + "owner": "gemeente-utrecht", + "leverancier_id": null + }, + { + "name": "Dynamisch inzamelen afval", + "organization": "Gemeente Utrecht", + "department": "Stadsbedrijven", + "description_short": "Het voorspellen van het juiste moment waarop afvalcontainers geleegd kunnen worden en daar de route en het schema van de vuilniswagen op inrichten. Meer specifieke informatie mbt dit algoritme volgt.", + "type": null, + "category": null, + "website": null, + "status": null, + "goal": null, + "impact": null, + "proportionality": null, + "decision_making_process": "Het algoritme combineert informatie van de sensoren mbt de vulgraad in de ondergrondse afvalcontainers tot informatie voor de meest effectieve rijroute en schema van de vuilniswagens", + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": null, + "revision_date": null, + "description": null, + "application_url": null, + "publiccode": null, + "mprd": null, + "source_data": null, + "methods_and_models": null, + "monitoring": null, + "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker.", + "risks": null, + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.237349+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "98945854", + "owner": "gemeente-utrecht", + "leverancier_id": null + }, + { + "name": "Slim vegen", + "organization": "Gemeente Utrecht", + "department": "Stadsbedrijven", + "description_short": "Het voorspellen van de meest nuttige rijroutes van veegwagens. Meer specifieke informatie mbt dit algoritme volgt.", + "type": null, + "category": null, + "website": null, + "status": null, + "goal": null, + "impact": null, + "proportionality": null, + "decision_making_process": "Het algoritme combineert historische data mbt rijroutes van veegwagens tot informatie voor de meest effectieve rijroute en schema van de veegwagens", + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": null, + "revision_date": null, + "description": null, + "application_url": null, + "publiccode": null, + "mprd": null, + "source_data": null, + "methods_and_models": null, + "monitoring": null, + "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker.", + "risks": null, + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.243302+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "64572345", + "owner": "gemeente-utrecht", + "leverancier_id": null + }, + { + "name": "Vervanging lichtmasten", + "organization": "Gemeente Utrecht", + "department": "Stadsbedrijven", + "description_short": "Het voorspellen van het juiste moment waarop lichtmasten aan vervanging toe zijn. Meer specifieke informatie mbt dit algoritme volgt.", + "type": null, + "category": null, + "website": null, + "status": null, + "goal": null, + "impact": null, + "proportionality": null, + "decision_making_process": "Het algoritme combineert criteria aan een bestand van lichtmasten tot informatie over welke lichtmasten in aanmerking komen voor vervanging", + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": null, + "revision_date": null, + "description": null, + "application_url": null, + "publiccode": null, + "mprd": null, + "source_data": null, + "methods_and_models": null, + "monitoring": null, + "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker.", + "risks": null, + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.248145+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "74381324", + "owner": "gemeente-utrecht", + "leverancier_id": null + }, + { + "name": "Stedelijk water", + "organization": "Gemeente Utrecht", + "department": "Stadsbedrijven", + "description_short": "Het voorspellen van de hoogte van het stedelijk water en de riolering. Meer specifieke informatie mbt dit algoritme volgt.", + "type": null, + "category": null, + "website": null, + "status": null, + "goal": null, + "impact": null, + "proportionality": null, + "decision_making_process": "Het algoritme combineert historische data van de sensoren mbt waterstanden van het stedelijk water tot informatie over de waterstanden in de nabije toekomst", + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": null, + "revision_date": null, + "description": null, + "application_url": null, + "publiccode": null, + "mprd": null, + "source_data": null, + "methods_and_models": null, + "monitoring": null, + "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker.", + "risks": null, + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.254805+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "61965951", + "owner": "gemeente-utrecht", + "leverancier_id": null + }, + { + "name": "Onderhoud wagenpark", + "organization": "Gemeente Utrecht", + "department": "Stadsbedrijven", + "description_short": "Het voorspellen van het juiste moment waarop onderhoud nodig is bij het wagenpark. Meer specifieke informatie mbt dit algoritme volgt.", + "type": null, + "category": null, + "website": null, + "status": null, + "goal": null, + "impact": null, + "proportionality": null, + "decision_making_process": "Het algoritme combineert criteria aan een bestand van wagenparken en geeft informatie over welke wagenparken wanneer in aanmerking komen voor onderhoud", + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": null, + "revision_date": null, + "description": null, + "application_url": null, + "publiccode": null, + "mprd": null, + "source_data": null, + "methods_and_models": null, + "monitoring": null, + "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker.", + "risks": null, + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.261379+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "79588339", + "owner": "gemeente-utrecht", + "leverancier_id": null + }, + { + "name": "Objectherkenning straatafval", + "organization": "Gemeente Utrecht", + "department": "Stadsbedrijven", + "description_short": "Het geautomatiseerd herkennen van verschillende typen straatafval. Meer specifieke informatie mbt dit algoritme volgt.", + "type": null, + "category": null, + "website": null, + "status": null, + "goal": null, + "impact": null, + "proportionality": null, + "decision_making_process": "Het algoritme combineert historische data mbt kenmerken van verschillende typen straatafval tot informatie over welke type straatafval het betreft", + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": null, + "revision_date": null, + "description": null, + "application_url": null, + "publiccode": null, + "mprd": null, + "source_data": null, + "methods_and_models": null, + "monitoring": null, + "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker.", + "risks": null, + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.267260+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "49489486", + "owner": "gemeente-utrecht", + "leverancier_id": null + }, + { + "name": "Parkeerhandhaving; Inzet scanauto's", + "organization": "Gemeente Utrecht", + "department": "Vergunningen, Toezicht en Handhaving (VTH)", + "description_short": "Het controleren met scanauto's of het parkeergeld is betaald. Meer specifieke informatie mbt dit algoritme volgt.", + "type": null, + "category": null, + "website": null, + "status": null, + "goal": null, + "impact": null, + "proportionality": null, + "decision_making_process": "De scanauto maakt een scan van het kenteken en foto's van de situatie. Daarna volgt een automatische controle via het Nationaal Parkeer Register of parkeergeld betaald is. Indien het parkeergeld niet is betaald wordt de constatering automatisch aangeboden aan de handhaver die een extra controle uitvoert. ", + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": null, + "revision_date": null, + "description": null, + "application_url": null, + "publiccode": null, + "mprd": null, + "source_data": null, + "methods_and_models": null, + "monitoring": null, + "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker", + "risks": null, + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.272033+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "59432597", + "owner": "gemeente-utrecht", + "leverancier_id": null + }, + { + "name": "Parkeerhandhaving; Betalingsbereidheid", + "organization": "Gemeente Utrecht", + "department": "Vergunningen, Toezicht en Handhaving (VTH)", + "description_short": "Het monitoren van de bereidheid om parkeergeld te betalen. Meer specifieke informatie mbt dit algoritme volgt.", + "type": null, + "category": null, + "website": null, + "status": null, + "goal": null, + "impact": null, + "proportionality": null, + "decision_making_process": "Het algoritme berekent de betalingsbereidheid van parkeerders uit historische scandata van de scanauto.", + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": null, + "revision_date": null, + "description": null, + "application_url": null, + "publiccode": null, + "mprd": null, + "source_data": null, + "methods_and_models": null, + "monitoring": null, + "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker", + "risks": null, + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.276342+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "51939364", + "owner": "gemeente-utrecht", + "leverancier_id": null + }, + { + "name": "Parkeerhandhaving; Werkverdeling scanteam", + "organization": "Gemeente Utrecht", + "department": "Vergunningen, Toezicht en Handhaving (VTH)", + "description_short": "Het gericht inzetten van parkeerhandhaving met de scanauto. Meer specifieke informatie mbt dit algoritme volgt.", + "type": null, + "category": null, + "website": null, + "status": null, + "goal": null, + "impact": null, + "proportionality": null, + "decision_making_process": "Het algoritme voorspelt de bereidheid om parkeergeld te betalen per locatie en tijd uit historische scan- en transactiedata.", + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": null, + "revision_date": null, + "description": null, + "application_url": null, + "publiccode": null, + "mprd": null, + "source_data": null, + "methods_and_models": null, + "monitoring": null, + "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker", + "risks": null, + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.280524+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "62692755", + "owner": "gemeente-utrecht", + "leverancier_id": null + }, + { + "name": "Parkeren; Opbrengsten straatparkeren", + "organization": "Gemeente Utrecht", + "department": "Vergunningen, Toezicht en Handhaving (VTH)", + "description_short": "Het monitoren en begroten van de opbrengsten van straatparkeeren. Meer specifieke informatie mbt dit algoritme volgt.", + "type": null, + "category": null, + "website": null, + "status": null, + "goal": null, + "impact": null, + "proportionality": null, + "decision_making_process": "Het algoritme voorspelt de maandelijkse opbrengsten van straatparkeren uit historische betalingen van parkeergeld.", + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": null, + "revision_date": null, + "description": null, + "application_url": null, + "publiccode": null, + "mprd": null, + "source_data": null, + "methods_and_models": null, + "monitoring": null, + "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker", + "risks": null, + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.284601+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "54916672", + "owner": "gemeente-utrecht", + "leverancier_id": null + }, + { + "name": "Parkeren; Parkeerdruk", + "organization": "Gemeente Utrecht", + "department": "Vergunningen, Toezicht en Handhaving (VTH)", + "description_short": "Het monitoren van de parkeerdruk in het gebied van betaald parkeren. Meer specifieke informatie mbt dit algoritme volgt.", + "type": null, + "category": null, + "website": null, + "status": null, + "goal": null, + "impact": null, + "proportionality": null, + "decision_making_process": "Het algoritme berekent per straat en tijd de bezettinggraad van de parkeerruimte uit historische scandata van de scanauto.", + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": null, + "revision_date": null, + "description": null, + "application_url": null, + "publiccode": null, + "mprd": null, + "source_data": null, + "methods_and_models": null, + "monitoring": null, + "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker", + "risks": null, + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.288651+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "62248440", + "owner": "gemeente-utrecht", + "leverancier_id": null + }, + { + "name": "Vergunningverlening; Wonen", + "organization": "Gemeente Utrecht", + "department": "Vergunningen, Toezicht en Handhaving (VTH)", + "description_short": "Het uitvoeren van de algemene leefbaarheidstoets. Meer specifieke informatie mbt dit algoritme volgt.", + "type": null, + "category": null, + "website": null, + "status": null, + "goal": null, + "impact": null, + "proportionality": null, + "decision_making_process": "Het algoritme combineert en presentreert vastgoedgegevens, gebruikskenmerken en vergunningsgegevens van woningen.", + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": null, + "revision_date": null, + "description": null, + "application_url": null, + "publiccode": null, + "mprd": null, + "source_data": null, + "methods_and_models": null, + "monitoring": null, + "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker", + "risks": null, + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.292855+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "18113668", + "owner": "gemeente-utrecht", + "leverancier_id": null + }, + { + "name": "Handhaving drank- en horecawet", + "organization": "Gemeente Utrecht", + "department": "Vergunningen, Toezicht en Handhaving (VTH)", + "description_short": "Het gericht controleren de horeca-inrichtingen op het naleven van de drank en horecawet. Meer specifieke informatie mbt dit algoritme volgt.", + "type": null, + "category": null, + "website": null, + "status": null, + "goal": null, + "impact": null, + "proportionality": null, + "decision_making_process": "Het algoritme combineert en weegt het type horeca-inrichting met historische meldingen en maatregelen van de horeca ondernemingen.", + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": null, + "revision_date": null, + "description": null, + "application_url": null, + "publiccode": null, + "mprd": null, + "source_data": null, + "methods_and_models": null, + "monitoring": null, + "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker", + "risks": null, + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.297146+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "34723728", + "owner": "gemeente-utrecht", + "leverancier_id": null + }, + { + "name": "Toezicht en Handhaving Vastgoedmisbruik (Huisjesmelkers)", + "organization": "Gemeente Utrecht", + "department": "Vergunningen, Toezicht en Handhaving (VTH)", + "description_short": "Het gericht controleren de o.a. goed verhuurderschap op het naleven van de woningwet. Meer specifieke informatie mbt dit algoritme volgt.", + "type": null, + "category": null, + "website": null, + "status": null, + "goal": null, + "impact": null, + "proportionality": null, + "decision_making_process": "Het algoritme combineert en presentreert vastgoedgegevens middels indicatoren ter ondersteuning van de inspecteurs en toezichthouders", + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": null, + "revision_date": null, + "description": null, + "application_url": null, + "publiccode": null, + "mprd": null, + "source_data": null, + "methods_and_models": null, + "monitoring": null, + "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een bevoegde toezichthouder of inspecteur.", + "risks": null, + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.301337+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "38628535", + "owner": "gemeente-utrecht", + "leverancier_id": null + }, + { + "name": "Toezicht en Handhaving Weesfietsen", + "organization": "Gemeente Utrecht", + "department": "Vergunningen, Toezicht en Handhaving (VTH)", + "description_short": "Het gerichter inzetten van handhavers voor de leefbaarheid in de openbare ruimte ten aanzien van weesfietsen en fietswrakken als naleving van de Algemene Plaatselijke Verordening (APV). Meer specifieke informatie mbt dit algoritme volgt.", + "type": null, + "category": null, + "website": null, + "status": null, + "goal": null, + "impact": null, + "proportionality": null, + "decision_making_process": "Het algoritme combineert en presentreert handhavingsdata en meldingen middels een kaart ter ondersteuning van de handhavers en planners zodat weesfietsacties doelmatiger kunnen worden ingezet.", + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": null, + "revision_date": null, + "description": null, + "application_url": null, + "publiccode": null, + "mprd": null, + "source_data": null, + "methods_and_models": null, + "monitoring": null, + "human_intervention": "Het algoritme geeft informatie en dit stelt een planner in staat om, mede op basis hiervan, efficienter te plannen. Het algoritme heeft dus niet het laatste woord, maar medewerker zelf.", + "risks": null, + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.305571+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "34295566", + "owner": "gemeente-utrecht", + "leverancier_id": null + }, + { + "name": "Toezicht en Handhaving Vuurwerk", + "organization": "Gemeente Utrecht", + "department": "Vergunningen, Toezicht en Handhaving (VTH)", + "description_short": "Het gerichter inzetten van handhavers voor de leefbaarheid in de openbare ruimte ten aanzien van vuurwerkoverlast als naleving van de Algemene Plaatselijke Verordening (APV). Meer specifieke informatie mbt dit algoritme volgt.", + "type": null, + "category": null, + "website": null, + "status": null, + "goal": null, + "impact": null, + "proportionality": null, + "decision_making_process": "Het algoritme combineert en presentreert handhavingsdata en meldingen middels een kaart ter ondersteuning van de handhavers en planners zodat toezicht doelmatiger kunnen worden ingezet.", + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": null, + "revision_date": null, + "description": null, + "application_url": null, + "publiccode": null, + "mprd": null, + "source_data": null, + "methods_and_models": null, + "monitoring": null, + "human_intervention": "Het algoritme geeft informatie en dit stelt een planner in staat om, mede op basis hiervan, efficienter te plannen. Het algoritme heeft dus niet het laatste woord, maar medewerker zelf.", + "risks": null, + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.309977+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "65378449", + "owner": "gemeente-utrecht", + "leverancier_id": null + }, + { + "name": "Toezicht en Handhaving Corona maatregelingen", + "organization": "Gemeente Utrecht", + "department": "Vergunningen, Toezicht en Handhaving (VTH)", + "description_short": "Het gerichter inzetten van handhavers voor de leefbaarheid in de openbare ruimte ten aanzien van het naleven van Corona maatregelingen als naleving van de Algemene Plaatselijke Verordening (APV). Meer specifieke informatie mbt dit algoritme volgt.", + "type": null, + "category": null, + "website": null, + "status": null, + "goal": null, + "impact": null, + "proportionality": null, + "decision_making_process": "Het algoritme combineert en presentreert meldingen middels een kaart ter ondersteuning van de handhavers en planners zodat toezicht doelmatiger kunnen worden ingezet.", + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": null, + "revision_date": null, + "description": null, + "application_url": null, + "publiccode": null, + "mprd": null, + "source_data": null, + "methods_and_models": null, + "monitoring": null, + "human_intervention": "Het algoritme geeft informatie en dit stelt een planner in staat om, mede op basis hiervan, efficienter te plannen. Het algoritme heeft dus niet het laatste woord, maar medewerker zelf.", + "risks": null, + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.314253+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "23213786", + "owner": "gemeente-utrecht", + "leverancier_id": null + }, + { + "name": "Toezicht en Handhaving Milieu", + "organization": "Gemeente Utrecht", + "department": "Vergunningen, Toezicht en Handhaving (VTH)", + "description_short": "Het gerichter inzetten van inspecteurs op naleven van Milieuwetten door ondernemingen. Meer specifieke informatie mbt dit algoritme volgt.", + "type": null, + "category": null, + "website": null, + "status": null, + "goal": null, + "impact": null, + "proportionality": null, + "decision_making_process": "Het algoritme gebruikt mutaties in de kamer van koophandel ter ondersteuning van de inspecteurs en zodat toezicht doelmatiger kunnen worden ingezet en milieuschade kan worden voorkomen.", + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": null, + "revision_date": null, + "description": null, + "application_url": null, + "publiccode": null, + "mprd": null, + "source_data": null, + "methods_and_models": null, + "monitoring": null, + "human_intervention": "Het algoritme geeft informatie en dit stelt een inspecteur in staat om, mede op basis hiervan, efficienter toezicht te houden. Het algoritme heeft dus niet het laatste woord, maar toezichthouder zelf.", + "risks": null, + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.318496+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "64219439", + "owner": "gemeente-utrecht", + "leverancier_id": null + }, + { + "name": "Veranderingen in het aantal aanmeldingen jeugdhulp en WMO-ondersteuning als gevolg van het Coronavirus", + "organization": "Gemeente Utrecht", + "department": "Maatschappelijke Ondersteuning (MO)", + "description_short": "Het voorspellen van veranderingen in het aantal aanmeldingen jeugdhulp en Wmo-ondersteuning als gevolg van het Coronavirus. Meer specifieke informatie mbt dit algoritme volgt.", + "type": null, + "category": null, + "website": null, + "status": null, + "goal": null, + "impact": null, + "proportionality": null, + "decision_making_process": "Het algoritme combineert historische data (voorgaande jaren) en huidige data (Corona tijd) mbt aantallen aanmeldingen jeugdhulp en Wmo-ondersteuning tot informatie over het aantal aanmeldingen in de nabije toekomst. Het wordt verrijkt met praktijkervaringen van de professionals van de betrokken partners zodat scenario's kunnen worden geschetst", + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": null, + "revision_date": null, + "description": null, + "application_url": null, + "publiccode": null, + "mprd": null, + "source_data": null, + "methods_and_models": null, + "monitoring": null, + "human_intervention": "Het algoritme geeft informatie en deze wordt besproken door medewerkers van de gemeente en partners zodat zij het goede gesprek kunnen voeren over de mogelijke ontwikkelingen in het domein van de Jeugdwet en Wmo. Op basis van de bespreking wordt het algoritme aangepast", + "risks": null, + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.322849+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "31453237", + "owner": "gemeente-utrecht", + "leverancier_id": null + }, + { + "name": "Jeugdgezondheidszorg", + "organization": "Gemeente Utrecht", + "department": "Volksgezondheid (VG)", + "description_short": "Het monitoren van de ontwikkeling van kinderen van 0-4 jaar. Meer specifieke informatie mbt dit algoritme volgt.", + "type": null, + "category": null, + "website": null, + "status": null, + "goal": null, + "impact": null, + "proportionality": null, + "decision_making_process": "Het algoritme combineert informatie van het betreffende kind met historische data van andere kinderen en geeft informatie over de ontwikkeling van het kind. Bijvoorbeeld: Meetgegevens, zoals lengte en gewicht, worden vergeleken met data van grote groepen kinderen (groeicurve) en geeft informatie over de ontwikkeling van het kind.", + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": null, + "revision_date": null, + "description": null, + "application_url": null, + "publiccode": null, + "mprd": null, + "source_data": null, + "methods_and_models": null, + "monitoring": null, + "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker.", + "risks": null, + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.327202+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "99648448", + "owner": "gemeente-utrecht", + "leverancier_id": null + }, + { + "name": "Voor- en Vroegschoolse Educatie (VVE)", + "organization": "Gemeente Utrecht", + "department": "Volksgezondheid (VG)", + "description_short": "Het bepalen welke kinderen in aanmerking komen voor Voor- en Vroegschoolse Educatie (VVE). Meer specifieke informatie mbt dit algoritme volgt.", + "type": null, + "category": null, + "website": null, + "status": null, + "goal": null, + "impact": null, + "proportionality": null, + "decision_making_process": "Het algoritme combineert criteria aan een bestand van kinderen en geeft informatie over welke kinderen in aanmerking komen voor VVE in de nabije toekomst.", + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": null, + "revision_date": null, + "description": null, + "application_url": null, + "publiccode": null, + "mprd": null, + "source_data": null, + "methods_and_models": null, + "monitoring": null, + "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker.", + "risks": null, + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.332689+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "96289873", + "owner": "gemeente-utrecht", + "leverancier_id": null + }, + { + "name": "Psychosociale gezondheid", + "organization": "Gemeente Utrecht", + "department": "Volksgezondheid (VG)", + "description_short": "Het in beeld brengen van psychosociale gezondheid bij kinderen met behulp van de SDQ vragenlijst. Meer specifieke informatie mbt dit algoritme volgt.", + "type": null, + "category": null, + "website": null, + "status": null, + "goal": null, + "impact": null, + "proportionality": null, + "decision_making_process": "Het algoritme combineert criteria aan informatie uit de vragenlijst van het betreffende kind en geeft informatie bij welke kinderen er aanleiding is om in gesprek te gaan over de psychosociale gezondheid.", + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": null, + "revision_date": null, + "description": null, + "application_url": null, + "publiccode": null, + "mprd": null, + "source_data": null, + "methods_and_models": null, + "monitoring": null, + "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker.", + "risks": null, + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.337194+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "34715521", + "owner": "gemeente-utrecht", + "leverancier_id": null + }, + { + "name": "Digitale afhandeling levensonderhoud", + "organization": "Gemeente Utrecht", + "department": "Werk & Inkomen (W&I)", + "description_short": "Het toekennen van een uitkering aan bewoners die daar recht op hebben. Meer specifieke informatie mbt dit algoritme volgt.", + "type": null, + "category": null, + "website": null, + "status": null, + "goal": null, + "impact": null, + "proportionality": null, + "decision_making_process": "Het algoritme controleert op basis van ingevulde velden in het aanvraagformulier van bewoners of bewoners in aanmerking komen voor een uitkering", + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": null, + "revision_date": null, + "description": null, + "application_url": null, + "publiccode": null, + "mprd": null, + "source_data": null, + "methods_and_models": null, + "monitoring": null, + "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker.", + "risks": null, + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.341321+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "46325235", + "owner": "gemeente-utrecht", + "leverancier_id": null + }, + { + "name": "Fraude bestrijding", + "organization": "Gemeente Utrecht", + "department": "Werk & Inkomen (W&I)", + "description_short": "Het bestrijden van fraude door bewoners bij dienstverlening bij Werk en Inkomen producten. Meer specifieke informatie mbt dit algoritme volgt.", + "type": null, + "category": null, + "website": null, + "status": null, + "goal": null, + "impact": null, + "proportionality": null, + "decision_making_process": "Het algoritme filtert op onregelmatigheden in de logische samenhang van objectieve data. Het geeft daarmee een voorzet (informatie) over op welke adressen er mogelijk sprake kan zijn van fraude. Deze data wordt opgesteld uit de gegevens van WenI, het inlichtingenbureau en publieksdienstverlening. ", + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": null, + "revision_date": null, + "description": null, + "application_url": null, + "publiccode": null, + "mprd": null, + "source_data": null, + "methods_and_models": null, + "monitoring": null, + "human_intervention": "Het algoritme neemt geen zelfstandig besluit. Wanneer een uitdraai wordt gemaakt van deze gegevens, wordt handmatig bekeken of er inderdaad sprake is van een onregelmatigheid. Vervolgens worden gegevens van het betreffende adres verrijkt met gegevens van andere organisaties (mits dit aan de orde is) en wordt als laatste in gezamenlijkheid aan de casustafel bekeken of het adres gecontroleerd gaat worden.", + "risks": null, + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.346076+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "18714832", + "owner": "gemeente-utrecht", + "leverancier_id": null + }, + { + "name": "Re-integratie naar werk - Matchen op werk", + "organization": "Gemeente Utrecht", + "department": "Werk & Inkomen (W&I)", + "description_short": "Het begeleiden van bewoners naar werk door het beter kunnen matchen van werkloze bewoners aan vacatures. Mooi matchen is een onderzoek naar kansrijke beroepsprofielen waarbij bijvoorbeeld bepaald wordt dat er in periode X relatief meer behoefte is aan kappers en relatief minder behoefte is aan verkeersregelaars. Meer specifieke informatie mbt dit algoritme volgt.", + "type": null, + "category": null, + "website": null, + "status": null, + "goal": null, + "impact": null, + "proportionality": null, + "decision_making_process": "Het algoritme combineert criteria aan een bestand van bewoners en geeft een voorzet (informatie) welke bewoners op basis van de kansrijke beroepsprofielen voldoen aan de criteria die de markt stelt aan deze vacatures. ", + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": null, + "revision_date": null, + "description": null, + "application_url": null, + "publiccode": null, + "mprd": null, + "source_data": null, + "methods_and_models": null, + "monitoring": null, + "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker.", + "risks": null, + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.350558+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "21277971", + "owner": "gemeente-utrecht", + "leverancier_id": null + }, + { + "name": "Toekennen uitkering participatiewet", + "organization": "Gemeente Utrecht", + "department": "Werk & Inkomen (W&I)", + "description_short": "Op basis van rekenregels wordt bepaald welke norm moet worden toegepast voor deze inwoner. Meer specifieke informatie mbt dit algoritme volgt.", + "type": null, + "category": null, + "website": null, + "status": null, + "goal": null, + "impact": null, + "proportionality": null, + "decision_making_process": "Het algoritme combineert criteria aan een bestand van bewoners en geeft een voorzet (informatie) welke norm moet worden toegepast. ", + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": null, + "revision_date": null, + "description": null, + "application_url": null, + "publiccode": null, + "mprd": null, + "source_data": null, + "methods_and_models": null, + "monitoring": null, + "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker.", + "risks": null, + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.355182+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "92734630", + "owner": "gemeente-utrecht", + "leverancier_id": null + }, + { + "name": "Re-integratie naar werk - Bepalen arrangement", + "organization": "Gemeente Utrecht", + "department": "Werk & Inkomen (W&I)", + "description_short": "Op basis van kenmerken van de klant wordt een indeling in de arrangementen gedaan. Meer specifieke informatie mbt dit algoritme volgt.", + "type": null, + "category": null, + "website": null, + "status": null, + "goal": null, + "impact": null, + "proportionality": null, + "decision_making_process": "Het algoritme geeft op basis van geprogrammeerde beslisregels een suggestie van een arrangement dat iets zegt over de afstand tot de arbeidsmarkt. Op basis van deze arrangementsindeling wordt specifieke dienstverlening ingezet. ", + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": null, + "revision_date": null, + "description": null, + "application_url": null, + "publiccode": null, + "mprd": null, + "source_data": null, + "methods_and_models": null, + "monitoring": null, + "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme geeft een suggestie voor een arrangement, dat kan worden overschreven door een medewerker als die een andere inschatting maakt. ", + "risks": null, + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.359701+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "26932183", + "owner": "gemeente-utrecht", + "leverancier_id": null + }, + { + "name": "Woninginbraakvoorspeller", + "organization": "Gemeente Utrecht", + "department": "Veiligheid", + "description_short": "Het voorspellen van het risico op woninginbraak per gebied voor de komende twee weken. Meer specifieke informatie mbt dit algoritme volgt.", + "type": null, + "category": null, + "website": null, + "status": null, + "goal": null, + "impact": null, + "proportionality": null, + "decision_making_process": "Het algoritme combineert historische data mbt woninginbraak met kenmerken van woningen, buurtkenmerken en de omstandigheden ten tijde van de inbraak en geeft een voorzet (informatie) over een verhoogde kans op woninginbraak in een bepaald gebied in een bepaalde periode", + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": null, + "revision_date": null, + "description": null, + "application_url": null, + "publiccode": null, + "mprd": null, + "source_data": null, + "methods_and_models": null, + "monitoring": null, + "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker.", + "risks": null, + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.364380+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "22789541", + "owner": "gemeente-utrecht", + "leverancier_id": null + }, + { + "name": "Hotspot aanpak", + "organization": "Gemeente Utrecht", + "department": "Veiligheid", + "description_short": "Het beschrijven waar en wanneer delicten hebben plaats gevonden in de openbare ruimte. Meer specifieke informatie mbt dit algoritme volgt.", + "type": null, + "category": null, + "website": null, + "status": null, + "goal": null, + "impact": null, + "proportionality": null, + "decision_making_process": "Het algoritme plot beschrijvende data over delicten op de kaart en geeft een beeld (informatie) van hotspot locaties in het recente verleden", + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": null, + "revision_date": null, + "description": null, + "application_url": null, + "publiccode": null, + "mprd": null, + "source_data": null, + "methods_and_models": null, + "monitoring": null, + "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker.", + "risks": null, + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.369089+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "78136377", + "owner": "gemeente-utrecht", + "leverancier_id": null + }, + { + "name": "Risico-indicatoren drugspanden", + "organization": "Gemeente Utrecht", + "department": "Veiligheid", + "description_short": "Het verklaren welke kenmerken van panden vaak samenhangen met het vervaardigen van drugs. Meer specifieke informatie mbt dit algoritme volgt.", + "type": null, + "category": null, + "website": null, + "status": null, + "goal": null, + "impact": null, + "proportionality": null, + "decision_making_process": "Het algoritme combineert historische data mbt frauduleuze activiteiten met een bestand van pandkenmerken en geeft een voorzet (informatie) over de omvang en kenmerken van de groep panden met een hoog risico op het plaatsvinden van vervaardigen van drugs in elke buurt.", + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": null, + "revision_date": null, + "description": null, + "application_url": null, + "publiccode": null, + "mprd": null, + "source_data": null, + "methods_and_models": null, + "monitoring": null, + "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker.", + "risks": null, + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.373288+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "59969756", + "owner": "gemeente-utrecht", + "leverancier_id": null + }, + { + "name": "Risico-indicatoren witwassen panden", + "organization": "Gemeente Utrecht", + "department": "Veiligheid", + "description_short": "Het verklaren welke kenmerken van panden vaak samenhangen met witwassen. Deze toepassing vindt plaats binnen de City Deal \"Zicht op Ondermijning\". Meer specifieke informatie mbt dit algoritme volgt.", + "type": null, + "category": null, + "website": null, + "status": null, + "goal": null, + "impact": null, + "proportionality": null, + "decision_making_process": "Het algoritme combineert historische data mbt frauduleuze activiteiten met een bestand van pandkenmerken en geeft een voorzet (informatie) over de omvang en kenmerken van de groep panden met een hoog risico op het plaatsvinden van witwassen in elke buurt.", + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": null, + "revision_date": null, + "description": null, + "application_url": null, + "publiccode": null, + "mprd": null, + "source_data": null, + "methods_and_models": null, + "monitoring": null, + "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker.", + "risks": null, + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.378036+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "17643694", + "owner": "gemeente-utrecht", + "leverancier_id": null + }, + { + "name": "Risico-indicatoren & voorspelmodel jonge aanwas in de drugscriminaliteit", + "organization": "Gemeente Utrecht", + "department": "Veiligheid", + "description_short": "Het verklaren welke indicatoren jongeren kwetsbaar maken om betrokken te raken in de drugscriminaliteit en het voorspellen in welke buurten veel kwetsbare jongeren wonen. Deze toepassing vindt plaats binnen de City Deal \"Zicht op Ondermijning\". Meer specifieke informatie mbt dit algoritme volgt.", + "type": null, + "category": null, + "website": null, + "status": null, + "goal": null, + "impact": null, + "proportionality": null, + "decision_making_process": "Het algoritme combineert historische data mbt jeugd en criminaliteit met een bestand van jongeren en geeft een voorzet (informatie) over de omvang en kenmerken van de groep kwetsbare jongeren in elke buurt.", + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": null, + "revision_date": null, + "description": null, + "application_url": null, + "publiccode": null, + "mprd": null, + "source_data": null, + "methods_and_models": null, + "monitoring": null, + "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker.", + "risks": null, + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.382276+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "67377536", + "owner": "gemeente-utrecht", + "leverancier_id": null + }, + { + "name": "Stemgerechtigden", + "organization": "Gemeente Utrecht", + "department": "Burgerzaken (PBZ)", + "description_short": "Het bepalen welke bewoners stemgerechtigd zijn voor verkiezingen. Meer specifieke informatie mbt dit algoritme volgt.", + "type": null, + "category": null, + "website": null, + "status": null, + "goal": null, + "impact": null, + "proportionality": null, + "decision_making_process": "Het algoritme combineert criteria aan een bestand van bewoners en geeft een informatie over bij welke bewoners wel en niet stemgerechtigd zijn voor verkiezingen", + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": null, + "revision_date": null, + "description": null, + "application_url": null, + "publiccode": null, + "mprd": null, + "source_data": null, + "methods_and_models": null, + "monitoring": null, + "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker", + "risks": null, + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.386906+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "54713329", + "owner": "gemeente-utrecht", + "leverancier_id": null + }, + { + "name": "Herkennen en anonimiseren van privacygevoelige informatie in documenten", + "organization": "Gemeente Utrecht", + "department": "Burgerservicenummers (BSN)", + "description_short": "Het geautomiseerd herkennen en anonimiseren van privacygevoelige informatie in documenten dmv software. Meer specifieke informatie mbt dit algoritme volgt.", + "type": null, + "category": null, + "website": null, + "status": null, + "goal": null, + "impact": null, + "proportionality": null, + "decision_making_process": "Het algoritme combineert criteria mbt privacygevoelige informatie met informatie in documenten en geeft een voorzet over welke informatie privacygevoelig is", + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": null, + "revision_date": null, + "description": null, + "application_url": null, + "publiccode": null, + "mprd": null, + "source_data": null, + "methods_and_models": null, + "monitoring": null, + "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker", + "risks": null, + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.391411+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "81878651", + "owner": "gemeente-utrecht", + "leverancier_id": null + }, + { + "name": "Parkeercontrole", + "organization": "Gemeente Rotterdam", + "department": "Stadsbeheer Parkeervoorzieningen", + "description_short": "De gemeente Rotterdam wil de stad graag leefbaar, bereikbaar en veilig houden. Het aantal auto\u2019s in de stad beperken draagt daaraan bij. Dat doet de gemeente onder andere door gratis parkeren op P+R terreinen aan te moedigen en gebruik van het openbaar vervoer te stimuleren. Binnenin de stad is parkeren betaald en voert de gemeente parkeercontroles uit. Zo zorgen we ervoor dat de schaarse parkeerruimte vooral beschikbaar blijft voor bewoners en ondernemers.", + "type": "Zelflerend", + "category": "Veiligheid en handhaving", + "website": "https://algoritmeregister.rotterdam.nl/p/Onzealgoritmes/53761720551735697", + "status": "In gebruik", + "goal": "De gemeente Rotterdam wil de stad graag leefbaar, bereikbaar en veilig houden. Het aantal auto\u2019s in de stad beperken draagt daaraan bij. Dat doet de gemeente onder andere door gratis parkeren op P+R terreinen aan te moedigen en gebruik van het openbaar vervoer te stimuleren.", + "impact": "Als er geen vergunning is of niet betaald is voor het parkeren, dan wordt het kenteken doorgestuurd naar een parkeerhandhaver van de gemeente Rotterdam. Deze controleert of er echt niet is betaald en bekijkt de gemaakte scanfoto\u2019s. Als er geen sprake is van een bijzondere situatie, dan volgt een parkeerboete en wordt een \u2018naheffingsaanslag parkeerbelasting\u2019 uitgeschreven.", + "proportionality": "Er wordt gekeken naar parkeervergunning, bezoekersregeling, invalidenplek en pechgevallen. Er wordt altijd gecontroleerd door een mens voordat er een boete uitgeschreven wordt.", + "decision_making_process": "Parkeerbeheer", + "documentation": null, + "competent_authority": "Gemeente Rotterdam", + "lawful_basis": "Algemeen belang", + "iama": null, + "iama_description": null, + "dpia": "Ja", + "dpia_description": null, + "objection_procedure": "https://www.rotterdam.nl/loket/bezwaar-belastingaanslag/", + "standard_version": "0.1.0", + "uuid": null, + "url": "https://algoritmeregister.rotterdam.nl/p/Onzealgoritmes/53761720551735697", + "contact_email": "algoritmetoezichtbco@rotterdam.nl", + "area": "Rotterdam", + "lang": "Nederlands", + "revision_date": null, + "description": "De gemeente Rotterdam wil de stad graag leefbaar, bereikbaar en veilig houden. Het aantal auto\u2019s in de stad beperken draagt daaraan bij. Dat doet de gemeente onder andere door gratis parkeren op P+R terreinen aan te moedigen en gebruik van het openbaar vervoer te stimuleren. Binnenin de stad is parkeren betaald en voert de gemeente parkeercontroles uit. Zo zorgen we ervoor dat de schaarse parkeerruimte vooral beschikbaar blijft voor bewoners en ondernemers. De gemeente Rotterdam zet scanauto\u2019s met camera\u2019s in om parkeercontroles uit te voeren. Deze camera\u2019s scannen kentekens om te zien of de geparkeerde auto\u2019s een parkeervergunning hebben, zijn aangemeld via 'bezoekersparkeren' of dat er betaald is om te parkeren. De camera\u2019s op de scanauto gebruiken een beeldherkenningsalgoritme om kentekens te identificeren. Het kentekennummer komt binnen bij het Nationaal Parkeerregister en de vergunningendatabase van de gemeente Rotterdam. Hier wordt gecontroleerd of de auto het recht heeft om geparkeerd te staan. Als er geen vergunning is of niet betaald is voor het parkeren, dan wordt het kenteken doorgestuurd naar een parkeerhandhaver van de gemeente Rotterdam. Deze controleert of er echt niet is betaald en bekijkt de gemaakte scanfoto\u2019s. Als er geen sprake is van een bijzondere situatie, dan volgt een parkeerboete en wordt een \u2018naheffingsaanslag parkeerbelasting\u2019 uitgeschreven.", + "application_url": null, + "publiccode": null, + "mprd": "Nee", + "source_data": "Het kentekennummer komt binnen bij het Nationaal Parkeerregister en de vergunningendatabase van de gemeente Rotterdam. Hier wordt gecontroleerd of de auto het recht heeft om geparkeerd te staan.", + "methods_and_models": "De camera\u2019s op de scanauto gebruiken een beeldherkenningsalgoritme om kentekens te identificeren.", + "monitoring": "Als er geen vergunning is of niet betaald is voor het parkeren, dan wordt het kenteken doorgestuurd naar een parkeerhandhaver van de gemeente Rotterdam. Deze controleert of er echt niet is betaald en bekijkt de gemaakte scanfoto\u2019s. Als er geen sprake is van een bijzondere situatie, dan volgt een parkeerboete en wordt een \u2018naheffingsaanslag parkeerbelasting\u2019 uitgeschreven.", + "human_intervention": "Ja, bij twijfel wordt er niet gehandhaafd.", + "risks": "Het belangrijkste risico is dat het systeem een kenteken verkeerd herkent en dat iemand die het niet verdient een boete krijgt. Dit kan gebeuren als een karakter op het kenteken foutief wordt herkend.", + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.395982+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "33947772", + "owner": "gemeente-rotterdam", + "leverancier_id": null + }, + { + "name": "Aardgasvrij", + "organization": "Gemeente Rotterdam", + "department": "Duurzaam", + "description_short": "In Rotterdam willen we overstappen op duurzame energie. Dat betekent nogal wat. Op dit moment gebruiken we nog volop aardgas. Dit gebruiken we nu vooral voor verwarmen en koken. Hoe gaan we dat straks doen met die andere warmtebronnen? Hoe zorgen we voor een goed en betaalbaar alternatief voor de hele stad? En als we een oplossing vinden, hoe voeren we die dan het beste uit?", + "type": "Rule based", + "category": "Infrastructuur", + "website": "https://algoritmeregister.rotterdam.nl/p/Onzealgoritmes/53761720551735605", + "status": "In gebruik", + "goal": "Op dit moment gebruiken we nog volop aardgas, vooral voor verwarmen en koken. Hoe gaan we dat straks doen met die andere warmtebronnen? Hoe zorgen we voor een goed en betaalbaar alternatief voor de hele stad?", + "impact": null, + "proportionality": null, + "decision_making_process": "Rotterdamse Transitievisie Warmte", + "documentation": "https://duurzaam010.nl/nieuws/rotterdamse-transitievisie-warmte/", + "competent_authority": "Gemeente Rotterdam", + "lawful_basis": "Paris Climate Agreement 2050 aardgasvrij", + "iama": null, + "iama_description": null, + "dpia": "Ja", + "dpia_description": "PRA DPIA uitgevoerd in December 2021. Risicoprofiel Laag.", + "objection_procedure": "Niet van toepassing", + "standard_version": "0.1.0", + "uuid": null, + "url": "https://algoritmeregister.rotterdam.nl/p/Onzealgoritmes/53761720551735605", + "contact_email": "https://duurzaam010.nl/contact/", + "area": "Rotterdam", + "lang": "Nederlands", + "revision_date": null, + "description": "In Rotterdam willen we overstappen op duurzame energie. Dat betekent nogal wat. Op dit moment gebruiken we nog volop aardgas. Dit gebruiken we nu vooral voor verwarmen en koken. Hoe gaan we dat straks doen met die andere warmtebronnen? Hoe zorgen we voor een goed en betaalbaar alternatief voor de hele stad? En als we een oplossing vinden, hoe voeren we die dan het beste uit? Als gemeente hebben we uitgebreid onderzoek gedaan naar deze vragen. Dit leverde genoeg antwoorden op om een plan te schrijven. In de Rotterdamse Transitievisie Warmte staat: - waarom Rotterdam overstapt op een alternatief voor aardgas; - wat de beste manier is om duurzaam te verwarmen, koelen en koken; - wanneer verschillende wijken zouden kunnen overstappen op duurzame bronnen; - hoe we de overstap als gemeente willen uitvoeren en begeleiden. De Rotterdamse Transitievisie Warmte is door de gemeenteraad vastgesteld in 2021. Het is een advies aan het college van burgemeester en wethouders vanaf 2022. Of de plannen precies zo worden uitgevoerd, staat dus niet vast. Zeker de planning kan nog veranderen. Ons algoritme heeft gekeken naar alle Rotterdamse wijken en daarvan een overzichtskaart gemaakt. Hierop staat per wijk informatie over een makkelijke toevoer van alternatieve energie.", + "application_url": null, + "publiccode": null, + "mprd": "Ja", + "source_data": "Voorletters, tussenvoegsel, achternaam, adres, email, telefoonnummer, status", + "methods_and_models": "Het RAM (Rotterdam aardgasvrij model) is onderdeel van de WAT-kaart berekening, waarbij de inpandige berekeningen van Nieman zijn vertaald naar rekenregels, naast de aanvullende rekenregels COMSOF)", + "monitoring": "Uitkomsten van het model worden gevalideerd door afdeling Duurzaam door bezoek aan woning voor overleg.", + "human_intervention": "Uitkomsten van het model worden gevalideerd door afdeling Duurzaam door bezoek aan woning voor overleg.", + "risks": null, + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.401171+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "81267141", + "owner": "gemeente-rotterdam", + "leverancier_id": null + }, + { + "name": "SpotRotterdam", + "organization": "Gemeente Rotterdam", + "department": "Stadsontwikkeling - Economie, Team Economische Ontwikkeling Stad", + "description_short": "In Rotterdam kan het op veel plaatsen erg druk zijn. Veel mensen vinden het fijn om afstand te houden tot anderen om een coronabesmetting te vermijden. Daarom biedt de gemeente Rotterdam SpotRotterdam aan. Dat is een online druktemeter waarmee bewoners en bezoekers live kunnen zien hoe rustig of druk het is in winkelcentra, parken, markten en op stations.", + "type": "Zelflerend", + "category": "Veiligheid en handhaving", + "website": "https://algoritmeregister.rotterdam.nl/p/Onzealgoritmes/53761720551735397", + "status": "Buiten gebruik", + "goal": "De gemeente gebruikt algoritmen om:\n\n* aan de hand van de anonieme locatiegegevens in een gebied te voorspellen hoeveel personen zich daar bevinden\n* op basis van de voorspelde hoeveelheid personen in een gebied een schatting te maken van de actuele drukte in dit gebied.\n\nDe gegevens uit de BAG en de OpenStreetMap vormen de basis voor de kaart van de stad. De stad is ingedeeld in 500 verschillende gebieden: buurten, parken, winkelstraten en zo meer. Voor al deze locaties haalt SpotRotterdam elke 15 minuten real-time data op bij Resono. Deze data verzamelt Resono van gebruikers die daar toestemming voor hebben gegeven. Als een persoon in een bepaald gebied binnen Rotterdam komt, telt Resono deze persoon. Op de data van Resono past SpotRotterdam een berekening toe om een schatting te maken van de actuele drukte in de gebieden. Deze schatting wordt omgezet in relatieve drukte door de gegevens te relateren aan de drukste en de rustigste momenten in de afgelopen dagen. De informatie over relatieve drukte laat SpotRotterdam zien met behulp van een patroon in de app dat weergeeft of het druk is of rustig. Daarnaast laat SpotRotterdam de drukte zien in vijf categorie\u00ebn van 'veel rustiger dan normaal' tot 'veel drukker dan normaal'.", + "impact": null, + "proportionality": "Het algoritme verwerkt geen informatie die kan leiden tot discriminatie. SpotRotterdam verwerkt geen persoonsgegevens als leeftijd, geslacht en zo meer. Het systeem houdt allen tellingen bij waardoor de informatie op geen enkele wijze herleidbaar is tot een natuurlijk persoon. Om deze reden kunnen personen bijvoorbeeld dus ook niet gevolgd worden. Ook past de gemeente SpotRotterdam niet toe in andere uitvoeringsprocessen, waarbij er wel sprake kan zijn van gevolgen voor individuele personen.", + "decision_making_process": null, + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": "info@spotrotterdam.nl", + "area": "Rotterdam", + "lang": "Nederlands", + "revision_date": null, + "description": "In Rotterdam kan het op veel plaatsen erg druk zijn. Veel mensen vinden het fijn om afstand te houden tot anderen om een coronabesmetting te vermijden. Daarom biedt de gemeente Rotterdam SpotRotterdam aan. Dat is een online druktemeter waarmee bewoners en bezoekers live kunnen zien hoe rustig of druk het is in winkelcentra, parken, markten en op stations.\n\nDoor het gebruik van SpotRotterdam kunnen bewoners en bezoekers zelf kiezen voor een rustige locatie of een geschikt moment om op een veilige manier te winkelen, een terrasje te pakken of boodschappen te doen. Hierbij zijn ook de Rotterdamse ondernemers gebaat. SpotRotterdam is zo een hulpmiddel om het gewone leven en de Rotterdamse economie draaiende te houden.", + "application_url": "www.spotrotterdam.nl", + "publiccode": null, + "mprd": "Ja", + "source_data": "Bij de ontwikkeling van SpotRotterdam heeft gemeente gebruikgemaakt van algoritmen. Hieronder volgt een verantwoording van dit gebruik. Deze verantwoording bevat een overzicht van de belangrijkste digitale gegevensbronnen die gebruikt zijn bij de ontwikkeling en in de toepassing van het algoritme.\n\nSpotRotterdam gebruikt drie databronnen:\n\n1. BAG-data: Basisregistratie Adressen en Gebouwen: De BAG bevat gegevens over adressen en gebouwen. Meer informatie over deze data vindt u op de website van het Kadaster .\n2. Anonieme locatiegegevens: Om de drukte in gebieden te kunnen bepalen heeft de gemeente het bedrijf Resono ingeschakeld. Dit bedrijf benut anonieme locatiegegevens van appgebruikers die toestemming hebben gegeven om hun locatiegegevens te delen.\n3. OpenStreetMap: SpotRotterdam haalt informatie uit de OpenStreetMap. Het gaat onder meer om adressen van musea en bedrijven en afbeeldingen van gebieden en plaatsen. Deze informatie gebruikt SpotRotterdam om bijvoorbeeld de contactgegevens van winkels weer te geven in de app. Deze gegevens hebben de winkels zelf verstrekt. ", + "methods_and_models": null, + "monitoring": null, + "human_intervention": "Resono controleert de databron met de tellingen. Resono houdt bijvoorbeeld in de gaten of er beschadigde data tussen zitten. Als dat het geval is, informeert Resono de gemeente tijdig om dit op te lossen. Verder controleert Resono het model dat voorspelt hoeveel personen zich in een gebied bevinden.Omdat veranderingen in straatnamen zelden zijn, komen er zelden veranderingen voor in de data uit de BAG en OpenStreetMap. Dat betekent dat er geen menselijk toezicht nodig is om vanuit SpotRotterdam deze databronnen in de gaten te houden. Als er iets verkeerd gaat met de techniek van SpotRotterdam, dan is het enige gevolg dat er verkeerde tellingen in de applicatie komen te staan. Er is gekozen om geen permanent toezicht in te richten op SpotRotterdam gezien de geringe consequenties.", + "risks": "Het kan voorkomen dat de drukte die SpotRotterdam weergeeft niet overeenkomt met de drukte in het gebied. Daarom informeert de gemeente de gebruikers van SpotRotterdam dat het hun eigen verantwoordelijkheid blijft om voldoende afstand te houden en drukke plekken te vermijden. Daarnaast kunnen gebruikers van de app hun eigen mening over de drukte invoeren. Deze gegevens kunnen helpen om na te gaan of de drukte die de app opgeeft klopt met het druktebeeld dat app-gebruikers op dat moment hebben. Ook zorgt de gemeente ervoor dat bedrijven en andere partijen de gemeente kunnen benaderen om vragen te stellen over het gebied waarin zij gevestigd zijn.", + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.405911+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "22734277", + "owner": "gemeente-rotterdam", + "leverancier_id": null + }, + { + "name": "Heronderzoeken Uitkeringsgerechtigden", + "organization": "Gemeente Rotterdam", + "department": "Cluster Werk & Inkomen", + "description_short": "In Rotterdam doet iedereen mee. Ook inwoners die zelf niet over voldoende inkomen of vermogen beschikken. Zij ontvangen dan meestal van de gemeente een uitkering. Het cluster Werk & Inkomen (W&I) van de gemeente Rotterdam onderzoekt en beoordeelt regelmatig of de uitkering die inwoners ontvangen rechtmatig is en nog aansluit bij de situatie waarin zij zitten.", + "type": "Supervised learning", + "category": "Sociale zekerheid", + "website": "https://algoritmeregister.rotterdam.nl/p/Onzealgoritmes/53761720551735604", + "status": "Buiten gebruik", + "goal": "Het model doet een voorspelling voor de kans op onrechtmatigheid of juist rechtmatigheid, door te kijken naar de in de administratie bekende gegevens van burgers bij wie in eerdere jaren een onderzoek naar de rechtmatigheid heeft plaatsgevonden. Die conclusie kan zijn geweest dat de uitkering rechtmatig is verstrekt; of dat de eerder verstrekte uitkering niet aansloot op de feitelijke situatie (onrechtmatigheid).\n\nOp basis van deze historische gegevens, kan er een voorspelling worden gedaan over de kans op rechtmatigheid of onrechtmatigheid bij de huidige uitkeringsgerechtigden. Die voorspelling wordt dus gedaan op basis van de in onze administratie bekende gegevens van huidige uitkeringsgerechtigden. De uitkomst van het model is een \u2018risico-inschattingsgetal\u2019 dat varieert tussen 0 (grote kans op rechtmatigheid) en 1 (grote kans op onrechtmatigheid). De uitkeringsgerechtigden met het hoogste risico-inschattingsgetal worden uitgenodigd voor een onderzoeksgesprek, tenzij er bijvoorbeeld onlangs al een onderzoek naar de rechtmatigheid heeft plaatsgevonden. Jaarlijks wordt opnieuw bepaald hoeveel uitkeringsgerechtigden worden uitgenodigd op basis van het risico-inschattingsmodel.\n\nHet model wordt ieder jaar opnieuw ontwikkeld, omdat er elk jaar nieuwe onderzoeksdata beschikbaar komen. De informatie uit recente onderzoeken naar de rechtmatigheid worden dus steeds meegenomen bij de ontwikkeling van een nieuw model. Het model voor 2022 is op dit moment nog in ontwikkeling.", + "impact": null, + "proportionality": "Het algoritme verwerkt geen informatie die kan leiden tot discriminatie, zoals nationaliteit, leeftijd of gezondheidstoestand. Daarnaast onderzoekt de gemeente of er informatie in het model wordt gebruikt die kan samenhangen met nationaliteit of afkomst, zoals taalkennis. Zo wordt de kans op discriminatie of vooringenomenheid voorkomen. Bovendien doet het model geen uitspraak over rechtmatigheid of onrechtmatigheid: het onderzoek dat voor die uitspraak vereist is, wordt altijd uitgevoerd door een medewerker. Dat onderzoek gebeurt altijd op dezelfde wijze, of de uitkeringsgerechtigde nu is uitgenodigd op basis van het risico-inschattingsmodel of op basis van \u00e9\u00e9n van de andere selectiemethoden.", + "decision_making_process": null, + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": "14 010", + "area": "Rotterdam", + "lang": "Nederlands", + "revision_date": null, + "description": "In Rotterdam doet iedereen mee. Ook inwoners die zelf niet over voldoende inkomen of vermogen beschikken. Zij ontvangen dan meestal van de gemeente een uitkering. Het cluster Werk & Inkomen (W&I) van de gemeente Rotterdam onderzoekt en beoordeelt regelmatig of de uitkering die inwoners ontvangen rechtmatig is en nog aansluit bij de situatie waarin zij zitten.\n\nUitkeringsgerechtigden kunnen daarom worden uitgenodigd voor een onderzoeksgesprek. Om te bepalen wie een uitnodiging krijgt gebruikt de gemeente verschillende selectie- methoden, waaronder een risico-inschattingsmodel. Dit model helpt de gemeente om in te schatten bij welke uitkeringsgerechtigden de kans groot is dat de uitkering niet (meer) aansluit op de situatie van de uitkeringsgerechtigde (onrechtmatigheid). Dat heeft twee voordelen. Dit helpt de gemeente om omvangrijke terugvorderingen te voorkomen. Bovendien worden uitkeringsgerechtigden waarbij de kans op onrechtmatigheid klein wordt geacht, minder snel voor een onderzoeksgesprek uitgenodigd.\n\nHet risico-inschattingsmodel maakt gebruik van een voorspellend algoritme. Dit algoritme gebruikt gegevens die het cluster W&I nodig heeft om haar wettelijke taken uit te voeren en de uitkering te kunnen verstrekken. Het gaat om gegevens als de hoogte van de uitkering, de gezinssituatie, maar ook om competenties en kwaliteiten van de werkzoekende, die van belang zijn voor diens kansen op de arbeidsmarkt. De gemeente gebruikt alleen gegevens uit de eigen administratie.\n\nHet risico-inschattingsmodel wordt alleen gebruikt voor de selectie van uitkeringsgerechtigden voor een onderzoeksgesprek. Op basis van het model worden geen uitspraken gedaan over de rechtmatige of onrechtmatige verstrekking van uitkering. Een medewerker van de gemeente Rotterdam beoordeelt het recht op een uitkering, want dat is afhankelijk van veel factoren en is bovendien maatwerk. Het algoritme neemt dus geen besluiten en schrijft ook geen besluiten voor.\n\nHet model wordt ieder jaar opnieuw ontwikkeld, omdat er elk jaar nieuwe onderzoeksdata beschikbaar komen. De informatie uit recente onderzoeken naar de rechtmatigheid worden dus steeds meegenomen bij de ontwikkeling van een nieuw model. Het model voor 2022 is op dit moment nog in ontwikkeling.", + "application_url": null, + "publiccode": null, + "mprd": "Ja", + "source_data": "Gemeente Rotterdam onderzoekt en beoordeelt regelmatig of mensen die een uitkering krijgen daar nog recht op hebben. Uitkeringsgerechtigden kunnen daarom worden uitgenodigd voor een onderzoeksgesprek. Om te bepalen wie een uitnodiging krijgt, maakt de gemeente gebruik van verschillende selectiemethoden. E\u00e9n daarvan is een risico-inschattingsmodel met een voorspellend algoritme. Deze verantwoording bevat een overzicht van de belangrijkste digitale gegevensbronnen die gebruikt zijn bij de ontwikkeling en in de toepassing van het algoritme.\n\nHet risico-inschattingsmodel gebruikt 2 databronnen:\n\n1. Socrates: Socrates is het uitkeringsadministratie-systeem. Hierin wordt de hoogte van de verstrekte uitkering vastgesteld en vastgelegd. In dit systeem zijn gegevens opgenomen over bijvoorbeeld de woon-/leefsituatie van de uitkeringsgerechtigde.\n2. RWM/Raak: RWM/Raak is het systeem waarin gegevens over de re-integratie van werkzoekenden worden vastgelegd. Het gaat om gegevens over de competenties en kwaliteiten van de werkzoekende die van belang zijn voor diens kansen op de arbeidsmarkt, \u00e9n de trajecten die worden uitgezet om de kans op werk te vergroten.\n\nHet gaat om informatie die binnen de gemeente is vastgelegd in het kader van de uitvoering van de Participatiewet. Er vindt g\u00e9\u00e9n koppeling plaats met andere databestanden.", + "methods_and_models": null, + "monitoring": null, + "human_intervention": "Het risico-inschattingsmodel bepaalt niet of iemand rechtmatig of onrechtmatig een uitkering ontvangt. Met het model wordt wel bepaald welke uitkeringsgerechtigden worden uitgenodigd voor een onderzoeksgesprek. Een deskundige inkomensconsulent van de afdeling Werk & Inkomen van de gemeente Rotterdam voert dit onderzoek uit. Na uitvoering van het onderzoek bepaalt de inkomensconsulent of de uitkering van de werkzoekende rechtmatig of onrechtmatig is verstrekt en of deze nog past bij de situatie waarin de uitkeringsgerechtigde zich bevindt.", + "risks": "Voor het bepalen van het risico van een algoritme gebruikt de gemeente Rotterdam een vastgesteld model. Het risico-inschattingsmodel is aangemerkt als een hoog-risico algoritme. De gemeente neemt daarom extra veiligheidsmaatregelen. Denk hierbij aan maatregelen die ervoor zorgen dat er goed toezicht is op de ontwikkeling en het gebruik van het model. Zo wordt er specifiek gekeken naar de ethische risico\u2019s en kijkt een externe toezichtscommissie mee met het ontwerp en het gebruik van het model. Deze commissie is er naar verwachting begin 2022. Als er sprake is van een algoritme in de categorie hoog-risico, dan is een menselijke toets onderdeel van het werkproces waarin het desbetreffende algoritme wordt gebruikt.\n\nDe kans op vooringenomenheid wordt beperkt doordat het risico-inschattingsmodel slechts wordt gebruikt om te bepalen wie een uitnodiging voor een onderzoeksgesprek ontvangt. Het algoritme bepaalt niet of iemand rechtmatig of onrechtmatig een uitkering ontvangt. Dit doen inkomensconsulenten van de afdeling W&I. Zij doen uitvoerig onderzoek naar de situatie, samen met de uitkeringsgerechtigde. Een uitkering verstrekken is immers maatwerk en gebeurt op individueel niveau. ", + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.410821+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "36585638", + "owner": "gemeente-rotterdam", + "leverancier_id": null + }, + { + "name": "Kwaliteitsbepaling van de foto", + "organization": "Rijksdienst voor Identiteitsgegevens (RvIG)", + "department": "Directie Informatievoorziening en Systemen, afdeling Reisdocumentensystemen", + "description_short": "Technische ondersteuning voor het verifi\u00ebren van de kwaliteit van de foto.", + "type": "Voorschrijvend", + "category": "Basisregistratie", + "website": "\u00a0", + "status": "In gebruik", + "goal": "Technische ondersteuning voor het verifi\u00ebren van de kwaliteit van de foto.", + "impact": "Als de foto niet voldoet aan de vastgestelde kwaliteitscriteria, moet er een nieuwe foto aangeleverd worden door de burger.", + "proportionality": "De inzet van het algoritme is een kosteneffectieve manier om de kwaliteit van de pasfoto in het identiteitsdocument te borgen. De inzet van het algoritme heeft geen herkenningsdoeleinde, maar zorgt alleen voor de meting van de kwaliteit, om ervoor te zorgen dat kwalitatief zo hoog mogelijk foto\u2019s in het identiteitsdocument worden opgenomen.\n\nDe kwaliteit van de in het identiteitsdocument opgenomen foto speelt een belangrijke rol bij het gebruik van een reisdocument, aangezien de verificatie van de identiteit afhankelijk is van de kwaliteit van de opgenomen foto. Hogere kwaliteit zorgt voor betere prestaties en daarmee bijvoorbeeld voor een kleinere kans op onterechte afwijzing in het vervolgproces van identiteitsverificatie (bijvoorbeeld bij grenspassage bij e-gates).\n\nOmdat zowel menselijke als automatische systeembeslissingen kunnen leiden tot fouten bij kwaliteitsmetingscontroles, verkleint de samenvoeging van de menselijke en automatische systeembeslissing het risico van deze fouten.", + "decision_making_process": "\u00a0", + "documentation": "\u00a0", + "competent_authority": "Ministerie van Binnenlandse Zaken en Koninkrijkrelaties, Rijksdienst voor Identiteitsgegevens", + "lawful_basis": "Paspoortwet artikel 3 lid 2 geeft aan dat een reisdocument is voorzien van de gezichtsopname;\nPaspoortuitvoeringsregeling (artikel 28 PUN, artikel 42 PUB, artikel 40 PUCAR, artikel 17 PUKMAR) geeft aan:\nBij het indienen van een aanvraag voor een reisdocument wordt een pasfoto overgelegd die een goedgelijkend beeld van de aanvrager geeft;\nDe overgelegde pasfoto voldoet aan de acceptatiecriteria van de in bijlage L bij deze regeling opgenomen fotomatrix.\nIn afwijking van het tweede lid kan een pasfoto worden geaccepteerd als de aanvrager heeft aangetoond dat godsdienstige of levensbeschouwelijke redenen zich verzetten tegen het niet bedekken van het hoofd.\nIn afwijking van het tweede lid kan een pasfoto worden geaccepteerd als op grond van objectief vast te stellen fysieke of medische redenen, door de aanvrager niet kan worden voldaan aan alle in de fotomatrix opgenomen acceptatiecriteria. Bij gerede twijfel aan de medische redenen kan van de aanvrager worden verlangd, dat deze een door een bevoegde arts of medische instelling ondertekende verklaring overlegt.\nIn afwijking van het tweede lid kan een pasfoto van een aanvrager die de leeftijd van zes jaar nog niet heeft bereikt worden geaccepteerd, als de foto voldoet aan de in de fotomatrix voor die leeftijdscategorie opgenomen minimum vereisten.\nDe fotomatrix is gebaseerd op de door de internationale standaarden van DOC9303 en ISO 19794:5 vastgestelde criteria.\nDe verwerking van foto\u2019s valt niet onder bijzondere categorie\u00ebn van persoonsgegevens, zoals gedefinieerd in de AVG. Foto\u2019s vallen alleen onder de definitie van biometrische gegevens als zij worden verwerkt met behulp van bepaalde technische middelen die de unieke identificatie of authenticatie van een natuurlijke persoon mogelijk maken. Foto's moeten voor herkenningsdoeleinden technisch worden omgezet om als biometrische gegevens te kunnen worden aangemerkt. Dit algoritme wordt niet ingezet voor herkenningsdoeleinden maar alleen voor het meten van de kwaliteit van de opgenomen foto.", + "iama": null, + "iama_description": null, + "dpia": "Ja", + "dpia_description": "De ondersteuning door het algoritme kan onderbouwt worden door wet- en regelgeving, waaronder de Paspoortwet en Algemene Verordening Gegevensbescherming. Het algoritme voorziet in een kwaliteitscontrole op de pasfoto die op het reisdocument wordt geplaatst, om de kans te vergroten dat deze geschikt is voor visuele identificatie door bevoegde instanties. Het algoritme ondersteunt de inspectie op de fotokwaliteit door de ambtenaar die deze hierdoor effici\u00ebnter de kan beoordelen. Het is daarbij van belang op te merken dat het algoritme niet gericht is op directe of indirecte identificatie van een natuurlijk persoon of het verwerken van persoonsgegevens. De pasfoto wordt verwerkt om vast te stellen dat de foto op de aspecten positionering en afmeting van voldoende kwaliteit is. Er kan goed beheer en daarmee controle uitgevoerd worden door RvIG op het algoritme.", + "objection_procedure": "\u00a0", + "standard_version": "0.1.0", + "uuid": "\u00a0", + "url": "\u00a0", + "contact_email": "info@rvig.nl", + "area": "Nederland", + "lang": "Nederlands", + "revision_date": "2022-06-01 00:00:00", + "description": "Het algoritme ondersteunt de ambtenaar aan de balie van de uitgevende instantie bij de besluitvorming of de kwaliteit van de foto voldoet aan de internationale standaarden. Het algoritme wordt ingezet om te verifi\u00ebren of de foto voldoet aan de volgende parameters:\n\u2022 staan de ogen op de foto op een horizontale lijn;\n\u2022 is het hoofd gecentreerd afgebeeld op de foto (zowel verticaal als horizontaal in het midden);\n\u2022 is het hoofd niet te klein of te groot weergegeven;\n\u2022 is het hoofd volledig afgebeeld.\nDe technische detaillering van de parameters is te vinden in de volgende internationale standaarden:\n\nInternational Aviation Organization (ICAO) DOC 9303 en\nInternational Standard Organization (ISO) 19794 Deel 5: Biometric data interchange formats \u2013 Part 5: Face image data\nOm te voldoen aan deze parameters worden door het algoritme zogeheten feature points opgezocht zoals gespecificeerd in de ISO 19794-5 standaard voor een full frontal image. Er wordt onderscheid gemaakt tussen personen onder en boven 11 jaar.", + "application_url": "\u00a0", + "publiccode": "\u00a0", + "mprd": "\u00a0", + "source_data": "Fotomatrix: Fotomatrix model 2020 | Brochure | Rijksoverheid.nl\n\nDoc 9303:Doc 9303 Machine Readable Travel Documents (Unedited 8th Edition).pdf (icao.int)\n\nPaspoortuitvoeringsregeling Buitenland 2001: https://wetten.overheid.nl/BWBR0012810/2022-02-05\n\nPaspoortuitvoeringsregeling Caribische landen: https://wetten.overheid.nl/BWBR0012809/2021-08-02\n\nPaspoortuitvoeringsregeling Koninklijke Marechaussee 2001: https://wetten.overheid.nl/BWBR0012812/2021-08-02\n\nPaspoortuitvoeringsregeling Nederland 2001: https://wetten.overheid.nl/BWBR0012811/2021-09-01\n\nPaspoortwet: https://wetten.overheid.nl/BWBR0005212/2021-08-02\n\nUitvoeringswet Algemene verordening gegevensbescherming: wetten.nl - Regeling - Uitvoeringswet Algemene verordening gegevensbescherming - BWBR0040940 (overheid.nl)", + "methods_and_models": "De methode is machinaal leren en het model voor machinaal leren is gebaseerd op support vector machine (SVM).", + "monitoring": "RvIG voert na elke grote wijziging in het aanvraagstation acceptatietesten uit op het algoritme, zoals bijvoorbeeld hardware vervanging of wijzigingen op het onderdeel van het scannen van de foto.", + "human_intervention": "De ambtenaar heeft de keuze om bij een door het algoritme afgekeurde foto deze alsnog te accepteren. De ambtenaar kan hierbij een of meerdere keuzes selecteren en heeft de volgende opties:\n\nFysiek,\nMedisch met verklaring,\nMedisch zonder verklaring,\nJonger dan zes jaar;\nGodsdienstig;\nLevensbeschouwelijk;\nOnjuiste beoordeling aanvraagstation.", + "risks": "Er is een basisbeveiligingsniveau toets afgenomen op juni 2022. Er zijn geen grote inherente risico\u2019s voor beschikbaarheid, veiligheid of integriteit op dienstverlening gevonden, door gebruik van het foto-algoritme.", + "performance_standard": "De nauwkeurigheidsmetriek is bepaald volgens ICAO-criteria. Er wordt gebruik gemaakt van Detection Error Trade-off (DET) en Area Under the Curve (AUC). De belangrijkste beoordelingscriteria worden beheerd met False Rejection Rate en False Acceptance Rate op operationele drempels.", + "create_dt": "2023-03-31 08:34:12.416306+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "86646664", + "owner": "rijksdienst-voor-identiteitsgegevens", + "leverancier_id": null + }, + { + "name": "Kwaliteitsbepaling van de vingerafdruk", + "organization": "Rijksdienst voor Identiteitsgegevens (RvIG)", + "department": "Directie Informatievoorziening en Systemen, afdeling Reisdocumentensystemen", + "description_short": "Het proces van het aanvragen van een identiteitsdocument (paspoort en Nederlandse identiteitskaart)", + "type": "Voorschrijvend", + "category": "Basisregistratie", + "website": "\u00a0", + "status": "In gebruik", + "goal": "Wordt ingezet als technische ondersteuning om te beoordelen of een afgenomen vingerafdruk van voldoende kwaliteit is", + "impact": "Er wordt naar gestreefd om vingerafdrukken van de hoogst mogelijke kwaliteit af te nemen. Soms is het eenvoudigweg niet mogelijk om de minimale drempelwaarde te bereiken. Dit betekent dat het afnameproces van de vingerafdrukken tijdens de aanvraag langer kan duren wegens meerdere afnamepogingen.", + "proportionality": "Kwaliteitsmeting van een vingerafdruk zorgt ervoor dat de opgenomen vingerafdruk geschikt is voor herkenning in het vervolgproces van identiteitsverificatie met het doel om de betrouwbaarheid en nauwkeurigheid te verhogen en de samenwerking tussen verschillende vingerafdrukherkenningssystemen te vergemakkelijken. Dit helpt het terugdringen van mislukte herkenning bij een verificatie tussen de opgenomen vingerafdruk in het document met een live opname.", + "decision_making_process": "\u00a0", + "documentation": "NFIQ2 source code and user guide: https://github.com/usnistgov/NFIQ2\nNFIQ2 conformance test: https://github.com/usnistgov/NFIQ2/tree/master/conformance\nISO Biometric Sample Quality: ISO - ISO/IEC 29794-4:2017 - Information technology \u2014 Biometric sample quality \u2014 Part 4: Finger image data\nNIST Interagency Report 8382: https://doi.org/10.6028/NIST.IR.8382\nPaspoortwet: https://wetten.overheid.nl/BWBR0005212/2021-08-02\nPaspoortuitvoeringsregeling Nederland 2001: https://wetten.overheid.nl/BWBR0012811/2021-09-01\nPaspoortuitvoeringsregeling Buitenland 2001: https://wetten.overheid.nl/BWBR0012810/2022-02-05\nPaspoortuitvoeringsregeling Caribische landen: https://wetten.overheid.nl/BWBR0012809/2021-08-02", + "competent_authority": "Ministerie van Binnenlandse Zaken en Koninkrijkrelaties, Rijksdienst voor Identiteitsgegevens", + "lawful_basis": "Op grond van artikel 3, tweede lid, van de Paspoortwet geldt een verplichting tot opname van de vingerafdruk in het reisdocument. Dit betreft een eis die is gesteld door de Europese Unie (Verordening 2252/2005). Artikel 28a van de Paspoortuitvoeringsregeling Nederland 2001 beschrijft op welke wijze de vingerafdrukken van de aanvrager van een reisdocument worden opgenomen en in welke gevallen daarvan kan worden afgezien. De kwaliteit van de opgenomen vingerafdruk(ken) is daarin bepalend (lid 2-3)*.\nDe genoemde bepalingen voorzien in de rechtsgrond en daarmee rechtmatige verwerking van de vingerafdrukken als bedoeld in artikel 6, derde lid, van de AVG in samenhang met artikel 9 tweede lid, onder g, van de AVG.\n*Zie ook artikel 40a van de Paspoortuitvoeringsregeling Caribische landen en artikel 42a van de Paspoortuitvoeringsregeling Buitenland 2001.", + "iama": null, + "iama_description": null, + "dpia": "Nee", + "dpia_description": "n.v.t.", + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": "\u00a0", + "url": "\u00a0", + "contact_email": "info@rvig.nl", + "area": "Nederland", + "lang": "Nederlands", + "revision_date": "2022-11-22 00:00:00", + "description": "Bij het indienen van een aanvraag voor een paspoort en Nederlandse identiteitskaart (hierna: reisdocument) worden de afdrukken van twee vingers van de aanvrager opgenomen voor opslag in het reisdocument. Hiervoor moet de aanvrager op het moment van het indienen van de aanvraag twaalf jaar of ouder zijn. Het betreft t de platte afdrukken van de linker- en rechterwijsvinger van de aanvrager. Tijdens het afname proces worden de afgenomen vingerafdrukken gecontroleerd op de kwaliteit met behulp van het NFIQ2-algoritme. Indien de kwaliteit van de vingerafdrukken van de wijsvingers onvoldoende is, worden platte afdrukken van de middelvingers, ringvingers of duimen opgenomen. Indien van slechts \u00e9\u00e9n vinger de afdruk van voldoende kwaliteit kan worden opgenomen, wordt uitsluitend de afdruk van die vinger opgenomen.", + "application_url": "\u00a0", + "publiccode": "\u00a0", + "mprd": "\u00a0", + "source_data": "\u00a0", + "methods_and_models": "NFIQ2 software leest een onbewerkt of WSQ-gecomprimeerd vingerafdrukbeeld, berekent een reeks kwaliteitskenmerken van het beeld en gebruikt deze kenmerken om de bruikbaarheid van de beelden te voorspellen. De voorspelling wordt uitgevoerd met behulp van een random forest classifier die is getraind met behulp van vergelijkingsscores van verschillende commerci\u00eble vergelijkingsalgoritmen voor vingerafdrukken uit verschillende operationele vingerafdrukdatabanken. NFIQ 2 software produceert een kwaliteitsscore die in overeenstemming is met de internationale kwaliteitsnorm voor vingerafdrukken ISO/IEC 29794-1:2016 is in (0-100), waarbij 0 geen gebruikswaarde betekent en 100 de hoogste gebruikswaarde is.\nNFIQ 2 gebruikt een random forest model om de gegevens te classificeren. NFIQ 2 is een binaire classificator. Scores worden afgeleid van de random forest beslissing. Elke beslisboom gebruikt een willekeurige deelverzameling van de kenmerkvector. Bij gebruik van 100 beslisbomen is elke stem \u00e9\u00e9n scorepunt. De verdeling van stemmen/ scorepunten is niet lineair, en niet noodzakelijk ongecorreleerd. NFIQ 2 gebruikt 69 kenmerken die handmatig zijn geselecteerd en gevalideerd.", + "monitoring": "Afdeling Reisdocumentensystemen van Rijksdienst voor Identiteitsgegevens voert na elke grote wijziging in het aanvraagstation (zoals bijvoorbeeld hardware en software vervanging) acceptatie testen op het algoritme uit . De laatste acceptatie testen van het algoritme zijn uitgevoerd in juli 2021.", + "human_intervention": "Indien de daartoe aangewezen medewerker van oordeel is dat het fysiek dan wel als gevolg van een tijdelijke verhindering onmogelijk is om van de aanvrager te verlangen dat bij hem op het moment van het indienen van de aanvraag twee vingerafdrukken worden opgenomen, wordt in ieder geval de afdruk opgenomen van de vinger waarbij dit volgens de daartoe aangewezen medewerker wel mogelijk is. Bij gerede twijfel of het fysiek dan wel als gevolg van een tijdelijke verhindering onmogelijk is om twee vingerafdrukken op te nemen, kan van de aanvrager worden verlangd, dat deze daartoe een door een bevoegde arts of medische instelling ondertekende verklaring overlegt. Indien van de aanvrager geen vingerafdrukken worden opgenomen, wordt in de aanvraag vermeld of dit permanent of tijdelijk is.", + "risks": "Er is geen basisbeveiligingstoets afgenomen", + "performance_standard": "De absolute foutenpercentages werden gemeten over een zeer groot vast corpus van operationele vingerbeelden (zie voor meer gedetailleerde informatie in NIST Interagency Report 8382).", + "create_dt": "2023-03-31 08:34:12.421495+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "67311486", + "owner": "rijksdienst-voor-identiteitsgegevens", + "leverancier_id": null + }, + { + "name": "Identiteitsverificatie op basis van vingerafdruk", + "organization": "Rijksdienst voor Identiteitsgegevens (RvIG)", + "department": "Directie Informatievoorziening en Systemen, afdeling Reisdocumentensystemen", + "description_short": "Het proces van identiteitsverificatie", + "type": "Zelflerend", + "category": "Basisregistratie", + "website": "\u00a0", + "status": "In gebruik", + "goal": "Wordt ingezet als technische ondersteuning voor het verifi\u00ebren of twee vingerafdrukken afkomstig van \u00e9\u00e9n en dezelfde vinger van \u00e9\u00e9n en dezelfde persoon zijn", + "impact": "Ministerie van Binnenlandse Zaken en Koninkrijkrelaties doet momenteel een onderzoek naar de prestatie van vingerafdrukvergelijking op basis van de vingerafdrukken zoals afgenomen en opgeslagen in een reisdocument. Het onderzoek moet uitwijzen of de vingerafdrukkwaliteit en de huidig ge\u00efnstalleerde hard- en software voldoen om de identiteit burgers op betrouwbare wijze te kunnen verifi\u00ebren.", + "proportionality": "Vingerafdrukken worden ingezet voor identiteitsverificatie alleen als er na de verificatie van de authenticiteit van het reisdocument en de identiteit van de houder na inzetten van gezicht opname verificatie enige twijfel bestaat om de authenticiteit van het document en de identiteit van de houder te bevestigen (zie overweging 19 van verordening 2019/1157). Het inzetten van vingerafdrukken voor identiteitsverificatie samen met gezicht vergelijking, vormt een passende combinatie van betrouwbare identificatie en authenticatie met een lagere fraudegevoeligheid, waarmee reisdocumenten beter kunnen worden beveiligd.", + "decision_making_process": "\u00a0", + "documentation": "Uitvoeringswet Algemene verordening gegevensbescherming: wetten.nl - Informatie - Uitvoeringswet Algemene verordening gegevensbescherming - BWBR0040940 (overheid.nl) Paspoortverordening (Verordening (EG) nr. 2252/2004): https://eur-lex.europa.eu/legal-content/NL/TXT/PDF/?uri=CELEX:32004R2252\nVerordening identiteitskaarten EU 2019/1157: EUR-Lex - 32019R1157 - EN - EUR-Lex (europa.eu)", + "competent_authority": "Ministerie van Binnenlandse Zaken en Koninkrijkrelaties, Rijksdienst voor Identiteitsgegevens", + "lawful_basis": "De juridische basis voor zowel het eerste als het tweede geval liggen in de Verordening (EG) 2252/2004* en de Verordening (EU) 2019/1157** . Deze verordeningen bepalen onder andere dat de op te nemen vingerafdrukken in paspoorten, reisdocumenten en identiteitskaarten alleen gebruikt kunnen worden ter verificatie van: a) de authenticiteit van het document en b) de identiteit van de houder. De bepalingen zijn verankerd in nationale wetgeving, namelijk in artikel 3 van de Paspoortwet in samenhang met de daaronder liggende regelgeving:\n1. Ten aanzien van het eerste geval waarin het algoritme wordt ingezet (kwaliteitsvergelijking) beschrijft artikel 28a van de Paspoortuitvoeringsregeling Nederland 2001 op welke wijze de vingerafdrukken van de aanvrager van een reisdocument worden opgenomen en in welke gevallen daarvan kan worden afgezien. De kwaliteit van de opgenomen vingerafdruk(ken) is daarin cruciaal (lid 2-3)***.\n2. Dat het algoritme kan worden ingezet voor identiteitsverificatie bij uitreiking is verwoord in artikel 4.6 van het Paspoortbesluit.\nMet de inzet van het algoritme worden biometrische gegevens en daarmee bijzondere persoonsgegevens verwerkt in de zin van de Algemene Verordening Gegevensbescherming (AVG). De AVG stelt in principe een verbod op het verwerken van bijzondere persoonsgegevens. De nationale wetgever heeft echter gebruik gemaakt van de ruimte voor lidstaten om uitzonderingen te cre\u00ebren voor de verwerking van bijzondere persoonsgegevens om redenen van algemeen belang (artikel 9 lid 2 AVG). Op grond van artikel 29 van de Uitvoeringswet AVG is verwerking van biometrische gegevens met oog op de unieke identificatie toegestaan indien de verwerking noodzakelijk is voor authenticatie en beveiligingsdoeleinden.\n\n* Artikel 4 lid 3 van de Verordening (EG) 2252/2004 van de Raad van 13 december 2004 betreffende normen voor de veiligheidskenmerken van en biometrische gegevens in door de lidstaten afgegeven paspoorten en reisdocumenten.\n ** Artikel 11 lid 6 van de Verordening (EU) 2019/1157 van het Europees Parlement en de Raad van 20 juni 2019 betreffende de versterking van de beveiliging van identiteitskaarten van burgers van de Unie en van verblijfsdocumenten afgegeven aan burgers van de Unie en hun familieleden die hun recht van vrij verkeer uitoefenen.\n *** Zie ook artikel 40a van de Paspoortuitvoeringsregeling Caribische landen en artikel 42a van de Paspoortuitvoeringsregeling Buitenland 2001.", + "iama": null, + "iama_description": null, + "dpia": "Nee", + "dpia_description": "\u00a0", + "objection_procedure": "\u00a0", + "standard_version": "0.1.0", + "uuid": "\u00a0", + "url": "\u00a0", + "contact_email": "info@rvig.nl", + "area": "Nederland", + "lang": "Nederlands", + "revision_date": "2022-11-24 00:00:00", + "description": "Vergelijkingsalgoritme wordt ingezet in de volgende gevallen:\n\n1. Kwaliteitsvergelijking tijdens het afnameproces van vingerafdrukken voor opname in een reisdocument. In dit proces worden maximaal drie vingerafdrukkenopnames van \u00e9\u00e9n en dezelfde vinger van \u00e9\u00e9n en dezelfde persoon gedaan om zorg te dragen dat er vingerafdrukken met een zo hoog mogelijk kwaliteit in de chip van het reisdocument worden opgenomen. De tweede en de derde opname van de vinger wordt tegen de eerste opname geverifieerd om zorg te dragen dat er \u00e9\u00e9n en dezelfde vinger van \u00e9\u00e9n en dezelfde persoon wordt afgenomen.\n\n2. Vergelijking van ter plekke afgenomen vingerafdruk(ken) tegen de vingerafdruk(ken) die zijn opgenomen in de chip van de houder van het reisdocument. Dit is mogelijk tijdens het uitlezen van een reisdocument wanneer een houder van een reisdocument verzoekt om inzage van de gegevens in de chip van zijn of haar reisdocument, bij controle van een mogelijk defecte chip of indien er wordt getwijfeld aan de identiteit van de persoon bij uitreiking.", + "application_url": "\u00a0", + "publiccode": "\u00a0", + "mprd": "\u00a0", + "source_data": "\u00a0", + "methods_and_models": "Een algoritme voor het matchen van vingerafdrukken vergelijkt twee vingerafdrukbeelden en geeft een binaire beslissing van overeenkomst of geen overeenkomst.", + "monitoring": "Afdeling Reisdocumentensystemen van Rijksdienst voor Identiteitsgegevens voert uit de acceptatie testen op het algoritme na elke grote wijziging in het aanvraagstation (zoals bijvoorbeeld hardware en software vervanging). ", + "human_intervention": "Het verificatieproces wordt gemonitord en uitgevoerd onder de begeleiding van de daartoe aangewezen medewerker. Deze medewerker controleert onder andere: i) visueel de vingertoppen van de aanvrager op tekenen van prothesen, valse vingerafdrukken of schade die opzettelijk kan zijn en ii) of de aanvrager geen vingers onjuist, noch opzettelijk, noch onopzettelijk presenteert of vingers of handen verwisselt", + "risks": "Er is geen basisbeveiligingstoets afgenomen", + "performance_standard": "Er wordt gebruik gemaakt van Detection Error Trade-off (DET) en Area Under the Curve (AUC). De belangrijkste beordeelingscriteria worden beheerd met False Rejection Rate en False Acceptance Rate op operationele drempels.", + "create_dt": "2023-03-31 08:34:12.426362+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "68796525", + "owner": "rijksdienst-voor-identiteitsgegevens", + "leverancier_id": null + }, + { + "name": "Bestands Controle Module (BCM)", + "organization": "Rijksdienst voor Identiteitsgegevens (RvIG)", + "department": "Directie Uitvoering, afdeling Kwaliteit & Ontwikkeling", + "description_short": "Het algoritme controleert of de opgenomen gegevens in een persoonslijst voldoen aan de vereisten in het Logisch Ontwerp BRP voor de structuur en inhoud van deze opgenomen gegevens (Structuur en Domeincontroles). Daarnaast zijn controles die nagaan of de opgenomen gegevens voldoen aan de wettelijke voorschriften zoals opgenomen in bijvoorbeeld de Wet BRP en het Burgerlijk Wetboek (Logische controles).", + "type": "Signalerend algoritme", + "category": "Basisregistratie", + "website": "Kwaliteitsmonitor, alleen toegankelijk voor gemeenten via beveiligde verbinding (gemnet en diginetwerk).", + "status": "In gebruik", + "goal": "Signaleren van (mogelijke) afwijkingen in opgenomen gegevens aan gemeenten. Gemeenten zijn zelf verantwoordelijk voor de kwaliteit en inhoud van de opgenomen gegevens en alleen zij kunnen gegevens wijzigen (van de eigen ingezetenen). Resultaten van de BCM-run van eind november van een jaar worden gebruikt voor de (wettelijk verplichte) zelfevaluatie BRP door gemeenten.", + "impact": "Afwijkingen/fouten in opgenomen gegevens kunnen van invloed zijn op de burger. Geautoriseerde afnemers van BRP-gegevens kunnen aan de hand van onjuiste gegevens op een persoonslijst de verkeerde conclusies verbinden aan deze gegevens.", + "proportionality": "De inzet van het algoritme is een kosteneffectieve manier om de kwaliteit van de BRP te borgen. Handmatige controle op ruim 3.000 regels zou een zeer arbeidsintensief proces voor gemeenten zijn. Doordat een pre-run uitgevoerd wordt is de kans dat onterechte bevindingen worden gegenereerd, die een negatieve impact hebben op de burger, zeer klein. Doordat gemeenten op de hoogte gebracht worden van afwijkingen en zij onjuiste gegevens corrigeren, is de positieve impact op de burger groot.", + "decision_making_process": "Bij iedere wijziging van het Logisch Ontwerp BRP en/of wijzigingen in de van toepassing zijnde wet- en regelgeving wordt nagegaan of er nieuwe regels toegevoegd moeten worden en/of dat bestaande regels gewijzigd moeten worden. Daarnaast kunnen door geautoriseerde afnemers van BRP-gegevens en gemeenten ook afwijkingen in persoonslijsten gemeld worden waarop nog niet gecontroleerd wordt door de BCM. Deze controles worden zo snel mogelijk toegevoegd aan de BCM als het om afwijkingen gaat waarop een controle mogelijk is. Het gaat daarbij altijd om fouten die door een gemeente hersteld zouden moeten worden. De gemeenten zijn zelf verantwoordelijk voor het oplossen van de fouten in persoonslijsten van de eigen ingezetenen.", + "documentation": "In de kwaliteitsmonitor is voor de geautoriseerde gemeenten per controleregel een definitie van de afwijking en een mogelijke oplossingsrichting opgenomen.", + "competent_authority": "Ministerie van Binnenlandse Zaken en Koninkrijkrelaties", + "lawful_basis": "Artikel 4.3 Wet BRP en Artikel 47 Besluit BRP: \u201cDe uitvoering van deze onderzoeken geschiedt met behulp van een door Onze Minister beschikbaar gesteld evaluatie-instrument\u201d. Dat evaluatie-instrument is de KWM en de BCM maakt daar onderdeel van uit. ", + "iama": null, + "iama_description": null, + "dpia": "Nee", + "dpia_description": "Er wordt gevalideerd of DPIA voor BCM is vereist.", + "objection_procedure": "Output gaat alleen naar gemeenten en heeft een signalerende functie. Gemeente bepaalt zelf of zij al dan niet wijzigingen/correcties willen/kunnen aanbrengen in de gegevens rekening houdend met de voorschriften uit de van toepassing zijnde wet- en regelgeving. ", + "standard_version": "0.1.0", + "uuid": "\u00a0", + "url": "\u00a0", + "contact_email": "info@rvig.nl", + "area": "Nederland", + "lang": "Nederlands", + "revision_date": "2022-10-13 00:00:00", + "description": "De controleregels van de BCM maken deel uit van de jaarlijkse zelfevaluatie BRP die door gemeente uitgevoerd moet worden. Voor het onderzoek maken de gemeenten gebruik van het door RvIG beschikbaar gestelde evaluatie-instrument: de kwaliteitsmonitor (KWM). Deze bevat de digitale vragenlijst Basisregistratie Personen (BRP), de bestandscontrolemodule (BCM) en de inhoudelijke controle persoonslijsten aan de hand van brondocumenten (IHC). De resultaten van de BCM-run van eind november van een jaar worden opgenomen in het uittreksel en de managementrapportage zelfevaluatie van de betreffende gemeente (art 21 Regeling BRP).\nOm gemeenten in de gelegenheid te stellen de kwaliteit van de opgenomen gegevens te bewaken en mogelijke afwijkingen zo snel mogelijk te herstellen wordt ook maandelijks een BCM-run gedraaid en gepubliceerd in de KWM. Gemeenten houden hierdoor zicht op de kwaliteit van de gegevens van de eigen ingezetenen.\nVoor de zelfevaluatie BRP is een normenkader aanwezig waarin de afwijkingen opgedeeld zijn in 3 groepen zoals bedoeld in artikel 2.7 Wet BRP:\n\n\u2022 Groep 1: De afwijkingen betreffend de algemene gegevens over burgerlijke staat en adres, onderverdeeld in klasse A (Persoon en Overlijden), klasse B (Adres), klasse C (Relaties)\n\u2022 Groep 2: De afwijkingen in de overige algemene gegevens, onderverdeeld in klasse D (Identificatienummers en Nationaliteit), klasse E (Overige Algemeen)\n\u2022 Groep 3: De afwijkingen betreffende de administratieve gegevens, klasse F (Administratief)\n\nPer klasse is de norm vastgesteld op:\n\u2022 Klasse A: 99,70%\n\u2022 Klasse B: 99,70%\n\u2022 Klasse C: 99,60%\n\u2022 Klasse D: 99,50%\n\u2022 Klasse E: 99,50%\n\u2022 Klasse F: 99,40%", + "application_url": "\u00a0", + "publiccode": "\u00a0", + "mprd": "Ja", + "source_data": "BRP-V", + "methods_and_models": "De controles (ruim 3000) zijn opgenomen in een exelsheet die door de BCM gebruikt wordt bij de uitvoer van de controle. De controles zijn gedefinieerd conform paragraaf 3.1.1 Syntax van de voorwaarderegels in het Logisch Ontwerp BRP. De output van een controle wordt beoordeeld op juistheid door een medewerker van K&O en, indien goedgekeurd, gepubliceerd in de KWM. Maandelijks wordt een controle uitgevoerd voor alle gemeenten in Nederland en jaarlijks wordt voor de zelfevaluatie BRP en RNI een aparte controle uitgevoerd. ", + "monitoring": "Door de afdeling Monitoring bij specifieke afwijkingen, bijvoorbeeld doordat ten onrechte geen koppeling is gelegd met het Basisregister Adressen en Gebouwen (BAG).", + "human_intervention": "Voorafgaand aan iedere controlerun wordt eerst een pre-run uitgevoerd die beoordeeld wordt op juistheid. Indien een controleregel (tevens) onterechte bevindingen genereert zal deze regel aangepast worden of (tijdelijk) uit productie gehaald worden. Ook de definitieve run wordt, voorafgaand aan publicatie, eerst beoordeeld. In uitzonderlijke gevallen, als een bepaalde controleregel toch nog onterechte bevindingen genereert, kunnen de gegevens van deze controle voorafgaand aan publicatie uitgefilterd worden. ", + "risks": "\u00a0", + "performance_standard": "\u00a0", + "create_dt": "2023-03-31 08:34:12.430961+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "31747325", + "owner": "rijksdienst-voor-identiteitsgegevens", + "leverancier_id": null + }, + { + "name": "Profiel Bewoningsgraad Landelijke Aanpak Adreskwaliteit (LAA)", + "organization": "Rijksdienst voor Identiteitsgegevens (RvIG)", + "department": "Directie Uitvoering, afdeling Onderzoek & Analyse", + "description_short": "Met het profiel Bewoningsgraad wordt het aantal inschrijvingen in de BRP op \u00e9\u00e9n woonadres vergeleken met de woonoppervlakte van dat adres. Om dit vast te stellen wordt de oppervlakte van de woonruimte, zoals vastgelegd in de Basisregistratie Adressen en Gebouwen (BAG), gedeeld door het aantal bewoners dat staat ingeschreven op het adres. Woonadressen waar de oppervlakte per ingeschrevene op het woonadres kleiner is dan een bepaald aantal vierkante meter, worden geselecteerd voor nader adresonderzoek. Bij dit aantal is er twijfel over de juistheid van de registratie in de BRP op dit adres.", + "type": "Beschrijvend", + "category": "Basisregistratie", + "website": "https://www.rvig.nl/brp/landelijke-aanpak-adreskwaliteit-laa", + "status": "In gebruik", + "goal": "Het doel van dit algoritme is om potenti\u00eble risicoadressen te selecteren op basis van gerede twijfel en deze aan gemeenten te leveren voor nader adresonderzoek. Op basis van deze adresonderzoeken worden onjuiste adresgegevens gecorrigeerd, zodat overheidsorganen op basis van juiste informatie hun publieke taken kunnen uitvoeren.", + "impact": "Als een onderzoek naar inschrijving van personen op het adres plaats gaat vinden, wordt er huisbezoek op het adres gedaan.", + "proportionality": "Het effici\u00ebnt en zo effectief mogelijk vinden van adressen waar de kans van incorrecte inschrijvingen op adressen zo groot mogelijk is (de trefkans is minimaal 50%) en deze inschrijvingen corrigeren. Met behulp van het algoritme kun je prioriteit geven aan adressen waarbij de kans groter dan 50% is dat er iets niet klopt in de registratie en zorg je er tegelijkertijd voor dat je niet onnodig bij burgers aan de deur komt. Er is bij dit algoritme geen sprake van automatische besluitvorming; er is altijd menselijke tussenkomst door de ambtenaar van de gemeente.", + "decision_making_process": "\u00a0", + "documentation": "\u00a0", + "competent_authority": "Ministerie van Binnenlandse Zaken en Koninkrijkrelaties", + "lawful_basis": "In de wet BRP is vastgelegd dat de Minister van Binnenlandse Zaken en Koninkrijkrelaties de gemeente ondersteunt bij het onderzoek of de adresregistratie in de BRP van personen klopt.\n\nDe Minister van Binnenlandse Zaken en Koninkrijkrelaties mag hiervoor persoonsgegevens verwerken. Deze persoonsgegevens mag de Minister van Binnenlandse Zaken en Koninkrijkrelaties analyseren aan de hand van een profiel.\n\nIn regelgeving is uitgewerkt welke gegevens mogen worden gebruikt en welke waarborgen moeten worden nageleefd bij de ontwikkeling van het profiel (waaronder de menselijke tussenkomst).\n\nVoordat het profiel landelijk in gebruik wordt genomen wordt de werking ervan eerst getest met een klein aantal gemeenten. Bekeken wordt of het profiel doet wat het doen moet en of de trefkans voldoende is.\n\nAls het profiel in gebruik is, wordt hij regelmatig ge\u00ebvalueerd en wordt bekeken of het profiel nog altijd voldoet aan de verwachtingen. Als dat niet meer het geval is, wordt het profiel aangepast of niet meer gebruikt. ", + "iama": null, + "iama_description": null, + "dpia": "Nee", + "dpia_description": "Het rapport Privacy Impact Assessment (PIA; gegevensbeschermingseffectbeoordeling) van de Landelijke Aanpak Adreskwalitit (LAA) van de BRP (Basisregistratie Personen) staat op Rijksoverheid.nl. Deze wordt toegevoegd na het uitvoeren van de DPIA", + "objection_procedure": "\u00a0", + "standard_version": "0.1.0", + "uuid": "\u00a0", + "url": "\u00a0", + "contact_email": "info@rvig.nl", + "area": "Nederland", + "lang": "Nederlands", + "revision_date": "2022-06-01 00:00:00", + "description": "De adressen moeten voor het profiel Bewoningsgraad voldoen aan onderstaande criteria:\n\nAdressen waarbij de gemiddelde woonoppervlakte per BRP- inschrijving een bepaald aantal vierkante meter of minder is.\nAdressen die in de BAG (Basisregistratie Adressen en Gebouwen) geregistreerd staan als verblijfsobject met de status \u2018in gebruik\u2019 of \u2018in gebruik \u2013 niet ingemeten\u2019. Standplaatsen en ligplaatsen worden hiervan uitgesloten.\nAdressen waarbij minimaal 3 personen, die geen familierelatie met elkaar hebben, staan ingeschreven in de BRP.\nAdressen die van selectie worden uitgesloten:\n\nAdressen die volgens de BAG zowel de gebruiksfunctie \u2018Gezondheidsfunctie\u2019, \u2018Logiesfunctie\u2019 en \u2018\u00c7elfunctie\u2019 hebben.\nAdressen waarbij alle personen een familierelatie met elkaar hebben: dezelfde achternaam, of inschrijvingsdatum en adressen waarbij alle personen op het adres dezelfde geslachtsnaam hebben, behalve een volwassen vrouw die 18 jaar of ouder is.\nAdressen waar meer dan een bepaald aantal personen in de BRP staan ingeschreven.\nAdressen waarbij de oppervlakte van de woonruimte volgens de BAG 1m2 is.\nAdressen waar meer dan een bepaald aantal personen staat ingeschreven (ongeacht of het gaat om een woonadres of een briefadres) en die volgens de BAG de gebruiksfunctie \u2018Bijeenkomstfunctie\u2019 of \u2018Logiesfunctie\u2019 hebben.", + "application_url": "\u00a0", + "publiccode": "\u00a0", + "mprd": "Ja", + "source_data": "Input gegevens vanuit de BRP:\n\nGemeentecode;\nAdres (postcode, huisnummer, huisletter en huisnummertoevoeging (laatste 3 zijn gepseudonimiseerd));\nFunctie adres (woonadres of briefadres);\nA-nummer (gepseudonimiseerd);\nGeslachtsnaam (gepseudonimiseerd);\nGeslacht;\nAantal gezinnen (op basis van de definitie van een entiteit: echtgenoten, geregistreerde partners dan wel bloed- of aanverwanten in de eerste graad, behoren tot dezelfde entiteit);\nInschrijvingsdatum van een persoon op het adres;\nGeboortedatum;\nDatum overlijden (wordt gebruik om personen die zijn overleden uit te sluiten);\nAangifte adreshouding.\nInput gegevens vanuit de BAG:\n\nGebruiksdoel(-en) van het verblijfsobject;\nOppervlakte.\nDaarna worden aanvullende gegevens verwerkt om de selectie te verfijnen:\n\nVan alle personen die volgens de BRP op het adres staan ingeschreven:\n\nActueel:\n\nA-nummer\nBurgerservicenummer (BSN)\nGeslachtsnaam\nGeboortedatum\nGeslachtsaanduiding\nAfnemersindicatie\nIndien van toepassing:\n\nVoornamen\nLandcode\nDatum ingang blokkering persoonslijst\nDatum opschorting bijhouding persoonslijst\nOmschrijving reden opschorting bijhouding (bijvoorbeeld of iemand is overleden of ge\u00ebmigreerd)\nAanduiding gegevens in onderzoek\nDatum ingang onderzoek en/of datum einde onderzoek\nDatum verificatie (de datum waarop de verificatie van gegevens op de persoonslijst in de Registratie Niet-ingezetene (RNI) heeft plaatsgevonden)\nOmschrijving verificatie (omschrijving op welke wijze de verificatie van gegevens op de persoonslijst in de RNI, heeft plaatsgevonden)\nRNI-deelnemer\nOmschrijving verdrag\nOf de status van de persoon in de BRP momenteel \u2018Vertrokken Onbekend Waarheen\u2019 (VOW) is, en zo ja de datum waarop de persoon VOW is gegaan\nOf de persoon eerder VOW is geweest\nActueel en voorlaatste BRP-registratie:\n\nGemeente van inschrijving\nInschrijvingsdatum van een persoon in de gemeente\nFunctie adres (om te bepalen of het gaat om een briefadres of een woonadres)\nInschrijvingsdatum van een persoon op het adres\nStraatnaam, huisnummer, huisletter en huisnummertoevoeging\nAanduiding bij huisnummer)\nPostcode en woonplaats\nIdentificatiecode verblijfplaats\nIdentificatiecode nummeraanduiding\nOmschrijving van de aangifte adreshouding\nIngangsdatum geldigheid van de gegevens\nDatum van opneming\nAanduiding gegevens in onderzoek\nIndicatie onjuist, dan wel strijdigheid met de openbare orde\nVan alle personen die volgens de BRP op het adres staan ingeschreven worden de volgende gegevens verwerkt van hun ouders, als deze informatie beschikbaar is in de BRP:\n\nA-nummer\nGeslachtsnaam\nGeboortedatum\nIndien van toepassing:\n\nVoornamen\nBurgerservicenummer\nAanduiding gegevens in onderzoek\nVan alle personen die volgens de BRP op het adres staan ingeschreven worden de volgende gegevens verwerkt van hun huidige en ex-partner(s), als deze informatie beschikbaar is in de BRP:\n\nA-nummer\nGeslachtsnaam\nGeboortedatum\nDatum huwelijkssluiting / aangaan geregistreerd partnerschap\nDatum ontbinding huwelijk / geregistreerd partnerschap\nIndien van toepassing:\n\nVoornamen\nBurgerservicenummer (BSN)\nAanduiding gegevens in onderzoek\nVerder worden binnen dit profiel de volgende gegevens verwerkt vanuit de BAG:\n\nPostcode\nHuisnummer\nHuisnummertoevoeging\nIndicatie hoofd/nevenadres\nOppervlakte\nGebruiksdoel\nStatus\nBouwjaar\nHistorie gebruiksdoel", + "methods_and_models": "Beslisboom algoritme", + "monitoring": "Het algoritme wordt maandelijks ge\u00ebvalueerd door het meten van trefkans na de adresonderzoeken die door gemeenten zijn uitgevoerd. Alle LAA-profielen worden regelmatig ge\u00ebvalueerd met het oog op de vraag of zij nog werken, aangepast moeten worden of hun effectiviteit hebben verloren en niet meer gebruikt moeten worden. Op die manier wordt getracht de privacy impact op de Nederlandse burger zo klein mogelijk te houden. Een dergelijke evaluatie wordt minimaal drie keer per jaar gedaan in samenwerking met de samenwerkingspartners (gemeenten en afnemers).", + "human_intervention": "Er is geen sprake van automatische besluitvorming. De beoordeling en beslissingen worden altijd door mensen gedaan. Algoritmes zijn een middel en zijn niet leidend. Tijdens het ontwikkelen van alle LAA-algoritmen is advies gevraagd aan een representatieve vertegenwoordiging van gemeenten.", + "risks": "De persoonlijke levenssfeer komt mogelijk in het gedrang, door het verwerken van persoonsgegevens en het afleggen van een huisbezoek door gemeenten.", + "performance_standard": "De trefkans is minimaal 50%", + "create_dt": "2023-03-31 08:34:12.435499+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "38773626", + "owner": "rijksdienst-voor-identiteitsgegevens", + "leverancier_id": null + }, + { + "name": "Profiel Doorgangsadres Landelijke Aanpak Adreskwaliteit (LAA)", + "organization": "Rijksdienst voor Identiteitsgegevens (RvIG)", + "department": "Directie Uitvoering, afdeling Onderzoek & Analyse", + "description_short": "Bij adressen waar gedurende de afgelopen korte periode op verschillende momenten inschrijvingen plaatsvinden, kan gerede twijfel bestaan of er wel daadwerkelijk verhuizingen hebben plaatsgevonden en daarmee of de adreswijzigingen in de Basisregistratie Personen (BRP) wel correct zijn. Het kan hier gaan om zogenoemde doorgangsadressen. Dit zijn adressen waar men geen feitelijk verblijf houdt maar slechts worden gebruikt voor zogenaamde \u2018administratieve verhuizingen\u2019. Woonadressen waarop veel inschrijvingen afgelopen periode plaats vinden worden op basis van dit profiel geselecteerd voor nader adresonderzoek", + "type": "Beschrijvend", + "category": "Basisregistratie", + "website": null, + "status": "In gebruik", + "goal": "Het doel van dit algoritme is om potenti\u00eble risicoadressen te selecteren op basis van gerede twijfel aan de juistheid van de inschrijvingen op het adres en deze aan gemeenten te leveren voor nader adresonderzoek. Op basis van deze adresonderzoeken worden onjuiste adresgegevens gecorrigeerd, zodat overheidsorganen die gebruik maken van gegevens uit de BRP op basis van juiste informatie hun publieke taken kunnen uitvoeren.", + "impact": "Als een onderzoek naar inschrijving van personen op het adres plaats gaat vinden, wordt er een huisbezoek op het adres gedaan. De persoonlijke levenssfeer komt mogelijk in het gedrang tijdens een adresbezoek door gemeenten. Gegevens als bijvoorbeeld het gebruik van een naam zijn noodzakelijk voor het adresonderzoek om gezinsverbanden vast te kunnen stellen en om burgers aan te schrijven om hen te informeren over het adresonderzoek. ", + "proportionality": "De juistheid van (adres)gegevens in de BRP is essentieel voor het functioneren van de Nederlandse overheid. Een overheid die zijn burgers niet kent of niet weet te vinden, is niet in staat om de taken te verrichten die door de burgers aan haar zijn toevertrouwd. Het is in veel gevallen een randvoorwaarde voor het correct uitvoeren van wettelijke regelingen en voor de effectiviteit van overheidsbeleid. Voor de burger is een juiste registratie van belang voor zijn correspondentie met de overheid en om aanspraak te kunnen maken op adres-gerelateerde overheidsvoorzieningen.\nIn regelgeving is uitdrukkelijk opgenomen welke gegevens mogen worden gebruikt bij het algoritme. Gegevens die niet worden genoemd mogen dus niet worden gebruikt. Ook worden er geen (persoons)gegevens gebruikt die tot discriminatie kunnen leiden. Er wordt niet geselecteerd op nationaliteit, geboorteplaats of afgeleiden daarvan.\nDe inzet van het algoritme is een kosteneffectieve manier om de kwaliteit van de BRP te borgen. Met behulp van het algoritme kun je prioriteit geven aan adressen waarbij de kans groter dan 50% is dat er iets niet klopt in de registratie en zorg je er tegelijkertijd voor dat je niet onnodig bij burgers aan de deur komt. Er is bij dit algoritme geen sprake van automatische besluitvorming; er is altijd menselijke tussenkomst door de ambtenaar van de gemeente", + "decision_making_process": "\u00a0", + "documentation": "https://www.rvig.nl/brp/landelijke-aanpak-adreskwaliteit-laa", + "competent_authority": "Ministerie van Binnenlandse Zaken en Koninkrijkrelaties", + "lawful_basis": "In de wet BRP is vastgelegd dat de Minister van Binnenlandse Zaken en Koninkrijkrelaties de gemeente ondersteunt bij het onderzoek of de adresregistratie in de BRP van personen klopt.\n\nDe Minister van Binnenlandse Zaken en Koninkrijkrelaties mag hiervoor persoonsgegevens verwerken. Deze persoonsgegevens mag de Minister van Binnenlandse Zaken en Koninkrijkrelaties analyseren aan de hand van een profiel.\n\nIn regelgeving is uitgewerkt welke gegevens mogen worden gebruikt en welke waarborgen moeten worden nageleefd bij de ontwikkeling van het profiel (waaronder de menselijke tussenkomst).\n\nVoordat het profiel landelijk in gebruik wordt genomen wordt de werking ervan eerst getest met een klein aantal gemeenten. Bekeken wordt of het profiel doet wat het doen moet en of de trefkans voldoende is.\n\nAls het profiel in gebruik is, wordt hij regelmatig ge\u00ebvalueerd en wordt bekeken of het profiel nog altijd voldoet aan de verwachtingen. Als dat niet meer het geval is, wordt het profiel aangepast of niet meer gebruikt. ", + "iama": null, + "iama_description": null, + "dpia": "Nee", + "dpia_description": "n.v.t.", + "objection_procedure": "\u00a0", + "standard_version": "0.1.0", + "uuid": "\u00a0", + "url": "\u00a0", + "contact_email": "info@rvig.nl", + "area": "Nederland", + "lang": "Nederlands", + "revision_date": "2022-11-24 00:00:00", + "description": "De adressen moeten voor het profiel Doorgangsadres voldoen aan onderstaande criteria:\n\u2022 Op de adressen hebben de afgelopen jaar op minimaal 3 verschillende dagen inschrijvingen in de BRP plaatsgevonden als woonadres.\n\u2022 Op de adressen hebben de afgelopen 3 jaar op meer verschillende dagen inschrijvingen in de BRP plaatsgevonden.\nVan de adressen die overblijven worden de volgende adressen uitgesloten:\n\u2022 Adressen die volgens de Basisregistratie Adressen en Gebouwen (BAG) zowel de gebruiksfunctie \u2018Gezondheidsfunctie\u2019 als \u2018Logiesfunctie\u2019 hebben.\n\u2022 Adressen waar op dit moment 1 of 2 entiteiten staan ingeschreven (echtgenoten, geregistreerde partners dan wel bloed- of aanverwanten in de eerste graad, behoren tot dezelfde entiteit).\n\u2022 Adressen waar minimaal 20 personen in de BRP staan ingeschreven.\n\u2022 Adressen waar minimaal 10 personen staan ingeschreven (ongeacht of het gaat om een woonadres of een briefadres) en die volgens de basisregistratie adressen en gebouwen (BAG) de gebruiksfunctie \u2018Bijeenkomstfunctie\u2019 of \u2018Logiesfunctie\u2019 hebben.\n\u2022 Adressen die volgens de BAG alleen de gebruiksfunctie \u2018Celfunctie\u2019 of \u2018Gezondheidsfunctie\u2019 hebben.", + "application_url": "\u00a0", + "publiccode": "\u00a0", + "mprd": "Ja", + "source_data": "\u2022 Gegevens over de burgerlijke staat:\n- Naam \u2013 Geslachtsnaam, Voornamen;\n- Geboorte - Geboortedatum\n- Geslacht\n- Ouders \u2013 Geslachtsnaam, Voornamen, Geboortedatum;\n- Huwelijk dan wel geregistreerd partnerschap en eerdere huwelijken of eerdere geregistreerde partnerschappen - Aanduiding huwelijk of geregistreerd partnerschap; Datum huwelijkssluiting of datum aangaan geregistreerd partnerschap; Huwelijksontbinding of ontbinding geregistreerd partnerschap en reden daarvan, dan wel nietigverklaring huwelijk of geregistreerd partnerschap; Datum ontbinding, dan wel nietigverklaring huwelijk of geregistreerd partnerschap\n- Echtgenoot dan wel geregistreerd partner en eerdere echtgenoten of geregistreerde partners \u2013 Geslachtsnaam, Voornamen, Geboortedatum;\n- Kinderen \u2013 Geslachtsnaam, Voornamen, Geboortedatum\n- Overlijden \u2013 Overlijdensdatum\n- Data ingang en be\u00ebindiging rechtsgeldigheid gegevens - Datum ingang rechtsgeldigheid; Datum be\u00ebindiging rechtsgeldigheid\n\u2022 Gegevens over de bijhoudingsgemeente en het adres in die gemeente alsmede over het verblijf in Nederland en het vertrek uit Nederland\n- Bijhoudingsgemeente \u2013 Gemeente; Datum aanvang adreshouding in de gemeente\n- Adres - Functie van het adres; Gemeente; Woonplaats; Straatnaam en zo nodig deel van een gemeente; Huisnummer; Locatie ten opzichte van adres; Huisletter; Huisnummertoevoeging; Locatiebeschrijving en zo nodig deel van een gemeente; Postcode; Datum aanvang adreshouding; Datum ingang rechtsgeldigheid\n- Vertrek uit Nederland - Datum vertrek; Volgend land of gebied van verblijf;\n\u2022 Gegevens over het woonadres van de niet-ingezetene - Datum ingang rechtsgeldigheid; Datum be\u00ebindiging rechtsgeldigheid;\n\u2022 Gegevens over het burgerservicenummer van de ingeschrevene - Burgerservicenummer ingeschrevene; Datum van kracht worden van het burgerservicenummer; Datum be\u00ebindiging van het burgerservicenummer;\n\u2022 Gegevens over de burgerservicenummers van de ouders, de echtgenoot dan wel de geregistreerde partner, de eerdere echtgenoten of eerdere geregistreerde partners en de kinderen - Burgerservicenummer ouder; Burgerservicenummer echtgenoot dan wel geregistreerde partner; Burgerservicenummer eerdere echtgenoot; Burgerservicenummer eerdere geregistreerde partner; Burgerservicenummer kind; Data van kracht worden burgerservicenummers; Data be\u00ebindiging burgerservicenummers\n\u2022 Gegevens over het gebruik door de ingeschrevene van de geslachtsnaam van de echtgenoot, de geregistreerde partner, de eerdere echtgenoot of de eerdere geregistreerde partner \u2013 Naamgebruik; Datum ingang van het gegeven over het naamgebruik; Datum be\u00ebindiging van het gegeven over het naamgebruik\n\u2022 Gegevens over het tijdelijk verblijfsadres\n- Tijdelijk verblijfsadres \u2013 Gemeente; Woonplaats; Straatnaam en zo nodig deel van een gemeente; Huisnummer; Huisletter; Huisnummertoevoeging; Postcode; Datum ingang rechtsgeldigheid; Datum be\u00ebindiging rechtsgeldigheid\n\u2022 Gegevens in verband met de inschrijving en de wijziging van de bijhoudingsgemeente betreffende de ingezetene, gegevens in verband met de inschrijving betreffende de niet-ingezetene en gegevens betreffende de wijziging van de bijhoudings-verantwoordelijke betreffende de niet-ingezetene die ingezetene wordt - De hoedanigheid van de persoon die aangifte van verblijf en adres, van adreswijziging, of van vertrek heeft gedaan, dan wel de aantekening dat de gegevens ambtshalve zijn opgenomen; Datum inschrijving in de basisregistratie; Datum blokkering persoonslijst in verband met wijziging van de bijhoudingsverantwoordelijke; Gemeentecode van de gemeente waar de persoonskaart zich bevindt; Aantekening dat alle gegevens over kinderen, die aan de persoonskaart ontleend kunnen worden, op de persoonslijst zijn opgenomen\n\u2022 Gegevens ter aanduiding van akten en andere geschriften waaruit algemene gegevens zijn verkregen\n- Aanduiding van akten van de Nederlandse burgerlijke stand - Nummer van de akte waaraan een algemeen gegeven over de burgerlijke staat is ontleend; Gemeentecode van de gemeente waar de akte in de registers is opgenomen\n- Aanduiding van andere akten en geschriften - Omschrijving van het geschrift waaraan een algemeen gegeven is ontleend; Code van de bijhoudingsverantwoordelijke die het gegeven heeft ontleend; Datum van ontlening\n- Gegevens ter aanduiding van de onjuistheid van een opgenomen algemeen gegeven of van strijd met de Nederlandse openbare orde van een opgenomen gegeven over de burgerlijke staat - Aanduiding van het opgenomen algemeen gegeven dat onjuist is;\n- Gegevens over een onderzoek naar de onjuistheid van een opgenomen algemeen gegeven of de strijdigheid van een opgenomen gegeven over de burgerlijke staat - Aanduiding van de verzameling van gegevens, waarbinnen algemene gegevens zijn opgenomen die onderzocht worden op onjuistheid; Datum aanvang onderzoek; Datum be\u00ebindiging onderzoek; Andere gegevens noodzakelijk in verband met de verwerking van gegevens in de basisregistratie;\n- Gegevens ter aanduiding van de bron waaraan het administrat", + "methods_and_models": "Beslisboom algoritme", + "monitoring": "Het algoritme wordt maandelijks ge\u00ebvalueerd door het meten van de trefkans na de adresonderzoeken die door gemeenten zijn uitgevoerd. Alle LAA-profielen worden regelmatig ge\u00ebvalueerd met het oog op de vraag of zij nog werken, aangepast moeten worden of hun effectiviteit hebben verloren en niet meer gebruikt moeten worden. Op die manier wordt getracht de privacy impact op de Nederlandse burger zo klein mogelijk te houden. Een dergelijke evaluatie wordt minimaal drie keer per jaar gedaan in samenwerking met de samenwerkingspartners (gemeenten en afnemers van de BRP). Tegen een besluit van de gemeente dat leidt tot een aanpassing of wijziging van het adres of tot een uitschrijving, kan bezwaar worden gemaakt bij de gemeente. Een verzoek tot inzage kan worden gedaan in de bij de RvIG aanwezige persoonsgegevens.", + "human_intervention": "Op grond van de Wet BRP zijn nadere regels gesteld over de maatregelen om menselijke tussenkomst te waarborgen bij de ontwikkeling van profielen. Tijdens het ontwikkelen van het algoritme is advies gevraagd aan een representatieve vertegenwoordiging van de gemeenten en aangewezen bestuursorganen. Er worden om die reden geen persoonsgegevens verwerkt (geanalyseerd) voordat dit is besproken met de betrokken partijen. In de meeste gevallen wordt daarnaast ook de Autoriteit Persoonsgegevens (AP) om advies gevraagd.\nEr is geen sprake van automatische besluitvorming. Algoritmes zijn een middel en zijn niet leidend. De beoordeling en beslissingen worden uiteindelijk altijd door mensen gedaan. De gemeente doet, voordat zij een huisbezoek aflegt, altijd nog een eigen adresonderzoek.", + "risks": "De persoonlijke levenssfeer komt mogelijk in het gedrang, door het verwerken van persoonsgegevens en het afleggen van een huisbezoek door gemeenten.", + "performance_standard": "Trefkans is minimaal 50%", + "create_dt": "2023-03-31 08:34:12.440330+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "14116126", + "owner": "rijksdienst-voor-identiteitsgegevens", + "leverancier_id": null + }, + { + "name": "Profiel Herinschrijvingen A Landelijke Aanpak Adreskwaliteit (LAA)", + "organization": "Rijksdienst voor Identiteitsgegevens (RvIG)", + "department": "Directie Uitvoering, afdeling Onderzoek & Analyse", + "description_short": "Het profiel Herinschrijving A selecteert adressen op basis van het aantal beslissingen dat op grond van artikel 2.22, eerste lid, van de Wet BRP is genomen ten aanzien van een ingeschrevene op het adres. Artikel 2.22, eerste lid, betreft de ambtshalve bevoegdheid van het college van B&W van de gemeente tot opschorting van de bijhouding van de persoonslijst van een ingezetene die spoorloos is verdwenen, ook wel bekend als vertrokken onbekend waarheen (VOW\u2019er). Van personen van wie de vorige verblijfplaats tijdelijk onbekend was, is gebleken dat de huidige BRP-registratie vaak niet overeenkomt met de feitelijke situatie. Voor dit profiel komen adressen in aanmerking waar zich in de afgelopen zes maanden \u00e9\u00e9n of meer personen van 18 jaar of ouder hebben ingeschreven die voorheen in de BRP de status VOW hadden. Daarnaast is in ieder geval \u00e9\u00e9n van de personen die op het adres staat ingeschreven ten minste twee keer VOW\u2019er geweest. Verder moet \u00e9\u00e9n van de personen die voorheen VOW\u2019er was zich in het afgelopen jaar op het adres hebben ingeschreven en er nog ingeschreven staan. Deze inschrijvingen mogen zowel op een woonadres als op een briefadres zijn.", + "type": "Beschrijvend", + "category": "Basisregistratie", + "website": null, + "status": "In gebruik", + "goal": "Het doel van dit algoritme is om potenti\u00eble risicoadressen te selecteren op basis van gerede twijfel en deze aan gemeenten te leveren voor nader adresonderzoek. Op basis van deze adresonderzoeken worden onjuiste adresgegevens gecorrigeerd, zodat overheidsorganen op basis van juiste informatie hun publieke taken kunnen uitvoeren.", + "impact": "Als een onderzoek naar inschrijving van personen op het adres plaats gaat vinden, wordt er huisbezoek op het adres gedaan. De persoonlijke levenssfeer komt mogelijk in het gedrang tijdens een adresbezoek door gemeenten. Er wordt niet geselecteerd op nationaliteit, geboorteplaats of afgeleiden daarvan. Gegevens als bijvoorbeeld het gebruik van een naam zijn noodzakelijk voor het adresonderzoek om gezinsverbanden vast te kunnen stellen en om burgers aan te schrijven om hen te informeren over het adresonderzoek. Dit gebruik van iemands naam in de verwerking van data is niet discriminatoir.", + "proportionality": "De juistheid van (adres)gegevens in de BRP is essentieel voor het functioneren van de Nederlandse overheid. Een overheid die zijn burgers niet kent of niet weet te vinden, is niet in staat om de taken te verrichten die door de burgers aan haar zijn toevertrouwd. Het is in veel gevallen een randvoorwaarde voor het correct uitvoeren van wettelijke regelingen en voor de effectiviteit van overheidsbeleid. Voor de burger is een juiste registratie van belang voor zijn correspondentie met de overheid en om aanspraak te kunnen maken op adres-gerelateerde overheidsvoorzieningen.\n\nIn regelgeving is uitdrukkelijk opgenomen welke gegevens mogen worden gebruikt bij het algoritme. Gegevens die niet worden genoemd mogen dus niet worden gebruikt. Ook worden er geen (persoons)gegevens gebruikt die tot discriminatie kunnen leiden. Er wordt niet geselecteerd op nationaliteit, geboorteplaats of afgeleiden daarvan.\n\nHet effici\u00ebnt en zo effectief mogelijk vinden van adressen waar de kans van incorrecte inschrijvingen op adressen zo groot mogelijk is (de trefkans is minimaal 50%) en deze inschrijvingen corrigeren. Met behulp van het algoritme kun je prioriteit geven aan adressen waarbij de kans groter dan 50% is dat er iets niet klopt in de registratie en zorg je er tegelijkertijd voor dat je niet onnodig bij burgers aan de deur komt. Er is bij dit algoritme geen sprake van automatische besluitvorming; er is altijd menselijke tussenkomst door de ambtenaar van de gemeente.", + "decision_making_process": "\u00a0", + "documentation": "https://www.rvig.nl/brp/landelijke-aanpak-adreskwaliteit-laa", + "competent_authority": "Ministerie van Binnenlandse Zaken en Koninkrijkrelaties", + "lawful_basis": "In de wet BRP is vastgelegd dat de Minister van Binnenlandse Zaken en Koninkrijkrelaties de gemeente ondersteunt bij het onderzoek of de adresregistratie in de BRP van personen klopt.\n\nDe Minister van Binnenlandse Zaken en Koninkrijkrelaties mag hiervoor persoonsgegevens verwerken. Deze persoonsgegevens mag de Minister van Binnenlandse Zaken en Koninkrijkrelaties analyseren aan de hand van een profiel.\n\nIn regelgeving is uitgewerkt welke gegevens mogen worden gebruikt en welke waarborgen moeten worden nageleefd bij de ontwikkeling van het profiel (waaronder de menselijke tussenkomst).\n\nVoordat het profiel landelijk in gebruik wordt genomen wordt de werking ervan eerst getest met een klein aantal gemeenten. Bekeken wordt of het profiel doet wat het doen moet en of de trefkans voldoende is.\n\nAls het profiel in gebruik is, wordt hij regelmatig ge\u00ebvalueerd en wordt bekeken of het profiel nog altijd voldoet aan de verwachtingen. Als dat niet meer het geval is, wordt het profiel aangepast of niet meer gebruikt.", + "iama": null, + "iama_description": null, + "dpia": "Nee", + "dpia_description": "n.v.t.", + "objection_procedure": "\u00a0", + "standard_version": "0.1.0", + "uuid": "\u00a0", + "url": "\u00a0", + "contact_email": "info@rvig.nl", + "area": "Nederland", + "lang": "Nederlands", + "revision_date": "2022-11-24 00:00:00", + "description": "De adressen moeten voor het profiel Herinschrijvingen A voldoen aan onderstaande criteria:\n\nDe leeftijd van de VOW\u2019 ers is 18 jaar of ouder.\nEen van de VOW\u2019 ers die er nog staat ingeschreven woont er korter dan 6 maanden.\nOp het adres staat in ieder geval 1 persoon ingeschreven met een woonadres die voor de inschrijving VOW was en in het verleden meerder keer VOW is geweest. Op het moment van inschrijven van deze persoon stond er nog iemand anders ingeschreven op het adres (ongeacht of deze persoon een woon- of briefadres heeft).\nOp het adres wonen momenteel 2 of meer entiteiten. Personen die eerste graad familie zijn, zoals geregistreerd in de BRP, behoren tot dezelfde entiteit.\nVan de adressen die overblijven worden de volgende adressen uitgesloten:\n\nAdressen die volgens de Basisregistratie Adressen en Gebouwen (BAG) zowel de gebruiksfunctie \u2018Gezondheidsfunctie\u2019 als \u2018Logiesfunctie\u2019 hebben.\nAdressen die volgens de BAG alleen de gebruiksfunctie \u2018Celfunctie\u2019 of \u2018Gezondheidsfunctie\u2019 hebben.\nAdressen waar meer dan 20 personen in de BRP staan ingeschreven, ongeacht of het gaat om een woonadres of een briefadres.\nAdressen waar meer dan 10 personen staan ingeschreven (ongeacht of het gaat om een woonadres of een briefadres) en die volgens de basisregistratie adressen en gebouwen (BAG) de gebruiksfunctie \u2018Bijeenkomstfunctie\u2019 of \u2018Logiesfunctie\u2019 hebben.", + "application_url": "\u00a0", + "publiccode": "\u00a0", + "mprd": "Ja", + "source_data": "\u2022 Gegevens over de burgerlijke staat:\n\n- Naam \u2013 Geslachtsnaam, Voornamen;\n\n- Geboorte - Geboortedatum\n\n- Geslach\n\n- Ouders \u2013 Geslachtsnaam, Voornamen, Geboortedatum;\n\n- Huwelijk dan wel geregistreerd partnerschap en eerdere huwelijken of eerdere geregistreerde partnerschappen - Aanduiding huwelijk of geregistreerd partnerschap; Datum huwelijkssluiting of datum aangaan geregistreerd partnerschap; Huwelijksontbinding of ontbinding geregistreerd partnerschap en reden daarvan, dan wel nietigverklaring huwelijk of geregistreerd partnerschap; Datum ontbinding, dan wel nietigverklaring huwelijk of geregistreerd partnerschap\n\n- Echtgenoot dan wel geregistreerd partner en eerdere echtgenoten of geregistreerde partners \u2013 Geslachtsnaam, Voornamen, Geboortedatum;\n\n- Kinderen \u2013 Geslachtsnaam, Voornamen, Geboortedatum\n\n- Overlijden \u2013 Overlijdensdatum\n\n- Data ingang en be\u00ebindiging rechtsgeldigheid gegevens - Datum ingang rechtsgeldigheid; Datum be\u00ebindiging rechtsgeldigheid\n\n\u2022 Gegevens over de bijhoudingsgemeente en het adres in die gemeente alsmede over het verblijf in Nederland en het vertrek uit Nederland\n\n- Bijhoudingsgemeente \u2013 Gemeente; Datum aanvang adreshouding in de gemeente\n\n- Adres - Functie van het adres; Gemeente; Woonplaats; Straatnaam en zo nodig deel van een gemeente; Huisnummer; Locatie ten opzichte van adres; Huisletter; Huisnummertoevoeging; Locatiebeschrijving en zo nodig deel van een gemeente; Postcode; Datum aanvang adreshouding; Datum ingang rechtsgeldigheid\n\n- Vertrek uit Nederland - Datum vertrek; Volgend land of gebied van verblijf;\n\n\u2022 Gegevens over het woonadres van de niet-ingezetene - Datum ingang rechtsgeldigheid; Datum be\u00ebindiging rechtsgeldigheid;\n\n\u2022 Gegevens over het burgerservicenummer van de ingeschrevene - Burgerservicenummer ingeschrevene; Datum van kracht worden van het burgerservicenummer; Datum be\u00ebindiging van het burgerservicenummer;\n\n\u2022 Gegevens over de burgerservicenummers van de ouders, de echtgenoot dan wel de geregistreerde partner, de eerdere echtgenoten of eerdere geregistreerde partners en de kinderen - Burgerservicenummer ouder; Burgerservicenummer echtgenoot dan wel geregistreerde partner; Burgerservicenummer eerdere echtgenoot; Burgerservicenummer eerdere geregistreerde partner; Burgerservicenummer kind; Data van kracht worden burgerservicenummers; Data be\u00ebindiging burgerservicenummers\n\n\u2022 Gegevens over het gebruik door de ingeschrevene van de geslachtsnaam van de echtgenoot, de geregistreerde partner, de eerdere echtgenoot of de eerdere geregistreerde partner \u2013 Naamgebruik; Datum ingang van het gegeven over het naamgebruik; Datum be\u00ebindiging van het gegeven over het naamgebruik\n\n\u2022 Gegevens over het tijdelijk verblijfsadres\n\n- Tijdelijk verblijfsadres \u2013 Gemeente; Woonplaats; Straatnaam en zo nodig deel van een gemeente; Huisnummer; Huisletter; Huisnummertoevoeging; Postcode; Datum ingang rechtsgeldigheid; Datum be\u00ebindiging rechtsgeldigheid\n\n\u2022 Gegevens in verband met de inschrijving en de wijziging van de bijhoudingsgemeente betreffende de ingezetene, gegevens in verband met de inschrijving betreffende de niet-ingezetene en gegevens betreffende de wijziging van de bijhoudings-verantwoordelijke betreffende de niet-ingezetene die ingezetene wordt - De hoedanigheid van de persoon die aangifte van verblijf en adres, van adreswijziging, of van vertrek heeft gedaan, dan wel de aantekening dat de gegevens ambtshalve zijn opgenomen; Datum inschrijving in de basisregistratie; Datum blokkering persoonslijst in verband met wijziging van de bijhoudingsverantwoordelijke; Gemeentecode van de gemeente waar de persoonskaart zich bevindt; Aantekening dat alle gegevens over kinderen, die aan de persoonskaart ontleend kunnen worden, op de persoonslijst zijn opgenomen\n\n\u2022 Gegevens ter aanduiding van akten en andere geschriften waaruit algemene gegevens zijn verkregen\n\n- Aanduiding van akten van de Nederlandse burgerlijke stand - Nummer van de akte waaraan een algemeen gegeven over de burgerlijke staat is ontleend; Gemeentecode van de gemeente waar de akte in de registers is opgenomen\n\n- Aanduiding van andere akten en geschriften - Omschrijving van het geschrift waaraan een algemeen gegeven is ontleend; Code van de bijhoudingsverantwoordelijke die het gegeven heeft ontleend; Datum van ontlening\n\n- Gegevens ter aanduiding van de onjuistheid van een opgenomen algemeen gegeven of van strijd met de Nederlandse openbare orde van een opgenomen gegeven over de burgerlijke staat - Aanduiding van het opgenomen algemeen gegeven dat onjuist is;\n\n- Gegevens over een onderzoek naar de onjuistheid van een opgenomen algemeen gegeven of de strijdigheid van een opgenomen gegeven over de burgerlijke staat - Aanduiding van de verzameling van gegevens, waarbinnen algeme", + "methods_and_models": "Beslisboom algoritme", + "monitoring": "Het algoritme wordt maandelijks ge\u00ebvalueerd door het meten van trefkans na de adresonderzoeken die door gemeenten zijn uitgevoerd. Alle LAA-profielen worden regelmatig ge\u00ebvalueerd met het oog op de vraag of zij nog werken, aangepast moeten worden of hun effectiviteit hebben verloren en niet meer gebruikt moeten worden. Op die manier wordt getracht de privacy impact op de Nederlandse burger zo klein mogelijk te houden. Een dergelijke evaluatie wordt minimaal drie keer per jaar gedaan in samenwerking met de samenwerkingspartners (gemeenten en afnemers). Tegen een besluit van de gemeente die leidt tot een aanpassing of wijziging van het adres of een uitschrijving, kan bezwaar worden gemaakt bij de gemeente. Een verzoek tot inzage kan worden gedaan in de bij de RvIG aanwezige persoonsgegevens.", + "human_intervention": "Op grond van de Wet BRP zijn nadere regels gesteld over de maatregelen om menselijke tussenkomst te waarborgen bij de ontwikkeling van profielen. Tijdens het ontwikkelen van het algoritme is advies gevraagd aan een representatieve vertegenwoordiging van de gemeenten en aangewezen bestuursorganen. Er worden om die reden geen persoonsgegevens verwerkt (geanalyseerd) voordat dit is besproken met de betrokken partijen. In de meeste gevallen wordt daarnaast ook de Autoriteit Persoonsgegevens (AP) om advies gevraagd.\n\nEr is geen sprake van automatische besluitvorming. Algoritmes zijn een middel en zijn niet leidend. De beoordeling en beslissingen worden uiteindelijk altijd door mensen gedaan. De gemeente doet, voordat zij een huisbezoek aflegt, altijd nog een eigen adresonderzoek.", + "risks": "De persoonlijke levenssfeer komt mogelijk in het gedrang, door het verwerken van persoonsgegevens en het afleggen van een huisbezoek door gemeenten", + "performance_standard": "Trefkans is minimaal 50%", + "create_dt": "2023-03-31 08:34:12.445221+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "79125837", + "owner": "rijksdienst-voor-identiteitsgegevens", + "leverancier_id": null + }, + { + "name": "Profiel Herinschrijvingen B Landelijke Aanpak Adreskwaliteit (LAA)", + "organization": "Rijksdienst voor Identiteitsgegevens (RvIG)", + "department": "Directie Uitvoering, afdeling Onderzoek & Analyse", + "description_short": "Het profiel Herinschrijving B betreft adressen waar in de afgelopen twee jaar in ieder geval drie mutaties hebben plaatsgevonden van of naar de BRP-status \u2018Vertrokken onbekend waarheen\u2019 (VOW). Een VOW-mutatie houdt in dat er een persoon was ingeschreven op een bepaald adres en vanaf dat adres de BRP-status VOW heeft gekregen. Een andere mogelijkheid is dat een persoon in de BRP de status VOW had en vervolgens op dit adres wordt ingeschreven. De ervaring leert dat er een verhoogd risico is dat de inschrijvingen op deze adressen onjuist zijn. Deze inschrijvingen betreffen alleen inschrijvingen op een woonadres.", + "type": "Beschrijvend", + "category": "Basisregistratie", + "website": null, + "status": "In gebruik", + "goal": "Het doel van dit algoritme is om potenti\u00eble risicoadressen te selecteren op basis van gerede twijfel en deze aan gemeenten te leveren voor nader adresonderzoek. Op basis van deze adresonderzoeken worden onjuiste adresgegevens gecorrigeerd, zodat overheidsorganen op basis van juiste informatie hun publieke taken kunnen uitvoeren.", + "impact": "Als een onderzoek naar inschrijving van personen op het adres plaats gaat vinden, wordt er huisbezoek op het adres gedaan. De persoonlijke levenssfeer komt mogelijk in het gedrang tijdens een adresbezoek door gemeenten. Er wordt niet geselecteerd op nationaliteit, geboorteplaats of afgeleiden daarvan. Gegevens als bijvoorbeeld het gebruik van een naam zijn noodzakelijk voor het adresonderzoek om gezinsverbanden vast te kunnen stellen en om burgers aan te schrijven om hen te informeren over het adresonderzoek. Dit gebruik van iemands naam in de verwerking van data is niet discriminatoir.", + "proportionality": "De juistheid van (adres)gegevens in de BRP is essentieel voor het functioneren van de Nederlandse overheid. Een overheid die zijn burgers niet kent of niet weet te vinden, is niet in staat om de taken te verrichten die door de burgers aan haar zijn toevertrouwd. Het is in veel gevallen een randvoorwaarde voor het correct uitvoeren van wettelijke regelingen en voor de effectiviteit van overheidsbeleid. Voor de burger is een juiste registratie van belang voor zijn correspondentie met de overheid en om aanspraak te kunnen maken op adres-gerelateerde overheidsvoorzieningen.\n\nIn regelgeving is uitdrukkelijk opgenomen welke gegevens mogen worden gebruikt bij het algoritme. Gegevens die niet worden genoemd mogen dus niet worden gebruikt. Ook worden er geen (persoons)gegevens gebruikt die tot discriminatie kunnen leiden. Er wordt niet geselecteerd op nationaliteit, geboorteplaats of afgeleiden daarvan.\n\nHet effici\u00ebnt en zo effectief mogelijk vinden van adressen waar de kans van incorrecte inschrijvingen op adressen zo groot mogelijk is (de trefkans is minimaal 50%) en deze inschrijvingen corrigeren. Met behulp van het algoritme kun je prioriteit geven aan adressen waarbij de kans groter dan 50% is dat er iets niet klopt in de registratie en zorg je er tegelijkertijd voor dat je niet onnodig bij burgers aan de deur komt. Er is bij dit algoritme geen sprake van automatische besluitvorming; er is altijd menselijke tussenkomst door de ambtenaar van de gemeente.", + "decision_making_process": "\u00a0", + "documentation": "https://www.rvig.nl/brp/landelijke-aanpak-adreskwaliteit-laa", + "competent_authority": "Ministerie van Binnenlandse Zaken en Koninkrijkrelaties", + "lawful_basis": "In de wet BRP is vastgelegd dat de Minister van Binnenlandse Zaken en Koninkrijkrelaties de gemeente ondersteunt bij het onderzoek of de adresregistratie in de BRP van personen klopt.\n\nDe Minister van Binnenlandse Zaken en Koninkrijkrelaties mag hiervoor persoonsgegevens verwerken. Deze persoonsgegevens mag de Minister van Binnenlandse Zaken en Koninkrijkrelaties analyseren aan de hand van een profiel.\n\nIn regelgeving is uitgewerkt welke gegevens mogen worden gebruikt en welke waarborgen moeten worden nageleefd bij de ontwikkeling van het profiel (waaronder de menselijke tussenkomst).\n\nVoordat het profiel landelijk in gebruik wordt genomen wordt de werking ervan eerst getest met een klein aantal gemeenten. Bekeken wordt of het profiel doet wat het doen moet en of de trefkans voldoende is.\n\nAls het profiel in gebruik is, wordt hij regelmatig ge\u00ebvalueerd en wordt bekeken of het profiel nog altijd voldoet aan de verwachtingen. Als dat niet meer het geval is, wordt het profiel aangepast of niet meer gebruikt.", + "iama": null, + "iama_description": null, + "dpia": "Nee", + "dpia_description": "n.v.t.", + "objection_procedure": "\u00a0", + "standard_version": "0.1.0", + "uuid": "\u00a0", + "url": "\u00a0", + "contact_email": "info@rvig.nl", + "area": "Nederland", + "lang": "Nederlands", + "revision_date": "2022-11-24 00:00:00", + "description": "De adressen moeten voor het profiel Herinschrijvingen B voldoen aan onderstaande criteria:\n\nAdressen waar de afgelopen 2 jaar in ieder geval een aantal mutaties hebben plaatsgevonden van of naar de BRP- status VOW. Hierbij moet het gaan om personen die 18 jaar of ouder waren ten tijde van die mutatie.\nAdressen waar zich in de afgelopen jaar een VOW-mutatie heeft voorgedaan.\nVan de adressen die overblijven worden de volgende adressen uitgesloten:\n\nAdressen die volgens de Basisregistratie Adressen en Gebouwen (BAG) zowel de gebruiksfunctie \u2018Gezondheidsfunctie\u2019 als \u2018Logiesfunctie\u2019 hebben.\nAdressen waarbij alle personen op het adres dezelfde geslachtsnaam hebben en er minimaal 3 personen op het adres staan ingeschreven.\nAdressen waarbij alle personen op het adres hebben dezelfde inschrijvingsdatum en de inschrijving geen technische of infrastructurele wijziging betreft.\nAlle adressen waarbij er minimaal 3 personen op het adres wonen en alle personen op het adres dezelfde geslachtsnaam hebben, behalve een volwassen vrouw die 18 jaar of ouder is.\nAls er meerdere volwassen vrouwen op het adres wonen dan wordt het adres niet uitgesloten.\nAdressen die volgens de BAG alleen de gebruiksfunctie \u2018Celfunctie\u2019 of \u2018Gezondheidsfunctie\u2019 hebben.\nAdressen waar meer dan 20 personen in de BRP staan ingeschreven, ongeacht of het gaat om een woonadres of een briefadres.\nAdressen waar op dit moment 1 entiteit staat ingeschreven. Echtgenoten, geregistreerde partners dan wel bloed- of aanverwanten in de eerste graad, behoren tot dezelfde entiteit.\nAdressen waar meer dan 10 personen staan ingeschreven (ongeacht of het gaat om een woonadres of een briefadres) en die volgens de basisregistratie adressen en gebouwen, de BAG, de gebruiksfunctie \u2018Bijeenkomstfunctie\u2019 of \u2018Logiesfunctie\u2019 hebben.", + "application_url": "\u00a0", + "publiccode": "\u00a0", + "mprd": "Ja", + "source_data": "\u2022 Gegevens over de burgerlijke staat:\n\n- Naam \u2013 Geslachtsnaam, Voornamen;\n\n- Geboorte - Geboortedatum\n\n- Geslach\n\n- Ouders \u2013 Geslachtsnaam, Voornamen, Geboortedatum;\n\n- Huwelijk dan wel geregistreerd partnerschap en eerdere huwelijken of eerdere geregistreerde partnerschappen - Aanduiding huwelijk of geregistreerd partnerschap; Datum huwelijkssluiting of datum aangaan geregistreerd partnerschap; Huwelijksontbinding of ontbinding geregistreerd partnerschap en reden daarvan, dan wel nietigverklaring huwelijk of geregistreerd partnerschap; Datum ontbinding, dan wel nietigverklaring huwelijk of geregistreerd partnerschap\n\n- Echtgenoot dan wel geregistreerd partner en eerdere echtgenoten of geregistreerde partners \u2013 Geslachtsnaam, Voornamen, Geboortedatum;\n\n- Kinderen \u2013 Geslachtsnaam, Voornamen, Geboortedatum\n\n- Overlijden \u2013 Overlijdensdatum\n\n- Data ingang en be\u00ebindiging rechtsgeldigheid gegevens - Datum ingang rechtsgeldigheid; Datum be\u00ebindiging rechtsgeldigheid\n\n\u2022 Gegevens over de bijhoudingsgemeente en het adres in die gemeente alsmede over het verblijf in Nederland en het vertrek uit Nederland\n\n- Bijhoudingsgemeente \u2013 Gemeente; Datum aanvang adreshouding in de gemeente\n\n- Adres - Functie van het adres; Gemeente; Woonplaats; Straatnaam en zo nodig deel van een gemeente; Huisnummer; Locatie ten opzichte van adres; Huisletter; Huisnummertoevoeging; Locatiebeschrijving en zo nodig deel van een gemeente; Postcode; Datum aanvang adreshouding; Datum ingang rechtsgeldigheid\n\n- Vertrek uit Nederland - Datum vertrek; Volgend land of gebied van verblijf;\n\n\u2022 Gegevens over het woonadres van de niet-ingezetene - Datum ingang rechtsgeldigheid; Datum be\u00ebindiging rechtsgeldigheid;\n\n\u2022 Gegevens over het burgerservicenummer van de ingeschrevene - Burgerservicenummer ingeschrevene; Datum van kracht worden van het burgerservicenummer; Datum be\u00ebindiging van het burgerservicenummer;\n\n\u2022 Gegevens over de burgerservicenummers van de ouders, de echtgenoot dan wel de geregistreerde partner, de eerdere echtgenoten of eerdere geregistreerde partners en de kinderen - Burgerservicenummer ouder; Burgerservicenummer echtgenoot dan wel geregistreerde partner; Burgerservicenummer eerdere echtgenoot; Burgerservicenummer eerdere geregistreerde partner; Burgerservicenummer kind; Data van kracht worden burgerservicenummers; Data be\u00ebindiging burgerservicenummers\n\n\u2022 Gegevens over het gebruik door de ingeschrevene van de geslachtsnaam van de echtgenoot, de geregistreerde partner, de eerdere echtgenoot of de eerdere geregistreerde partner \u2013 Naamgebruik; Datum ingang van het gegeven over het naamgebruik; Datum be\u00ebindiging van het gegeven over het naamgebruik\n\n\u2022 Gegevens over het tijdelijk verblijfsadres\n\n- Tijdelijk verblijfsadres \u2013 Gemeente; Woonplaats; Straatnaam en zo nodig deel van een gemeente; Huisnummer; Huisletter; Huisnummertoevoeging; Postcode; Datum ingang rechtsgeldigheid; Datum be\u00ebindiging rechtsgeldigheid\n\n\u2022 Gegevens in verband met de inschrijving en de wijziging van de bijhoudingsgemeente betreffende de ingezetene, gegevens in verband met de inschrijving betreffende de niet-ingezetene en gegevens betreffende de wijziging van de bijhoudings-verantwoordelijke betreffende de niet-ingezetene die ingezetene wordt - De hoedanigheid van de persoon die aangifte van verblijf en adres, van adreswijziging, of van vertrek heeft gedaan, dan wel de aantekening dat de gegevens ambtshalve zijn opgenomen; Datum inschrijving in de basisregistratie; Datum blokkering persoonslijst in verband met wijziging van de bijhoudingsverantwoordelijke; Gemeentecode van de gemeente waar de persoonskaart zich bevindt; Aantekening dat alle gegevens over kinderen, die aan de persoonskaart ontleend kunnen worden, op de persoonslijst zijn opgenomen\n\n\u2022 Gegevens ter aanduiding van akten en andere geschriften waaruit algemene gegevens zijn verkregen\n\n- Aanduiding van akten van de Nederlandse burgerlijke stand - Nummer van de akte waaraan een algemeen gegeven over de burgerlijke staat is ontleend; Gemeentecode van de gemeente waar de akte in de registers is opgenomen\n\n- Aanduiding van andere akten en geschriften - Omschrijving van het geschrift waaraan een algemeen gegeven is ontleend; Code van de bijhoudingsverantwoordelijke die het gegeven heeft ontleend; Datum van ontlening\n\n- Gegevens ter aanduiding van de onjuistheid van een opgenomen algemeen gegeven of van strijd met de Nederlandse openbare orde van een opgenomen gegeven over de burgerlijke staat - Aanduiding van het opgenomen algemeen gegeven dat onjuist is;\n\n- Gegevens over een onderzoek naar de onjuistheid van een opgenomen algemeen gegeven of de strijdigheid van een opgenomen gegeven over de burgerlijke staat - Aanduiding van de verzameling van gegevens, waarbinnen algeme", + "methods_and_models": "Beslisboom algoritme", + "monitoring": "Het algoritme wordt maandelijks ge\u00ebvalueerd door het meten van trefkans na de adresonderzoeken die door gemeenten zijn uitgevoerd. Alle LAA-profielen worden regelmatig ge\u00ebvalueerd met het oog op de vraag of zij nog werken, aangepast moeten worden of hun effectiviteit hebben verloren en niet meer gebruikt moeten worden. Op die manier wordt getracht de privacy impact op de Nederlandse burger zo klein mogelijk te houden. Een dergelijke evaluatie wordt minimaal drie keer per jaar gedaan in samenwerking met de samenwerkingspartners (gemeenten en afnemers). Tegen een besluit van de gemeente die leidt tot een aanpassing of wijziging van het adres of een uitschrijving, kan bezwaar worden gemaakt bij de gemeente. Een verzoek tot inzage kan worden gedaan in de bij de RvIG aanwezige persoonsgegevens.", + "human_intervention": "Op grond van de Wet BRP zijn nadere regels gesteld over de maatregelen om menselijke tussenkomst te waarborgen bij de ontwikkeling van profielen. Tijdens het ontwikkelen van het algoritme is advies gevraagd aan een representatieve vertegenwoordiging van de gemeenten en aangewezen bestuursorganen. Er worden om die reden geen persoonsgegevens verwerkt (geanalyseerd) voordat dit is besproken met de betrokken partijen. In de meeste gevallen wordt daarnaast ook de Autoriteit Persoonsgegevens (AP) om advies gevraagd.\n\nEr is geen sprake van automatische besluitvorming. Algoritmes zijn een middel en zijn niet leidend. De beoordeling en beslissingen worden uiteindelijk altijd door mensen gedaan. De gemeente doet, voordat zij een huisbezoek aflegt, altijd nog een eigen adresonderzoek.", + "risks": "De persoonlijke levenssfeer komt mogelijk in het gedrang, door het verwerken van persoonsgegevens en het afleggen van een huisbezoek door gemeenten.", + "performance_standard": "Trefkans is minimaal 50%", + "create_dt": "2023-03-31 08:34:12.449809+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "54524835", + "owner": "rijksdienst-voor-identiteitsgegevens", + "leverancier_id": null + }, + { + "name": "Profiel Samenwoners Landelijke Aanpak Adreskwaliteit (LAA)", + "organization": "Rijksdienst voor Identiteitsgegevens (RvIG)", + "department": "Directie Uitvoering, afdeling Onderzoek & Analyse", + "description_short": "Bij woonadressen waarbij vier of meer personen in de Basisregistratie Personen (BRP) staan ingeschreven die geen eerstegraads familie van elkaar zijn, kan twijfel ontstaan of de BRP-registratie overeenkomt met de feitelijke situatie. Het is gebleken dat er bij adressen waarop meerdere personen staan ingeschreven die geen eerstegraads familie van elkaar zijn, een verhoogde kans is op een onjuiste BRP-registratie.", + "type": "Beschrijvend", + "category": "Basisregistratie", + "website": "\u00a0", + "status": "In gebruik", + "goal": "Het doel van dit algoritme is om potenti\u00eble risicoadressen te selecteren op basis van gerede twijfel en deze aan gemeenten te leveren voor nader adresonderzoek. Op basis van deze adresonderzoeken worden onjuiste adresgegevens gecorrigeerd, zodat overheidsorganen die gebruik maken van gegevens uit de BRP op basis van juiste informatie hun publieke taken kunnen uitvoeren.", + "impact": "Als een onderzoek naar inschrijving van personen op het adres plaats gaat vinden, wordt er huisbezoek op het adres gedaan. De persoonlijke levenssfeer komt mogelijk in het gedrang tijdens een adresbezoek door gemeenten. Gegevens als het gebruik van een naam zijn noodzakelijk voor het adresonderzoek om gezinsverbanden vast te kunnen stellen en om burgers aan te schrijven om hen te informeren over het adresonderzoek.", + "proportionality": "De juistheid van (adres)gegevens in de BRP is essentieel voor het functioneren van de Nederlandse overheid. Een overheid die zijn burgers niet kent of niet weet te vinden, is niet in staat om de taken te verrichten die door de burgers aan haar zijn toevertrouwd. Het is in veel gevallen een randvoorwaarde voor het correct uitvoeren van wettelijke regelingen en voor de effectiviteit van overheidsbeleid. Voor de burger is een juiste registratie van belang voor zijn correspondentie met de overheid en om aanspraak te kunnen maken op adres-gerelateerde overheidsvoorzieningen.\n\nIn regelgeving is uitdrukkelijk opgenomen welke gegevens mogen worden gebruikt bij het algoritme. Gegevens die niet worden genoemd mogen dus niet worden gebruikt. Ook worden er geen (persoons)gegevens gebruikt die tot discriminatie kunnen leiden. Er wordt niet geselecteerd op nationaliteit, geboorteplaats of afgeleiden daarvan.\n\nDe inzet van het algoritme is een kosteneffectieve manier om de kwaliteit van de BRP te borgen. Met behulp van het algoritme kun je prioriteit geven aan adressen waarbij de kans groter dan 50% is dat er iets niet klopt in de registratie en zorg je er tegelijkertijd voor dat je niet onnodig bij burgers aan de deur komt. Er is bij dit algoritme geen sprake van automatische besluitvorming; er is altijd menselijke tussenkomst door de ambtenaar van de gemeente.", + "decision_making_process": "\u00a0", + "documentation": "https://www.rvig.nl/brp/landelijke-aanpak-adreskwaliteit-laa", + "competent_authority": "Ministerie van Binnenlandse Zaken en Koninkrijkrelaties", + "lawful_basis": "De Minister van Binnenlandse Zaken en Koninkrijkrelaties mag hiervoor persoonsgegevens verwerken. Deze persoonsgegevens mag de Minister van Binnenlandse Zaken en Koninkrijkrelaties analyseren aan de hand van een profiel.\n\nIn regelgeving is uitgewerkt welke gegevens mogen worden gebruikt en welke waarborgen moeten worden nageleefd bij de ontwikkeling van het profiel (waaronder de menselijke tussenkomst).\n\nVoordat het profiel landelijk in gebruik wordt genomen wordt de werking ervan eerst getest met een klein aantal gemeenten. Bekeken wordt of het profiel doet wat het doen moet en of de trefkans voldoende is.\n\nAls het profiel in gebruik is, wordt hij regelmatig ge\u00ebvalueerd en wordt bekeken of het profiel nog altijd voldoet aan de verwachtingen. Als dat niet meer het geval is, wordt het profiel aangepast of niet meer gebruikt.", + "iama": null, + "iama_description": null, + "dpia": "Nee", + "dpia_description": "n.v.t.", + "objection_procedure": "\u00a0", + "standard_version": "0.1.0", + "uuid": "\u00a0", + "url": "\u00a0", + "contact_email": "info@rvig.nl", + "area": "Nederland", + "lang": "Nederlands", + "revision_date": "2022-11-24 00:00:00", + "description": "De adressen moeten voor het profiel Samenwoners voldoen aan onderstaande criteria:\n\nAdressen waarbij het aantal ingeschreven entiteiten 4 of meer entiteiten bevatten, afhankelijk van de grootte van de gemeente (gemeenten met minder of meer inwoners dan 25.000).\nVan de adressen die overblijven worden de volgende adressen uitgesloten:\n\nAdressen die volgens de Basisregistratie Adressen en Gebouwen (BAG) zowel de gebruiksfunctie \u2018Gezondheidsfunctie\u2019 als \u2018Logiesfunctie\u2019 hebben.\nAdressen waarbij alle personen op het adres dezelfde geslachtsnaam hebben en er minimaal 3 personen op het adres staan ingeschreven.\nAlle adressen waarbij er minimaal 3 personen op het adres wonen en alle personen op het adres dezelfde geslachtsnaam hebben, behalve een volwassen vrouw die 18 jaar of ouder is.Als er meerdere volwassen vrouwen op het adres wonen dan wordt het adres niet uitgesloten\nAdressen die volgens de BAG alleen de gebruiksfunctie \u2018Celfunctie\u2019 of \u2018Gezondheidsfunctie\u2019 hebben.\nAdressen waarbij alle personen op het adres dezelfde inschrijvingsdatum hebben en de inschrijving geen technische of infrastructurele wijziging betreft.\nAdressen waar meer dan 10 personen staan ingeschreven (ongeacht of het gaat om een woonadres of een briefadres) en die volgens de basisregistratie adressen en gebouwen, de BAG, de gebruiksfunctie \u2018Bijeenkomstfunctie\u2019 of \u2018Logiesfunctie\u2019 hebben.", + "application_url": "\u00a0", + "publiccode": "\u00a0", + "mprd": "Ja", + "source_data": "\u2022 Gegevens over de burgerlijke staat:\n\n- Naam \u2013 Geslachtsnaam, Voornamen;\n\n- Geboorte - Geboortedatum\n\n- Geslacht\n\n- Ouders \u2013 Geslachtsnaam, Voornamen, Geboortedatum;\n\n- Huwelijk dan wel geregistreerd partnerschap en eerdere huwelijken of eerdere geregistreerde partnerschappen - Aanduiding huwelijk of geregistreerd partnerschap; Datum huwelijkssluiting of datum aangaan geregistreerd partnerschap; Huwelijksontbinding of ontbinding geregistreerd partnerschap en reden daarvan, dan wel nietigverklaring huwelijk of geregistreerd partnerschap; Datum ontbinding, dan wel nietigverklaring huwelijk of geregistreerd partnerschap\n\n- Echtgenoot dan wel geregistreerd partner en eerdere echtgenoten of geregistreerde partners \u2013 Geslachtsnaam, Voornamen, Geboortedatum;\n\n- Kinderen \u2013 Geslachtsnaam, Voornamen, Geboortedatum\n\n- Overlijden \u2013 Overlijdensdatum\n\n- Data ingang en be\u00ebindiging rechtsgeldigheid gegevens - Datum ingang rechtsgeldigheid; Datum be\u00ebindiging rechtsgeldigheid\n\n\u2022 Gegevens over de bijhoudingsgemeente en het adres in die gemeente alsmede over het verblijf in Nederland en het vertrek uit Nederland\n\n- Bijhoudingsgemeente \u2013 Gemeente; Datum aanvang adreshouding in de gemeente\n\n- Adres - Functie van het adres; Gemeente; Woonplaats; Straatnaam en zo nodig deel van een gemeente; Huisnummer; Locatie ten opzichte van adres; Huisletter; Huisnummertoevoeging; Locatiebeschrijving en zo nodig deel van een gemeente; Postcode; Datum aanvang adreshouding; Datum ingang rechtsgeldigheid\n\n- Vertrek uit Nederland - Datum vertrek; Volgend land of gebied van verblijf;\n\n\u2022 Gegevens over het woonadres van de niet-ingezetene - Datum ingang rechtsgeldigheid; Datum be\u00ebindiging rechtsgeldigheid;\n\n\u2022 Gegevens over het burgerservicenummer van de ingeschrevene - Burgerservicenummer ingeschrevene; Datum van kracht worden van het burgerservicenummer; Datum be\u00ebindiging van het burgerservicenummer;\n\n\u2022 Gegevens over de burgerservicenummers van de ouders, de echtgenoot dan wel de geregistreerde partner, de eerdere echtgenoten of eerdere geregistreerde partners en de kinderen - Burgerservicenummer ouder; Burgerservicenummer echtgenoot dan wel geregistreerde partner; Burgerservicenummer eerdere echtgenoot; Burgerservicenummer eerdere geregistreerde partner; Burgerservicenummer kind; Data van kracht worden burgerservicenummers; Data be\u00ebindiging burgerservicenummers\n\n\u2022 Gegevens over het gebruik door de ingeschrevene van de geslachtsnaam van de echtgenoot, de geregistreerde partner, de eerdere echtgenoot of de eerdere geregistreerde partner \u2013 Naamgebruik; Datum ingang van het gegeven over het naamgebruik; Datum be\u00ebindiging van het gegeven over het naamgebruik\n\n\u2022 Gegevens over het tijdelijk verblijfsadres\n\n- Tijdelijk verblijfsadres \u2013 Gemeente; Woonplaats; Straatnaam en zo nodig deel van een gemeente; Huisnummer; Huisletter; Huisnummertoevoeging; Postcode; Datum ingang rechtsgeldigheid; Datum be\u00ebindiging rechtsgeldigheid\n\n\u2022 Gegevens in verband met de inschrijving en de wijziging van de bijhoudingsgemeente betreffende de ingezetene, gegevens in verband met de inschrijving betreffende de niet-ingezetene en gegevens betreffende de wijziging van de bijhoudings-verantwoordelijke betreffende de niet-ingezetene die ingezetene wordt - De hoedanigheid van de persoon die aangifte van verblijf en adres, van adreswijziging, of van vertrek heeft gedaan, dan wel de aantekening dat de gegevens ambtshalve zijn opgenomen; Datum inschrijving in de basisregistratie; Datum blokkering persoonslijst in verband met wijziging van de bijhoudingsverantwoordelijke; Gemeentecode van de gemeente waar de persoonskaart zich bevindt; Aantekening dat alle gegevens over kinderen, die aan de persoonskaart ontleend kunnen worden, op de persoonslijst zijn opgenomen\n\n\u2022 Gegevens ter aanduiding van akten en andere geschriften waaruit algemene gegevens zijn verkregen\n\n- Aanduiding van akten van de Nederlandse burgerlijke stand - Nummer van de akte waaraan een algemeen gegeven over de burgerlijke staat is ontleend; Gemeentecode van de gemeente waar de akte in de registers is opgenomen\n\n- Aanduiding van andere akten en geschriften - Omschrijving van het geschrift waaraan een algemeen gegeven is ontleend; Code van de bijhoudingsverantwoordelijke die het gegeven heeft ontleend; Datum van ontlening\n\n- Gegevens ter aanduiding van de onjuistheid van een opgenomen algemeen gegeven of van strijd met de Nederlandse openbare orde van een opgenomen gegeven over de burgerlijke staat - Aanduiding van het opgenomen algemeen gegeven dat onjuist is;\n\n- Gegevens over een onderzoek naar de onjuistheid van een opgenomen algemeen gegeven of de strijdigheid van een opgenomen gegeven over de burgerlijke staat - Aanduiding van de verzameling van gegevens, waarbinnen algem", + "methods_and_models": "Beslisboom algoritme", + "monitoring": "Het algoritme wordt maandelijks ge\u00ebvalueerd door het meten van trefkans na de adresonderzoeken die door gemeenten zijn uitgevoerd. Alle LAA-profielen worden regelmatig ge\u00ebvalueerd met het oog op de vraag of zij nog werken, aangepast moeten worden of hun effectiviteit hebben verloren en niet meer gebruikt moeten worden. Op die manier wordt getracht de privacy impact op de Nederlandse burger zo klein mogelijk te houden. Een dergelijke evaluatie wordt minimaal drie keer per jaar gedaan in samenwerking met de samenwerkingspartners (gemeenten en afnemers). Tegen een besluit van de gemeente die leidt tot een aanpassing of wijziging van het adres of een uitschrijving, kan bezwaar worden gemaakt bij de gemeente. Een verzoek tot inzage kan worden gedaan in de bij de RvIG aanwezige persoonsgegevens.", + "human_intervention": "Op grond van de Wet BRP zijn nadere regels gesteld over de maatregelen om menselijke tussenkomst te waarborgen bij de ontwikkeling van profielen. Tijdens het ontwikkelen van het algoritme is advies gevraagd aan een representatieve vertegenwoordiging van de gemeenten en aangewezen bestuursorganen. Er worden om die reden geen persoonsgegevens verwerkt (geanalyseerd) voordat dit is besproken met de betrokken partijen. In de meeste gevallen wordt daarnaast ook de Autoriteit Persoonsgegevens (AP) om advies gevraagd.\n\nEr is geen sprake van automatische besluitvorming. Algoritmes zijn een middel en zijn niet leidend. De beoordeling en beslissingen worden door mensen gedaan. De gemeente doet, voordat zij een huisbezoek aflegt, altijd nog een eigen adresonderzoek.", + "risks": "De persoonlijke levenssfeer komt mogelijk in het gedrang, door het verwerken van persoonsgegevens en het afleggen van een huisbezoek door gemeenten.", + "performance_standard": "Trefkans is minimaal 50%", + "create_dt": "2023-03-31 08:34:12.454509+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "26135582", + "owner": "rijksdienst-voor-identiteitsgegevens", + "leverancier_id": null + }, + { + "name": "Profiel Veelverhuizers Landelijke Aanpak Adreskwaliteit (LAA)", + "organization": "Rijksdienst voor Identiteitsgegevens (RvIG)", + "department": "Directie Uitvoering, afdeling Onderzoek & Analyse", + "description_short": "Bij personen met een groot aantal adreswijzigingen in een relatief korte tijd, ontstaat twijfel over de juistheid van de registratie op het huidige adres in de Basisregistratie Personen (BRP). Het gaat om personen die in de afgelopen twee jaar in ieder geval drie keer aangifte van een adreswijziging hebben gedaan.", + "type": "Beschrijvend", + "category": "Basisregistratie", + "website": "\u00a0", + "status": "In gebruik", + "goal": "Het doel van dit algoritme is om potenti\u00eble risicoadressen te selecteren op basis van gerede twijfel aan de inschrijvingen op het adres in de BRP en deze aan gemeenten te leveren voor nader adresonderzoek. Op basis van deze adresonderzoeken worden onjuiste adresgegevens gecorrigeerd, zodat overheidsorganen die gebruik maken van de gegevens uit de BRP op basis van juiste informatie hun publieke taken kunnen uitvoeren.", + "impact": "Als een onderzoek naar inschrijving van personen op het adres plaats gaat vinden, wordt er huisbezoek op het adres gedaan. De persoonlijke levenssfeer komt mogelijk in het gedrang tijdens een adresbezoek door gemeenten. Gegevens als het gebruik van een naam zijn noodzakelijk voor het adresonderzoek om gezinsverbanden vast te kunnen stellen en om burgers aan te schrijven om hen te informeren over het adresonderzoek.", + "proportionality": "De juistheid van (adres)gegevens in de BRP is essentieel voor het functioneren van de Nederlandse overheid. Een overheid die zijn burgers niet kent of niet weet te vinden, is niet in staat om de taken te verrichten die door de burgers aan haar zijn toevertrouwd. Het is in veel gevallen een randvoorwaarde voor het correct uitvoeren van wettelijke regelingen en voor de effectiviteit van overheidsbeleid. Voor de burger is een juiste registratie van belang voor zijn correspondentie met de overheid en om aanspraak te kunnen maken op adres-gerelateerde overheidsvoorzieningen.\n\nIn regelgeving is uitdrukkelijk opgenomen welke gegevens mogen worden gebruikt bij het algoritme. Gegevens die niet worden genoemd mogen dus niet worden gebruikt. Ook worden er geen (persoons)gegevens gebruikt die tot discriminatie kunnen leiden. Er wordt niet geselecteerd op nationaliteit, geboorteplaats of afgeleiden daarvan.\n\nDe inzet van het algoritme is een kosteneffectieve manier om de kwaliteit van de BRP te borgen.\n\nMet behulp van het algoritme kun je prioriteit geven aan adressen waarbij de kans groter dan 50% is dat er iets niet klopt in de registratie en zorg je er tegelijkertijd voor dat je niet onnodig bij burgers aan de deur komt. Er is bij dit algoritme geen sprake van automatische besluitvorming; er is altijd menselijke tussenkomst door de ambtenaar van de gemeente.", + "decision_making_process": "\u00a0", + "documentation": "https://www.rvig.nl/brp/landelijke-aanpak-adreskwaliteit-laa", + "competent_authority": "Ministerie van Binnenlandse Zaken en Koninkrijkrelaties", + "lawful_basis": "In de wet BRP is vastgelegd dat de Minister van Binnenlandse Zaken en Koninkrijkrelaties de gemeente ondersteunt bij het onderzoek of de adresregistratie in de BRP van personen klopt.\n\nDe Minister van Binnenlandse Zaken en Koninkrijkrelaties mag hiervoor persoonsgegevens verwerken. Deze persoonsgegevens mag de Minister van Binnenlandse Zaken en Koninkrijkrelaties analyseren aan de hand van een profiel.\n\nIn regelgeving is uitgewerkt welke gegevens mogen worden gebruikt en welke waarborgen moeten worden nageleefd bij de ontwikkeling van het profiel (waaronder de menselijke tussenkomst).\n\nVoordat het profiel landelijk in gebruik wordt genomen wordt de werking ervan eerst getest met een klein aantal gemeenten. Bekeken wordt of het profiel doet wat het doen moet en of de trefkans voldoende is.\n\nAls het profiel in gebruik is, wordt hij regelmatig ge\u00ebvalueerd en wordt bekeken of het profiel nog altijd voldoet aan de verwachtingen. Als dat niet meer het geval is, wordt het profiel aangepast of niet meer gebruikt.", + "iama": null, + "iama_description": null, + "dpia": "Nee", + "dpia_description": "n.v.t.", + "objection_procedure": "\u00a0", + "standard_version": "0.1.0", + "uuid": "\u00a0", + "url": "\u00a0", + "contact_email": "info@rvig.nl", + "area": "Nederland", + "lang": "Nederlands", + "revision_date": "2022-11-24 00:00:00", + "description": "De adressen moeten voor het profiel Veelverhuizers voldoen aan onderstaande criteria:\n\nDe veelverhuizer moet momenteel 16 jaar of ouder zijn.\nOp het adres wonen momenteel 3 of meer entiteiten. Personen die eerste graad familie zijn, zoals geregistreerd in de BRP, behoren tot dezelfde entiteit.\nOp het adres woont in ieder geval 1 persoon die meerdere keer is verhuisd in de afgelopen 2 jaar.\nVan de adressen die overblijven worden de volgende adressen uitgesloten:\n\nAdressen die volgens de BAG zowel de gebruiksfunctie \u2018Gezondheidsfunctie\u2019 als \u2018Logiesfunctie\u2019 hebben.\nAdressen waar minimaal 10 personen staan ingeschreven (ongeacht of het gaat om een woonadres of een briefadres) en die volgens de Basisregistratie Adressen en Gebouwen hierna de BAG de gebruiksfunctie \u2018Bijeenkomstfunctie\u2019 of \u2018Logiesfunctie\u2019 hebben.\nAdressen waarbij alle personen op het adres dezelfde geslachtsnaam hebben en er minimaal 3 personen op het adres staan ingeschreven.\nAdressen waarbij alle personen op het adres dezelfde inschrijvingsdatum hebben en de inschrijving geen technische of infrastructurele wijziging betreft.\nAlle adressen waarbij er minimaal 3 personen op het adres wonen en alle personen op het adres dezelfde geslachtsnaam hebben, behalve een volwassen vrouw die 18 jaar of ouder is.Als er meerdere volwassen vrouwen op het adres wonen dan wordt het adres niet uitgesloten.\nAdressen die volgens de BAG alleen de gebruiksfunctie \u2018Celfunctie\u2019 of \u2018Gezondheidsfunctie\u2019 hebben.", + "application_url": "\u00a0", + "publiccode": "\u00a0", + "mprd": "Ja", + "source_data": "\u2022 Gegevens over de burgerlijke staat:\n\n- Naam \u2013 Geslachtsnaam, Voornamen;\n\n- Geboorte - Geboortedatum\n\n- Geslacht\n\n- Ouders \u2013 Geslachtsnaam, Voornamen, Geboortedatum;\n\n- Huwelijk dan wel geregistreerd partnerschap en eerdere huwelijken of eerdere geregistreerde partnerschappen - Aanduiding huwelijk of geregistreerd partnerschap; Datum huwelijkssluiting of datum aangaan geregistreerd partnerschap; Huwelijksontbinding of ontbinding geregistreerd partnerschap en reden daarvan, dan wel nietigverklaring huwelijk of geregistreerd partnerschap; Datum ontbinding, dan wel nietigverklaring huwelijk of geregistreerd partnerschap\n\n- Echtgenoot dan wel geregistreerd partner en eerdere echtgenoten of geregistreerde partners \u2013 Geslachtsnaam, Voornamen, Geboortedatum;\n\n- Kinderen \u2013 Geslachtsnaam, Voornamen, Geboortedatum\n\n- Overlijden \u2013 Overlijdensdatum\n\n- Data ingang en be\u00ebindiging rechtsgeldigheid gegevens - Datum ingang rechtsgeldigheid; Datum be\u00ebindiging rechtsgeldigheid\n\n\u2022 Gegevens over de bijhoudingsgemeente en het adres in die gemeente alsmede over het verblijf in Nederland en het vertrek uit Nederland\n\n- Bijhoudingsgemeente \u2013 Gemeente; Datum aanvang adreshouding in de gemeente\n\n- Adres - Functie van het adres; Gemeente; Woonplaats; Straatnaam en zo nodig deel van een gemeente; Huisnummer; Locatie ten opzichte van adres; Huisletter; Huisnummertoevoeging; Locatiebeschrijving en zo nodig deel van een gemeente; Postcode; Datum aanvang adreshouding; Datum ingang rechtsgeldigheid\n\n- Vertrek uit Nederland - Datum vertrek; Volgend land of gebied van verblijf;\n\n\u2022 Gegevens over het woonadres van de niet-ingezetene - Datum ingang rechtsgeldigheid; Datum be\u00ebindiging rechtsgeldigheid;\n\n\u2022 Gegevens over het burgerservicenummer van de ingeschrevene - Burgerservicenummer ingeschrevene; Datum van kracht worden van het burgerservicenummer; Datum be\u00ebindiging van het burgerservicenummer;\n\n\u2022 Gegevens over de burgerservicenummers van de ouders, de echtgenoot dan wel de geregistreerde partner, de eerdere echtgenoten of eerdere geregistreerde partners en de kinderen - Burgerservicenummer ouder; Burgerservicenummer echtgenoot dan wel geregistreerde partner; Burgerservicenummer eerdere echtgenoot; Burgerservicenummer eerdere geregistreerde partner; Burgerservicenummer kind; Data van kracht worden burgerservicenummers; Data be\u00ebindiging burgerservicenummers\n\n\u2022 Gegevens over het gebruik door de ingeschrevene van de geslachtsnaam van de echtgenoot, de geregistreerde partner, de eerdere echtgenoot of de eerdere geregistreerde partner \u2013 Naamgebruik; Datum ingang van het gegeven over het naamgebruik; Datum be\u00ebindiging van het gegeven over het naamgebruik\n\n\u2022 Gegevens over het tijdelijk verblijfsadres\n\n- Tijdelijk verblijfsadres \u2013 Gemeente; Woonplaats; Straatnaam en zo nodig deel van een gemeente; Huisnummer; Huisletter; Huisnummertoevoeging; Postcode; Datum ingang rechtsgeldigheid; Datum be\u00ebindiging rechtsgeldigheid\n\n\u2022 Gegevens in verband met de inschrijving en de wijziging van de bijhoudingsgemeente betreffende de ingezetene, gegevens in verband met de inschrijving betreffende de niet-ingezetene en gegevens betreffende de wijziging van de bijhoudings-verantwoordelijke betreffende de niet-ingezetene die ingezetene wordt - De hoedanigheid van de persoon die aangifte van verblijf en adres, van adreswijziging, of van vertrek heeft gedaan, dan wel de aantekening dat de gegevens ambtshalve zijn opgenomen; Datum inschrijving in de basisregistratie; Datum blokkering persoonslijst in verband met wijziging van de bijhoudingsverantwoordelijke; Gemeentecode van de gemeente waar de persoonskaart zich bevindt; Aantekening dat alle gegevens over kinderen, die aan de persoonskaart ontleend kunnen worden, op de persoonslijst zijn opgenomen\n\n\u2022 Gegevens ter aanduiding van akten en andere geschriften waaruit algemene gegevens zijn verkregen\n\n- Aanduiding van akten van de Nederlandse burgerlijke stand - Nummer van de akte waaraan een algemeen gegeven over de burgerlijke staat is ontleend; Gemeentecode van de gemeente waar de akte in de registers is opgenomen\n\n- Aanduiding van andere akten en geschriften - Omschrijving van het geschrift waaraan een algemeen gegeven is ontleend; Code van de bijhoudingsverantwoordelijke die het gegeven heeft ontleend; Datum van ontlening\n\n- Gegevens ter aanduiding van de onjuistheid van een opgenomen algemeen gegeven of van strijd met de Nederlandse openbare orde van een opgenomen gegeven over de burgerlijke staat - Aanduiding van het opgenomen algemeen gegeven dat onjuist is;\n\n- Gegevens over een onderzoek naar de onjuistheid van een opgenomen algemeen gegeven of de strijdigheid van een opgenomen gegeven over de burgerlijke staat - Aanduiding van de verzameling van gegevens, waarbinnen algem", + "methods_and_models": "Beslisboom algoritme", + "monitoring": "Het algoritme wordt maandelijks ge\u00ebvalueerd door het meten van trefkans na de adresonderzoeken die door gemeenten zijn uitgevoerd. Alle LAA-profielen worden regelmatig ge\u00ebvalueerd met het oog op de vraag of zij nog werken, aangepast moeten worden of hun effectiviteit hebben verloren en niet meer gebruikt moeten worden. Op die manier wordt getracht de privacy impact op de Nederlandse burger zo klein mogelijk te houden. Een dergelijke evaluatie wordt minimaal drie keer per jaar gedaan in samenwerking met de samenwerkingspartners (gemeenten en afnemers). Tegen een besluit van de gemeente die leidt tot een aanpassing of wijziging van het adres of een uitschrijving, bezwaar kan worden gemaakt bij de gemeente. Een verzoek tot inzage kan worden gedaan in de bij de RvIG aanwezige persoonsgegevens.", + "human_intervention": "Op grond van de Wet BRP zijn nadere regels gesteld over de maatregelen om menselijke tussenkomst te waarborgen bij de ontwikkeling van profielen. Tijdens het ontwikkelen van het algoritme is advies gevraagd aan een representatieve vertegenwoordiging van de gemeenten en aangewezen bestuursorganen. Er worden om die reden geen persoonsgegevens verwerkt (geanalyseerd) voordat dit is besproken met de betrokken partijen. In de meeste gevallen wordt daarnaast ook de Autoriteit Persoonsgegevens (AP) om advies gevraagd.\n\nEr is geen sprake van automatische besluitvorming. Algoritmes zijn een middel en zijn niet leidend. De beoordeling en beslissingen worden uiteindelijk altijd door mensen gedaan. De gemeente doet, voordat zij een huisbezoek aflegt, altijd nog een eigen adresonderzoek.", + "risks": "De persoonlijke levenssfeer komt mogelijk in het gedrang, door het verwerken van persoonsgegevens en het afleggen van een huisbezoek door gemeenten.", + "performance_standard": "Trefkans is minimaal 50%", + "create_dt": "2023-03-31 08:34:12.459134+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "76222623", + "owner": "rijksdienst-voor-identiteitsgegevens", + "leverancier_id": null + }, + { + "name": "Permanente Monitor Dubbelinschrijvingen (PMD)", + "organization": "Rijksdienst voor Identiteitsgegevens (RvIG)", + "department": "Directie Uitvoering, afdeling Onderzoek & Analyse", + "description_short": "In het inschrijvingsproces kunnen fouten optreden. De Permanente Monitor Dubbelinschrijvingen is een set van profielen die wekelijks dubbelinschrijvingen zoekt in de BRP.", + "type": "Voorschrijvend algoritme", + "category": "Basisregistratie", + "website": "https://www.rvig.nl/documenten/publicaties/2017/08/22/voorkom-dubbelinschrijvingen-in-de-brp ", + "status": "In gebruik", + "goal": "Het doel van de algoritmen is dubbelinschrijvingen te vinden zodat ze kunnen worden gecontroleerd en misschien gecorrigeerd. Met als doel de kwaliteit van de BRP te verbeteren.", + "impact": "De inschrijving van de burger in de BRP kan worden be\u00efnvloed. Eerst wordt door een deskundige gecontroleerd of het een dubbelinschrijving betreft vervolgens wordt, indien mogelijk, contact gezocht met de burger en in samenspraak wordt een van de persoonslijsten afgevoerd.", + "proportionality": "Doormiddel van een set aan overeenkomsten tussen persoonslijsten is het mogelijk de BRP te controleren op dubbelinschrijvingen. Hierbij wordt op empirische wijze zwakheden in het inschrijvingsproces gecontroleerd waarbij tegelijk ongevoeligheid wordt ingebouwd voor inschrijvingen (bijv. tweelingen) die wel in veel opzichten lijken op dubbelinschrijvingen maar het niet zijn.", + "decision_making_process": "De kwaliteit van de BRP zo hoog mogelijk te houden.", + "documentation": "https://www.rvig.nl/documenten/publicaties/2017/08/22/voorkom-dubbelinschrijvingen-in-de-brp", + "competent_authority": "Ministerie van Binnenlandse Zaken en Koninkrijkrelaties, Rijksdienst voor Identiteitsgegevens", + "lawful_basis": "De wettelijke grondslag voor een kwaliteitsinstrument als PMD zou moeten voortvloeien uit artikel 1.9 derde lid, artikel 1.11 tweede lid en artikel 4.3 derde lid van de Wet BRP.", + "iama": null, + "iama_description": null, + "dpia": "Nee", + "dpia_description": "n.v.t.", + "objection_procedure": "\u00a0", + "standard_version": "0.1.0", + "uuid": "\u00a0", + "url": "\u00a0", + "contact_email": "info@rvig.nl", + "area": "Nederland", + "lang": "Nederlands", + "revision_date": "2022-10-13 00:00:00", + "description": "In het inschrijvingsproces kunnen fouten optreden. Een inschrijving kan op basis van onvolledige gegevens, foutieve interpretatie van gegevens of ontbrekende documenten resulteren in een extra inschrijving van die persoon of persoonsnummers kunnen al zijn gebruikt in een andere persoonslijst. In beide gevallen zal moeten worden nagegaan welke van de inschrijvingen juist is of welk nummer bij de persoonslijst hoort. De Permanente Monitor Dubbelinschrijvingen is een set van profielen die wekelijks dubbelinschrijvingen zoekt in de BRP.", + "application_url": null, + "publiccode": null, + "mprd": "Ja", + "source_data": "De BRP", + "methods_and_models": "\\\\datadfs.frd.shsdir.nl\\orgData\\BZK\\RVIG\\Stelsels\\Analyseteam\\PMD\\Rapportages\\Algoritmeregister\\PMD_zoekprofielen.pdf", + "monitoring": "Er wordt bij gehouden hoeveel dubbelen een profiel vindt en hoeveel daarvan door een deskundige worden beoordeeld als dubbelopname. Wanneer van veel gevonden dubbelen het oordeel is dat het geen dubbelopname is wordt het profiel uit productie genomen om zo de beoordelaars te ontzien. Tegelijkertijd wordt gelet op dubbelinschrijvingen die niet door PMD worden gevonden en zo nodig wordt daar een nieuw profiel voor ontwikkeld.", + "human_intervention": "De PMD-algoritmen worden gebruikt om op een reproduceerbare manier persoonslijsten met elkaar te vergelijken. Of er een dubbelopname is gevonden wordt bepaald door een beoordelaar van RvIG. Wanneer van oordeel is dat het een dubbelopname betreft worden de persoonslijsten voorgelegd aan de gemeente(n) waarin de personen is/zijn ingeschreven, deze kan alsnog tot het oordeel komen dat het geen dubbelopname betreft en geen wijziging aanbrengen.", + "risks": "Het onterecht afvoeren van een BRP-inschrijving.", + "performance_standard": "Er wordt een globale prestatie norm gebruikt. Als een profiel relatief veel niet-dubbelen oplevert wordt het uit productie gehaald, over het geheel wordt rond de 90% van de gevonden dubbelen als daadwerkelijk dubbel beoordeeld.", + "create_dt": "2023-03-31 08:34:12.464172+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "76218516", + "owner": "rijksdienst-voor-identiteitsgegevens", + "leverancier_id": null + }, + { + "name": "Geautomatiseerde gezichtsvergelijking bij het RNI-inschrijfproces. ", + "organization": "Rijksdienst voor Identiteitsgegevens (RvIG)", + "department": "Directie Informatievoorziening en Systemen, afdeling Identiteitssystemen", + "description_short": "Algoritme dat de inschrijver kan helpen om \u201clook-alike-fraude\u201d te voorkomen.", + "type": "Zelflerend", + "category": "Basisregistratie", + "website": "\u00a0", + "status": "In gebruik", + "goal": "Het algoritme is ontwikkeld om het gezicht van de persoon die voor de balie staat te vergelijken met de afbeelding in zijn identiteitsdocument en om aan te kunnen geven met welke zekerheid gesteld kan worden dat de persoon weergegeven op de afbeelding van het gescande identiteitsdocument dezelfde persoon is (of niet).\nDit algoritme ondersteunt de RNI-medewerker aan de balie zodat deze met enige zekerheid kan vaststellen of de persoon aan de balie ook de persoon is van wie het identiteitsdocument gescand is.", + "impact": "Als de applicatie met gebruik van het algoritme aangeeft dat de persoon wiens identiteitsdocument gescand is niet de persoon is die aan de balie staat, dan zal de RNI-medewerker zelf moeten beslissen of dit terecht is of niet. De RNI-medewerker aan de balie is uiteindelijk de eindverantwoordelijke. Als hij de afwijzing door het algoritme terecht vindt, dan wordt de aanvraag tot inschrijving in de BRP door de burger afgewezen. Hierbij kan bij deze afwijzing aangegeven worden of er en vermoeden is van fraude.", + "proportionality": "De inzet van dit algoritme helpt de RNI-medewerker met het vaststellen van de identiteit van de burger aan de balie.", + "decision_making_process": "\u00a0", + "documentation": "https://www.cognitec.com/facevacs-technology.html of https://www.oribi.nl/nl/problematiek/identiteitsfraude ", + "competent_authority": "Ministerie van Binnenlandse Zaken en Koninkrijkrelaties", + "lawful_basis": "Wettelijke verplichting tot deugdelijke identiteitsvaststelling:\nWet BRP art. 2.67 4de lid, Besluit BRP art.35\nToelaatbaarheid van biometrie:\nUAVG art. 29, in voorliggende situatie is authenticatie noodzakelijk ", + "iama": null, + "iama_description": null, + "dpia": "Ja", + "dpia_description": "De Rijksdienst voor Identiteitsgegevens (RvIG) beheert de persoonsgegevens van niet-ingezetenen in de Registratie Niet-ingezetenen (RNI). De RNI is bedoeld voor personen die hun woonadres in het buitenland hebben en een relatie hebben met de Nederlandse overheid.\nPersonen die niet in aanmerking komen om als ingezetene te worden ingeschreven, kunnen worden ingeschreven in de RNI. Inschrijven in de RNI of het wijzigen van persoonsgegevens gebeurt op verzoek van de persoon zelf bij een RNI-loket of op verzoek van een aangewezen bestuursorgaan.\n\nEen belangrijk onderdeel van de inschrijving in de RNI is het vaststellen van de identiteit van een persoon op basis van een geldig identiteitsdocument. Naast het controleren van de echtheid van het document wordt ook beoordeeld of het document wel bij de eigenaar hoort. Daarvoor wordt de foto op het document met de aanwezige persoon vergeleken. Gezichtsvergelijking is moeilijk en de mens kan hierin fouten maken. Uit onderzoek blijkt dat de ondersteuning met geautomatiseerde gezichtsvergelijking tot betere resultaten leidt. Daarom faciliteert het ministerie de aanschaf van gezichtsvergelijkingssystemen door de RNI-loketten. Gemeenten kunnen zelf kiezen welke hard- en software zij gebruiken.\n\nHet geautomatiseerd verwerken van een foto met als doel unieke identificatie betekent dat er volgens de AVG een bijzondere categorie van persoonsgeven verwerkt wordt. Daarom wordt voor deze uitbreiding op het proces van inschrijving in de RNI een aanvullende gegevensverwerkingseffectbeoordeling uitgevoerd. ", + "objection_procedure": "\u00a0", + "standard_version": "0.1.0", + "uuid": "\u00a0", + "url": "\u00a0", + "contact_email": "info@rvig.nl", + "area": "Nederland", + "lang": "Nederlands", + "revision_date": "2022-10-13 00:00:00", + "description": "Bij de inschrijving van een burger in de RNI, wordt gebruik gemaakt van een scanoplossing.\nDeze scanoplossing bestaat uit een ID-scanner, een A4 scanner, een scanserver, een kleine monitor en sinds februari 2021 ook uit een gezichtsscanner.\nDeze scanoplossing ondersteunt de RNI-medewerker bij het inschrijfproces en sinds het gebruik van de gezichtsscanner ook bij het vaststellen van de identiteit. De gegevens van het gescande identiteitsdocument worden op de kleine monitor getoond en als er geen bijzonderheden zijn, dan gaan de gescande gegevens van de scanoplossing naar de RNI applicatie. De gegevens die gebruikt worden voor het vaststellen van de identiteit worden niet doorgegeven aan de RNI applicatie, maar het resultaat wordt op de kleine monitor weergegeven.\nDe gegevens uit het gescande identiteitsdocument worden na akkoord van de RNI-medewerker gebruikt bij de inschrijving in RNI. Van de uitgevoerde gezichtsscan wordt aan RNI alleen in een logregel doorgegeven dat deze is uitgevoerd en wat het resultaat hiervan is geweest. Dit resultaat kan zijn: \u2018De gezichten zijn hetzelfde\u2019 of \u2018De gezichten zijn niet hetzelfde\u2019.", + "application_url": "\u00a0", + "publiccode": "\u00a0", + "mprd": "Ja", + "source_data": "\u00a0", + "methods_and_models": "Deep learning. Advanced face recognition APIs: C++, Java, Microsoft .NET, BioAPI 2.0 Verification Engine (C API). Gedocumenteerde voorbeelden voor de belangrijkste use cases en specifieke implementaties. Hulpmiddelen voor biometrische evalusaties, waaronder genereren van \u2018identification match\u2019 overzichten en \u2018similarity matrix\u2019 data. ", + "monitoring": "Niet bekend", + "human_intervention": "Uiteindelijk bepaalt de RNI-medewerker of hij de gezichtsscan wil gebruiken en wat hij met het resultaat van de gezichtsscan doet in het proces.", + "risks": "Een risico is een kans op het optreden van een negatief gevolg voor de rechten en vrijheden van de betrokkenen als gevolg van de verwerking van persoonsgegevens. Echter omdat in de beschreven situatie geen opslag nodig is (want gezichtsopname is alleen gedurende het proces van identiteitsvaststelling in het systeem geregistreerd en voor de medewerkers van het RNI-loket zichtbaar), is het risico op lekken of manipuleren van de gezichtsopname klein. ", + "performance_standard": "De NIST tests worden gebruikt ter evaluatie van de performance", + "create_dt": "2023-03-31 08:34:12.469399+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "18814864", + "owner": "rijksdienst-voor-identiteitsgegevens", + "leverancier_id": null + }, + { + "name": "Kadastrale kaart next", + "organization": "Kadaster", + "department": "programmateam Kadastrale kaart next", + "description_short": "Met artificial intelligence (kunstmatige intelligentie) bouwen we de kadastrale kaart opnieuw op. Hiervoor gebruiken we scans van originele historische veldwerken.", + "type": "Zelflerend", + "category": "wonen, werken en leefomgeving", + "website": "-", + "status": "in gebruik", + "goal": "De Kadastrale kaart next is een verbeterde kadastrale kaart. Op deze kaart zie je de grenzen zoveel mogelijk zoals ze ook in werkelijkheid zijn. We gebruiken hiervoor de oorspronkelijke meetgegevens, dus oude veldwerken. Ook maken we gebruik van algoritmen en kunstmatige intelligentie. Zo kunnen we het proces automatiseren. Op die manier besparen we kosten en zorgen we voor een nauwkeurigere Kadastrale kaart: de Kadastrale kaart next.", + "impact": "Met deze toepassing kunnen we een Kadastrale kaart next maken. Deze kaart wordt gebruikt door medewerkers van het Kadaster en aanbestedingspartners. Burgers kunnen tegen betaling een Kadastrale kaart opvragen bij het Kadaster. De Kadastrale kaart next komt dus beter overeen met de werkelijkheid.\n", + "proportionality": "-", + "decision_making_process": "-", + "documentation": "-", + "competent_authority": "Kadaster", + "lawful_basis": "In artikel 74 Kadasterwet staat dat het Kadaster mag onderzoeken of gegevens uit de basisregistratie kadaster juist en volledig zijn. In artikel 23 Kadasterbesluit < https://wetten.overheid.nl/BWBR0005259/2019-07-01/#Hoofdstuk3_Titeldeel4_Artikel23 > staat dat er een onderzoek van vernieuwing mag worden gedaan, als blijkt dat gegevens niet voldoende juist en volledig zijn. Er is dus nog geen wettelijke grondslag of basis voor de Kadastrale Kaart Next. Daarom willen we artikel 23 aanpassen. Zo kunnen we een stap verder gaan en de Kadastrale kaart vernieuwen.\n", + "iama": null, + "iama_description": null, + "dpia": "niet aanwezig", + "dpia_description": "We gebruiken veldwerken om het algoritme te \u2018trainen\u2019. Op deze veldwerken staan soms persoonsgegevens, maar die worden niet gebruikt. Deze gegevens worden niet omgezet naar een vectorbestand. Dit is een bepaald formaat, waarin we geometrische gegevens kunnen opslaan. Verder worden de gegevens uit de veldwerken opgeslagen in een database. De opgeslagen data bestaat alleen uit cijfers.\n", + "objection_procedure": "-", + "standard_version": "0.1.0", + "uuid": "volgt", + "url": "volgt", + "contact_email": "https://formulieren.kadaster.nl/contact_kadaster_algoritmeregister", + "area": "Nederland", + "lang": "Nederlands", + "revision_date": "2023-12-01 00:00:00", + "description": "Voor een n\u00f3g nauwkeurigere kaart\nHoe ligt een perceel ten opzichte van andere percelen? Dat is wat u ziet op de Kadastrale kaart. Die is gemaakt op basis van bijna 200 jaar meten. Maar er kunnen kleine onnauwkeurigheden ontstaan:\n1) De kaart is op schaal gemaakt. Daardoor kunnen de co\u00f6rdinaten iets verschuiven: op de kaart liggen ze dan iets anders dan in het terrein.\n2) Bovendien moesten de oorspronkelijk losse kaarten aan elkaar verbonden worden. Ook dat kan voor onnauwkeurigheden zorgen.\n\nAlle kadastrale grenzen opnieuw opbouwen\nBij de Kadastrale Kaart Next bouwen we alle kadastrale grenzen opnieuw op. Dat doen we op basis van historische veldwerken. Dit zijn situatieschetsen met gegevens die een landmeter maakte toen de grens werd vastgesteld.\n\nGeautomatiseerd verwerken met kunstmatige intelligentie\nVoor de verwerking van de veldwerken gebruiken we kunstmatige intelligentie. Bijvoorbeeld bij de interpretatie van de met de hand geschreven meetgegevens. Door dit te automatiseren kunnen we kosten \u00e9n tijd besparen.", + "application_url": "https://git.dev.cloud.kadaster.nl/rec/rec-vector", + "publiccode": null, + "mprd": "Er is een koppeling met de Basisregistratie Kadaster (BRK, IMKAD). De grenzen hebben een relatie met rijks-, provincie en gemeentegrenzen.", + "source_data": "Wij hebben een set veldwerken gebruikt, die kenmerkend is voor ons archief. Die set bestaat uit verschillende regio\u2019s en tijdsperiodes. Dan is er nog een set voor OCR: het omzetten van handgeschreven teksten naar informatie die de computer kan lezen. Deze set bestaat uit ongeveer 200.000 veldwerken. De end-to-end set voor lijn- en objectdetectie bestaat uit 3.000 veldwerken.", + "methods_and_models": "Het algoritme gebruikt aparte neurale netwerken voor de OCR, lijndetectie en objectdetectie:\n* voor de OCR gebruiken we een NN, dat bestaat uit CNN- en RNN-lagen\n* de lijndetectie gebeurt op basis van een aangepast UNET\n* de objectdetectie gebeurt met een MaskRCNN op basis van de SWIN transformer architectuur\n\nDeze modellen zijn getraind op basis van veldwerk (componenten) en annotaties. Annotaties zijn notities met een opmerking of uitleg. De beschikbare dataset splitsen we op in train, validatie en test-sets. De traindata augmenteren we tijdens het trainen om een veelzijdige trainset te maken. Tijdens het trainen bepalen we na elke iteratie de F-score op de validatie-set. Zodra de performance op de validatie-set niet meer verbetert, stoppen we met het trainen. Daarna bepalen we de F-score op de test-set. Is deze F-score beter dan vorige trainingen? Dan gebruiken we de gewichten van het neurale netwerk voor de voorspellingen.", + "monitoring": "De modellen worden gevalideerd op de testset en daarbij wordt een F-score berekend. Gedurende het proces worden deze scores bijgehouden met als doel om het algoritme steeds beter te maken (tussentijdse scores). Aan het einde wordt er gekeken naar de vereffening. Er is een ondergrens waar de vereffening aan moet voldoen (zelfde waarde als het handmatig proces) anders wordt het afgewezen.", + "human_intervention": "Human on the loop. Dit betekent dat AI wordt toegepast in een automatisch proces. Zijn er afwijkingen? Dan controleren mensen het resultaat en passen dit aan als dat nodig is.", + "risks": "minimaal risico", + "performance_standard": "De verwachte prestaties van de modellen verschillen per taak. Wij verwachten dezelfde performance te halen als op onze test-set. De test-set bevat een selectie veldwerken, die kenmerkend zijn voor ons archief. We evalueren de behaalde prestaties opnieuw als we een model trainen. Zo garanderen wij dat de performance voldoende is. Is het model niet correct? Dan passen we dit handmatig aan.", + "create_dt": "2023-03-31 08:34:12.474032+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "19331472", + "owner": "kadaster", + "leverancier_id": null + }, + { + "name": "Loki", + "organization": "Kadaster", + "department": "data science team, directie Beheer en Ontwikkeling Informatietechnologie (BOI)", + "description_short": "Hoe helpt een chatbot om informatie uit kadastrale databronnen toegankelijk te maken voor burgers? Dat onderzochten we met Loki.", + "type": "Deels op regels gebaseerd, deels zelflerend", + "category": "wonen, werken en leefomgeving", + "website": "https://labs.kadaster.nl/cases/loki", + "status": "pilot", + "goal": "Met Loki willen we laten zien wat de aangetoonde waarde is van een chatbot bij het opvragen van informatieMet Loki willen we laten zien wat de aangetoonde waarde is van een chatbot bij het opvragen van informatie uit onze data.\n", + "impact": "Bij het Kadaster beheren we verschillende (open) databronnen. Iedereen mag onze data gebruiken: van gemeentes en overheden tot notarissen en makelaars. Maar ook burgers, die geen uitBij het Kadaster beheren we verschillende (open) databronnen. Iedereen mag onze data gebruiken: van gemeentes en overheden tot notarissen en makelaars. Maar ook burgers, die geen uitgebreide kennis hebben van API\u2019s en Linked Data. Ook zij willen informatie uit onze data, zoals het bouwjaar van hun huis is of waar hun perceel ligt.\n\nAls Kadaster willen we dat iedereen deze vragen kan stellen: in spraak \u00e9n in natuurlijke taal. We willen geen antwoord geven in cijfers, maar in taal. Daarbij halen we onze informatie vaak niet uit 1 bron, maar uit meerdere bronnen. Dat geeft burgers een juist en volledig antwoord.", + "proportionality": "Virtuele assistenten, zoals Siri, Alexa en de Google Assistent worden steeds populairder. Daarin spreekt de gebruiker een vraag in of wordt de vraag niet ingetypt. Daarnaast ontwikkelen we de Kadaster Knowledge Graph. Hierdoor ontstaan allerlei nieuwe inzichten over hoe we in de tVirtuele assistenten, zoals Siri, Alexa en de Google Assistent worden steeds populairder. Daarin spreekt de gebruiker een vraag in of wordt de vraag niet ingetypt. Daarnaast ontwikkelen we de Kadaster Knowledge Graph. Hierdoor ontstaan allerlei nieuwe inzichten over hoe we in de toekomst data moeten presenteren. We willen onderzoeken hoe we de data het beste kunnen presenteren.\n", + "decision_making_process": "-", + "documentation": "https://labs.kadaster.nl/cases/loki", + "competent_authority": "Kadaster", + "lawful_basis": "In artikel 2a lid c Kadasterwet staat: \u201ceen doelmatige informatievoorziening van de overheid ten behoeve van de goede vervulling van publiekrechtelijke taken en de nakoming van wettelijke verplichtingen door bestuursorganen\u201d. \nKortom, wij willen onze informatie beschikbaar maken voor een zo groot mogelijk publiek. Dus ook aan burgers.", + "iama": null, + "iama_description": null, + "dpia": "-", + "dpia_description": "-", + "objection_procedure": "-", + "standard_version": "0.1.0", + "uuid": "volgt", + "url": "volgt", + "contact_email": "https://formulieren.kadaster.nl/contact_kadaster_algoritmeregister", + "area": "Nederland", + "lang": "Nederlands", + "revision_date": "2023-12-01 00:00:00", + "description": "Chatbot, die in natuurlijke taal antwoordt\nVirtuele assistenten als Siri, Alexa en Google Assistent worden steeds populairder. Als gebruiker spreek je je vraag in en je krijgt direct antwoord. Kunnen wij bij het Kadaster ook zo\u2019n chatbot ontwikkelen? Een chatbot die gebruikmaakt van onze databronnen en antwoord geeft op vragen als: wat is het bouwjaar van mijn huis? En waar ligt mijn perceel precies?\n\nInformatie uit meerdere bronnen\nBij het Kadaster beheren we meerdere databronnen, zoals de BAG, BRK en BRT. Als burgers iets vragen, dan komt het antwoord meestal niet uit 1 bron. Vaak zijn combinaties van meerdere bronnen nodig. Op die manier kun je juiste en volledige antwoorden geven aan gebruikers.\n\nLoki 3.0 is in ontwikkeling\nLoki is een chatbot, die natuurlijke taal gebruikt om vragen van burgers te beantwoorden. Loki gebruikt meerdere bronnen voor het beste antwoord. Op dit moment werken we aan een bruikbare versie voor burgers: Loki 3.0.", + "application_url": "https://labs.kadaster.nl/cases/loki", + "publiccode": null, + "mprd": "* BAG: Basisregistratie Adressen en GebouBAG: Basisregistratie Adressen en Gebouwen\n* BRK: Basisregistratie Kadaster (Kadastrale kaart)\n* BRT: Basisregistratie Topografie\n* WOZ: Waardering Onroerende Zaken", + "source_data": "Loki maakt gebruik van openbare gegevens in de BAG, BRK (Kadastrale kaart), BRT en WOZ", + "methods_and_models": "1) chatbot framework Rasa\n2) speech-to-text API van Microsoft Azure\n3) knowledge graph voor het verbinden data uit verschillende registraties en SPARQL-endpoints", + "monitoring": "Hoe kunnen we het gebruik van Loki monitoren? Daarvoor hebben wij een database gemaakt. Hiermee kunnen we de gesprekken tussen Loki en de gebruikers opslaan. Aan de hand van deze data zien wij welke taal burgers gebruiken. En we kunnen Loki leren om op deze manier te reageren. Zo zorgen we ervoor dat het taalgebruik van Loki aansluit op dat van de gebruikers: natuurlijke taal.\n\nDaarnaast kunnen we hiermee de klantbehoefte van Loki in kaart brengen. Welke vragen stellen gebruikers nu aan ons? En hoe stellen zij deze? Het development team ontwikkelde een dashboard. Hiermee krijgen ze inzichten in de antwoorden op deze vragen.", + "human_intervention": "-", + "risks": "minimaal risico", + "performance_standard": "-", + "create_dt": "2023-03-31 08:34:12.478386+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "48536774", + "owner": "kadaster", + "leverancier_id": null + }, + { + "name": "Transfer", + "organization": "Kadaster", + "department": "Landinrichting, directie Operatie, Dienstverlening en Registratie (ODR)", + "description_short": "Bij landinrichting komen de wensen en belangen van veel partijen samen, zoals boeren, natuurbeheerorganisaties en overheden. In Transfer voeren we al deze de wensen en belangen in. Op basis hiervan geeft Transfer de beste mogelijke oplossing om een gebied opnieuw in te richten.", + "type": "Op regels gebaseerd", + "category": "landbouw, natuur en voedsel", + "website": "-", + "status": "in gebruik", + "goal": "Transfer helpt om ingewikkelde vraagstukken op het gebied vTransfer helpt om ingewikkelde vraagstukken op het gebied van landinrichting op te lossen.\n", + "impact": "Transfer is een hulpmiddel wat wordt ingezet in een wettelijk traject. De gevolgen voor de belanghebbenden en de samenleving zijn geborgd in de wetgeving. ", + "proportionality": "Met Transfer kunnen we een ingewikkeld vraagstuk objectief behandelen.", + "decision_making_process": "De voorganger van Transfer is ontwikkeld in de jaren 70 van de vorige eeuw. Transfer is gebaseerd op onderzoeken van de TU Delft.", + "documentation": ",-", + "competent_authority": "Dit is de opdrachtgever van een landinrichtingsproject. Meestal is dit de provincie. Soms doet het Kadaster ook zelf onderzoek.", + "lawful_basis": "Dit is in de uitvoeringsfase Dit is in de uitvoeringsfase de Wilg. Lees meer op de pagina pagina Verkavelen met de Wilg .", + "iama": null, + "iama_description": null, + "dpia": "-", + "dpia_description": "-", + "objection_procedure": "Wetgeving beschermt de belangen van burgers.\n", + "standard_version": "0.1.0", + "uuid": "volgt", + "url": "volgt", + "contact_email": "https://formulieren.kadaster.nl/contact_kadaster_algoritmeregister", + "area": "Nederland", + "lang": "Nederlands", + "revision_date": "2023-12-01 00:00:00", + "description": "Objectief de beste oplossing bij landinrichting\nWe willen steeds vaker de natuur de ruimte geven. Maar tegelijkertijd spelen ook de belangen van bijvoorbeeld boeren en provincies mee. Het is niet gemakkelijk om land opnieuw in te richten. Bij landinrichting en ruilverkaveling hebben veel partijen allemaal wensen. Transfer is een algoritme dat helpt om op objectieve wijze op zoek te gaan naar de best mogelijke oplossing voor iedereen.\n\nTransfer doorloopt altijd 3 fases\n1) In de voorfase regelen we de modellen in.\n2) In de planfase onderzoeken we de belangen en voornemens van betrokken partijen, zoals boeren, natuurbeheerorganisaties en overheden. We onderzoeken ook hoe we al deze belangen en voornemens met elkaar in evenwicht kunnen brengen.\n3) In de uitvoeringsfase voeren we de wensen van betrokkenen in. Transfer gebruikt hiervoor een bepaald abstractieniveau. Dat wil zeggen dat we niet met percelen rekenen, maar met grotere eenheden, zogenaamde blokdelen. Bedrijfsdelen voegen we samen tot logische eenheden.\n\nHet resultaat?\nOp basis van de wensen van alle betrokken partijen en het wettelijke kader berekent Transfer de best mogelijke nieuwe situatie. Doordat het een algoritme is, is het zo objectief mogelijk. Hiermee helpt Transfer om ingewikkelde vraagstukken op het gebied van landinrichting op te lossen.", + "application_url": "-", + "publiccode": "-", + "mprd": "Er is geen directe koppeling met basisregistraties. Wel wordt data afgeleid uit de BRK, de Basisregistratie Kadaster.", + "source_data": "De data komt van rechthebbenden (volgens de Kadastrale registratie, maar ook bijvoorbeeld pachters). Verder gebruiken we: kaarten en de wensen en beleidsvoornemens van betrokkenen.\n", + "methods_and_models": "De modellen zijn ontwikkeld op basis van onderzoeken van de TU Delft. Het is een optimaliseringsalgoritme. Dit betekent dat de beste optie wordt gekozen uit alle mogelijke oplossingen. Daarbij is sprake van een beperkte set van mogelijkheden. Transfer maakt dus geen nieuwe opties aan, maar zoekt de beste uit bestaande opties.\n", + "monitoring": "-", + "human_intervention": "Human in the loop. Transfer is een hulpmiddel om tot de uiteindelijke oplossing te komen. ", + "risks": "minimaal risico", + "performance_standard": "-", + "create_dt": "2023-03-31 08:34:12.482769+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "25625149", + "owner": "kadaster", + "leverancier_id": null + }, + { + "name": "Akte AI", + "organization": "Kadaster", + "department": "team Akte AI, directie Beheer en Ontwikkeling Informatietechnologie (BOI)", + "description_short": "Akte AI zorgt ervoor dat data uit notari\u00eble akten automatisch wordt overgenomen. De medewerker die de akte verwerkt hoeft de gegevens alleen nog maar te controleren en eventueel aan te passen.", + "type": "Deels op regels gebaseerd, deels zelflerend", + "category": "wonen, werken en leefomgeving", + "website": "-", + "status": "in gebruik", + "goal": "Met Akte AI willen we akten zo snel mMet Akte AI willen we akten zo snel mogelijk en zo juist mogelijk kunnen verwerken. Het helpt ons om effici\u00ebnt te werken en de kwaliteit van de akteverwerking te verbeteren.", + "impact": "Akte AI heeft geen directe impact op burgers. Het gaat om het verbeteren van ons interne procAkte AI heeft geen directe impact op burgers. Het gaat om het verbeteren van ons interne proces. Wel worden akten sneller verwerkt en maken we hierbij minder fouten.", + "proportionality": "Akte AI heeft geen negatieve gevolgen voor de maatschappij. Het proces is zo ingericht dat de rechtszekerheid niet minder wordt en waarschijnlijk zelfs beter wordt.\n", + "decision_making_process": "-", + "documentation": "-", + "competent_authority": "Kadaster", + "lawful_basis": "Volgens artikel 3 lid 1a Kadasterwet < https://wetten.overheid.nl/BWBR0004541/2021-07-01/#Hoofdstuk1_Artikel3> is het onze wettelijke taak om de Basisregistratie Kadaster te beheren en bij te werken. Daar helpt Akte AI bij. ", + "iama": null, + "iama_description": null, + "dpia": "Er is geen eigen DPIA. Wel is Akte AI onderdeel van de DPIA voor akteverwerking.", + "dpia_description": "Er zijn geen aanvullende aandachtspunten voor Akte AI.", + "objection_procedure": "Zijn de gegevens uit de akten gecontroleerd en verwerkt in de Basisregistratie Kadaster? Dan krijgt de betrokkene een kennisgeZijn de gegevens uit de akten gecontroleerd en verwerkt in de Basisregistratie Kadaster? Dan krijgt de betrokkene een kennisgeving. Als gegevens niet juist zijn, dan is er een terugmeldprocedure. Kijk voor meer informatie op de pagina Fout in registratie melden (terugmelding doen) .", + "standard_version": "0.1.0", + "uuid": "volgt", + "url": "volgt", + "contact_email": "https://formulieren.kadaster.nl/contact_kadaster_algoritmeregister", + "area": "Nederland", + "lang": "Nederlands", + "revision_date": "2023-12-01 00:00:00", + "description": "Helpt akten geautomatiseerd verwerken\nHet Kadaster houdt de Basisregistratie Kadaster bij. Dat doen we op basis van informatie in notari\u00eble leverings- of hypotheekakten. Akte AI helpt ons daarbij door informatie geautomatiseerd op te halen uit de akten.\n\nWelke informatie haalt Akte AI op uit de akten?\n* wie de koper is\n* wie de verkoper is\n* om welke onroerende zaak het gaat, zoals een huis of perceel\n* om welke rechtsfeiten het gaat, zoals de vestiging van een hypotheek in een akte\n\nEen medewerker controleert de gegevens\nAlle gegevens worden verzameld door dit algoritme. Dat helpt de medewerker die de akte verwerkt. De medewerker controleert de data en bepaalt of de informatie wordt overgenomen (of niet). Na het verwerken zijn de gegevens opgenomen in de Basisregistratie Kadaster.", + "application_url": null, + "publiccode": null, + "mprd": "Akte AI maakt geen gebruik van koppelingen met basisregistraties.\n", + "source_data": "Voor het herkennen van persoonsgegevens gebruiken we \"bert-base-dutch-cased-finetuned-sonar-ner\". Dit is een open source taalmodel van de Rijksuniversiteit Groningen.\n\nVoor het herkennen van de andere data gebruiken we modellen die we zelf hebben getraind. En algoritmen die we zelf hebben ontwikkeld.Voor het herkennen van persoonsgegevens gebruiken we \"bert-base-dutch-cased-finetuned-sonar-ner\". Dit is een open source taalmodel van de Rijksuniversiteit Groningen.\nVoor het herkennen van de andere data gebruiken we modellen die we zelf hebben getraind. En algoritmen die we zelf hebben ontwikkeld.\n\nOver de trainingssets\nDe trainingssets bestaan uit akteteksten. Die zijn op dit moment nog statisch en vari\u00ebren in grootte: van enkele honderden tot enkele tienduizenden teksten per set.\nVerder werken we aan een feedback-loop. Hiermee is het geen statische set meer: iedere maand wordt dan 8,33% ververst. Er verdwijnen dan teksten en hier komen nieuwe akteteksten voor terug.", + "methods_and_models": "* Named Entity Recognition van persoonsnamen met Hugging Face Transformers\n* Named Entity Recognition van organisatienaam, adres en rechtsvorm met het spaCy framework\n* Dependency Parsing van personen, organisaties, onroerende zaken, notarissen, rechtsfeiten en ondertekening met het spaCy framework\n* Named Entity Recognition van de omschrijving van de onroerende zaak met het spaCy framework\n* Named Entity Recognition voor het splitsen van persoonsnamen in voornaam, tussenvoegsel en achternaam met het spaCy framework\n* Named Entity Recognition voor het splitsen van een adres in straat, huisnummer, huisletter, en toevoeging met het spaCy framework\n* Classificatie van type akte met het spaCy framework\n* De zelf ontwikkelde algoritmen maken onder andere gebruik van:\n * reguliere expressies\n * spaCy pattern matchersNamed Entity Recognition van persoonsnamen met Hugging Face Transformers\n", + "monitoring": "Wij werken met een 5% controle. Dit betekent dat een onafhankelijk team 5% van alle verwerkte akten controleert.", + "human_intervention": "Human in the loop. De Akte AI doet een suggestie aan de medewerker die de data verwerkt. Er is dus altijd een medewerker, die de suggestie beoordeelt.", + "risks": "minimaal risico", + "performance_standard": "We willen graag dat de akte zo snel mogelijk verwerkt wordt. Daar sturen wij op.", + "create_dt": "2023-03-31 08:34:12.487076+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "58455861", + "owner": "kadaster", + "leverancier_id": null + }, + { + "name": "Rechtsfeiten KIK 2e deel", + "organization": "Kadaster", + "department": "team akte AI, directie Beheer en Ontwikkeling Informatietechnologie (BOI)", + "description_short": "Dit algoritme herkent inschrijfbare rechtsfeiten in het 2e deel van KIK-akten.", + "type": "Op regels gebaseerd", + "category": "wonen, werken en leefomgeving", + "website": "-", + "status": "in gebruik", + "goal": "Met dit algoritme willen we akten zo snel mogelijk en zo juist mogelijk kunnen verwerken. Het helpt ons om effici\u00ebnt te werken en de kwaliteit van de akteverwerking te verbeteren.", + "impact": "Rechtsfeiten KIK 2e deel heeft geen directe impact op burgers. Het gaat om het verbeteren vanRechtsfeiten KIK 2e deel heeft geen directe impact op burgers. Het gaat om het verbeteren van ons interne proces. Wel worden akten sneller verwerkt en maken we hierbij minder fouten.\n", + "proportionality": "Rechtsfeiten KIK 2e deel heeft geen negatieve gevolgen voor de maatschappij. Het proces is zo ingericht dat de rechtszekerheid niet minder wordt en waarschijnlijk zelfs beter wordt.\n", + "decision_making_process": "-", + "documentation": "-", + "competent_authority": "Kadaster", + "lawful_basis": "Volgens artikel 3 lid 1a Kadasterwet is het onze wettelijke taak om de Basisregistratie Kadaster te beheren en bij te werken. Daar helpt dit algoritme bij.", + "iama": null, + "iama_description": null, + "dpia": "Er is geen DPIA nodig, want we gebruiken geen persoonsgegevens.", + "dpia_description": "-", + "objection_procedure": "Zijn de gegevens uit de akten gecontroleerd en verwerkt in de Basisregistratie Kadaster? Dan krijgt de betrokkene een kennisgeving. Als gegevens niet juist zijn, dan is er een terugmeldprocedure. Kijk voor meer informatie op de pagina Fout in registratie melden (terugmelding doen) .", + "standard_version": "0.1.0", + "uuid": "volgt", + "url": "volgt", + "contact_email": "https://formulieren.kadaster.nl/contact_kadaster_algoritmeregister", + "area": "Nederland", + "lang": "Nederlands", + "revision_date": "2023-12-01 00:00:00", + "description": "Automatisch akten controleren op rechtsfeiten\nWie in Nederland een huis koopt, laat hiervan een akte maken bij de notaris. De notaris stuurt die akte vervolgens naar het Kadaster. Wij kunnen de informatie uit de akte dan verwerken in de kadastrale registers: de Basisregistratie Kadaster (BRK). De notaris kan hiervoor KIK (Ketenintegratie Inschrijven Kadaster) gebruiken. KIK is een gestandaardiseerde manier om akten aan te bieden.\n\nEen KIK-akte bestaat uit 2 delen\nDat hebben het notariaat en Kadaster vastgelegd in een convenant.\n* In het 1e deel (het Kadaster deel) staan de inschrijfbare feiten, zoals een levering of een vestiging van een hypotheek.\n* In het 2e deel staan afspraken die niet bij het Kadaster hoeven te worden ingeschreven.\n\nAlgoritme controleert op rechtsfeiten in 2e deel KIK-akte\nToch gaat het soms mis: in het 2e deel staan dan toch inschrijfbare feiten. Het convenant heeft geen wettelijke basis. De rechtsfeiten zijn dan gewoon rechtsgeldig. Omdat KIK-akten automatisch worden verwerkt, zijn die rechtsfeiten dan niet zichtbaar in de Basisregistratie Kadaster. Dat is niet de bedoeling. Daarom controleert dit algoritme in iedere KIK-akte het 2e deel op inschrijfbare rechtsfeiten. Zo komt de Basisregistratie Kadaster overeen met wat in de akte staat.", + "application_url": "-", + "publiccode": "-", + "mprd": "Dit algoritme maakt geen gebruik van koppelingen met basisregistraties.", + "source_data": "We toetsen de regelset op een testset van 83.414 akten. Deze trainingsset is statisch en wordt niet ververst. Dit betekent dat er dus geen nieuwe teksten bijkomen.", + "methods_and_models": "Wij maken gebruik van een set regels (reguliere expressies). Die helpen om inschrijfbare feiten te herkennen. De bewaarder heeft deze gecontroleerd en akkoord gegeven.", + "monitoring": "Wij werken met een 2% controle. Dit betekent dat een onafhankelijk team 2% van alle verwerkte akten controleert.", + "human_intervention": "Human on the loop. Dit algoritme wordt gebruikt in een geautomatiseerd proces. Er is geen directe, handmatige controle. Wij controleren door middel van een steekproef van 2%.", + "risks": "minimaal risico", + "performance_standard": "We willen graag dat de akte zo snel mogelijk verwerkt wordt. Daar sturen wij op.\nDe geautomatiseerde controle moet voldoen aan een norm: 99,5% van de akten moet volledig en correct zijn verwerkt.", + "create_dt": "2023-03-31 08:34:12.491556+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "48553344", + "owner": "kadaster", + "leverancier_id": null + }, + { + "name": "TVL Risicomodel", + "organization": "Ministerie van Economische Zaken en Klimaat, Rijksdienst voor Ondernemend Nederland", + "department": "Kernprocessen NL (KPNL) \\ Project- en Organisatiefinanciering (PROF)", + "description_short": "Het algoritme wordt gebruikt om voor alle aanvragen Tegemoetkoming Vaste Lasten geautomatiseerd een risicoinschatting te maken, voorafgaand aan een geautomatiseerde of handmatige verlening en uitbetaling van het voorschot. ", + "type": "Regelgebaseerd", + "category": "Corona steunmaatregel", + "website": null, + "status": "In gebruik sinds 18-12-2020", + "goal": "Met de inzet van het algoritme wordt het nemen van een besluit versneld, zodat zo veel mogelijk ondernemers op tijd liquiditeitssteun kunnen krijgen. Het algoritme versnelt de besluitvorming voor de toekenning van een tegemoetkoming en het geeft een risico duiding voor de handmatige stroom. ", + "impact": "De inzet van het algoritme bij TVL-aanvragen zorgt ervoor dat de aanvragen van ondernemers snel en doelmatig afgehandeld kunnen worden. Het grootste deel van de ondernemers heeft het geld snel op de rekening staan.\nHet algoritme zorgt ervoor dat laag-risico aanvragen meteen geautomatiseerd verleend of vastgesteld kunen worden.\nWanneer een aanvraag uitvalt naar handmatige controle, moet een medewerker de aanvraag beoordelen. In dat geval duurt het langer voordat er een beslissing wordt genomen over de tegemoetkoming, met als gevolg dat het geld later op de rekening van de ondernemer staat. ", + "proportionality": "In de TVL wordt het risicomodel (het algoritme) gebruikt om alle aanvragen geautomatiseerd te toetsen aan de criteria van de regeling en een risicoclassificatie op oneigenlijk gebruik te maken. Voorafgaand aan de uitbetaling van het voorschot en voor de definitieve vaststelling van de subsidie. Daarmee wordt de besluitvormingsketen versneld, zodat ondernemers zo snel mogelijk liquiditeitssteun kunnen krijgen. \nDe inzet van het risicomodel stelt RVO in staat om over grote hoeveelheid subsidieaanvragen in een zeer korte tijd positief te beslissen, zodat ondernemers die tijdens de corona lockdowns snel vaste lasten steun nodig hebben, dit ook kunnen krijgen. Verder stelt het risicomodel RVO in staat dat slechts positieve besluiten zonder tussenkomst van een medewerker worden behandeld, zodat de medewerkers de overige besluiten sneller kunnen beoordelen. Een vergelijkbaar resultaat zonder de inzet van het risicomodel is bij de voorbereiding van de regeling beoordeeld als niet uitvoerbaar: dit zou een opschaling van grote omvang van gespecialiseerd personeel vergen, die niet op korte termijn is te organiseren. Zelfs als dat wel gelukt was zouden de doorlooptijden voor ondernemers veel langer geweest zijn zonder risicomodel. ", + "decision_making_process": "Uitvoering TVL", + "documentation": "https://www.rvo.nl/subsidies-financiering/tvl", + "competent_authority": null, + "lawful_basis": "Wettelijke grondslag TVL regeling: https://wetten.overheid.nl/BWBR0044808/2022-10-19. De Tweede Kamer is over de grotendeels geautomatiseerde uitvoering geinformeerd middels de volgende voortgangsrapportage, zie: https://www.rijksoverheid.nl/documenten/kamerstukken/2021/03/22/voortgangsrapportage-tvl", + "iama": "Nee", + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": "\nIn elk TVL besluit staat een bezwaarclausule met uitleg over hoe een ondernemer tegen het besluit van de gemandateerde in bezwaar kan gaan, zie https://www.rvo.nl/subsidies-financiering/bezwaar-maken voor de bezwaarprocedure.", + "standard_version": "0.1.0", + "uuid": "RVO-TVLRisicomodel", + "url": null, + "contact_email": "Voor contact over deze registratie neem contact op met RVO via het contactformulier; https://www.rvo.nl/onderwerpen/over-ons/contact/formulier onder vermelding van Bedrijf/instelling, Covid-19: TVL/TOGS/ATE, of Overheidsorganisatie, Covid-19 regelingen.", + "area": "Nederland", + "lang": "Nederlands", + "revision_date": "2024-04-01 00:00:00", + "description": "RVO zet een algoritme in als ondersteuning bij de beoordeling van aanvragen van ondernemers. Dit algoritme toetst of een aanvraag voldoet aan de voorwaarden die door de minister zijn gesteld. Dit wordt gedaan met behulp van een risicomodel:\nals een aanvraag binnenkomt bij de RVO, wordt een inschatting gemaakt of de ondernemer daadwerkelijk recht heeft op de tegemoetkoming. Hierbij vergelijkt RVO bijvoorbeeld de opgegeven informatie van de aanvrager met andere bij de overheid bekende gegevens, zoals aangiftes bij de Belastingdienst. Een aanvraag wordt automatisch goedgekeurd wanneer de aanvraag door het algoritme als laag risico is aangemerkt, bijvoorbeeld omdat het bedrag waarop de aanvrager aanspraak maakt laag is en er geen aanwijzingen voor misbruik of oneigenlijk gebruik zijn. In dat geval komt er geen medewerker meer aan te pas. De ondernemer heeft het geld dan binnen een week op zijn rekening staan. Als een aanvraag door het algoritme als hoog risico is aangemerkt, bijvoorbeeld omdat het een hoog bedrag betreft of omdat er twijfel is over de opgegeven omzet, volgt een handmatige controle met als gevolg een extra verwerkingstijd van gemiddeld twee tot drie weken - gemaximaliseerd tot de Awb beslistermijnen. In cijfers uitgedrukt is 49% binnen 1 week na ontvangst beslist, 71% binnen 3 weken en 96% binnen 8 weken.\nWanneer bij een eerdere aanvraag misbruik of oneigenlijk gebruik is geconstateerd, zullen toekomstige aanvragen altijd handmatig gecontroleerd worden. Ook wanneer een aanvraag complex is waardoor deze niet automatisch beoordeeld kan worden, volgt een handmatige controle. De aanvraag wordt dan beoordeeld door een medewerker.\nDe medewerker kan de ondernemer vragen om aanvullende informatie. De medewerker besluit vervolgens of de aanvraag wordt toegekend of wordt afgewezen. Bij afwijking van het klantverzoek en bij subsidiebedragen boven een bepaalde grens gebeurt dit altijd via het 4-ogen principe.", + "application_url": null, + "publiccode": null, + "mprd": null, + "source_data": null, + "methods_and_models": null, + "monitoring": null, + "human_intervention": "Bij elke nieuwe TVL ronde (aanvraagfase zowel als vaststellingsfase) wordt het risicomodel aangepast en opnieuw ter goedkeuring voorgelegd aan een interdepartementaal samengestelde adviescommissie (rolling review) die de algemeen directeur RVO adviseert inzake de toepassing van het risicomodel.\nZodra het in gebruik genomen is bepaald het risicomodel van elke aanvraag het kwalitatieve en kwantitatieve risico; die factoren samen vormen de algemene risicocategorie. Categorie 1 wordt automatisch toegekend, van Categorie 2 valt 10% uit naar handmatig en wordt de rest automatisch toegekend. In het geval dat het algoritme een aanvraag als hoog risico aanmerkt, Categorie 3, valt deze uit naar een handmatige controle door een medewerker. Bijvoorbeeld omdat het een hoog bedrag betreft, de aanvraag incompleet is, of omdat er aanwijzingen zijn voor misbruik of oneigenlijk gebruik. De aanvraag wordt dan klaargezet voor een menselijke beoordeling.\nHet algoritme geeft een advies mee aan de medewerker waar deze op moet letten, zoals gegevens die incompleet of tegenstrijdig zijn. Dit kan nuttig zijn: het advies helpt de medewerker om zich snel een beeld te vormen van de situatie. De medewerker bekijkt vervolgens de gehele aanvraag. De medewerker kan aanvragen vervolgens goedkeuren of afwijzen, eventueel na een nadere uitvraag om informatie. Een negatief besluit (geen of lagere subsidie) volgt daardoor niet uit het risicomodel maar altijd uit de beoordeling door een medewerker. Bij afwijking van het klantverzoek en bij subsidiebedragen boven een bepaalde grens gebeurt dit altijd via het 4-ogen principe.", + "risks": null, + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.496023+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "62129549", + "owner": "ministerie-ezk", + "leverancier_id": null + }, + { + "name": "Risicoscan Verblijf Buitenland", + "organization": "Uitvoeringsinstituut Werknemersverzekeringen (UWV)", + "department": "Handhaven", + "description_short": "De risicoscan Verblijf Buiten Nederland stuurt een bericht aan medewerkers van UWV over mensen met een WW-uitkering die waarschijnlijk (tijdelijk) in het buitenland verblijven. En zich mogelijk niet aan de regels houden. Onze medewerkers doen onderzoek en nemen een besluit over de vervolgstappen. Als we vaststellen dat iemand met een WW-uitkering onrechtmatig in het buitenland verblijft, kan dit gevolgen hebben voor de uitkering.", + "type": "Voorspellend", + "category": "Uitkering, buitenland, buiten Nederland, risicoscan, WW", + "website": "https://www.uwv.nl/nl/over-uwv/organisatie/algoritmeregister-uwv/risicoscan-verblijf-buiten-nederland", + "status": "In gebruik", + "goal": "De risicoscan Verblijf Buiten Nederland is een algoritme dat ons helpt om in 1 keer gericht binnen een grote groep onderzoek te doen. Zo hoeven we niet iedereen met een WW-uitkering apart te bekijken.", + "impact": "De risicoscan Verblijf Buiten Nederland stuurt een bericht aan medewerkers van UWV over mensen met een WW-uitkering die waarschijnlijk (tijdelijk) in het buitenland verblijven. Als uit verder onderzoek blijkt dat u zich niet aan de regels houdt, kan dit gevolgen hebben voor de uitkering. ", + "proportionality": null, + "decision_making_process": null, + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": "Er is een DPIA uitgevoerd", + "dpia_description": null, + "objection_procedure": "Burgers kunnen bezwaar maken tegen een beslissing van het UWV. Dat kan via de volgende link: https://www.uwv.nl/particulieren/klantenservice/klachten-bezwaar-beroep/bezwaar/index.aspx", + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": null, + "lang": null, + "revision_date": null, + "description": "Voor mensen met een WW-uitkering gelden er bepaalde regels. Zo krijgt u geen uitkering meer als u in het buitenland bent om een andere reden dan vakantie. De risicoscan Verblijf Buiten Nederland is een algoritme dat ons helpt om in 1 keer gericht binnen een grote groep onderzoek te doen. Zo hoeven we niet iedereen met een WW-uitkering apart te bekijken.\n\nDe risicoscan Verblijf Buiten Nederland stuurt een bericht aan medewerkers van UWV over mensen met een WW-uitkering die waarschijnlijk (tijdelijk) in het buitenland verblijven. En zich mogelijk niet aan de regels houden. Onze medewerkers doen onderzoek en nemen een besluit over de vervolgstappen. Als we vaststellen dat iemand met een WW-uitkering onrechtmatig in het buitenland verblijft, kan dit gevolgen hebben voor de uitkering.\nDe risicoscan gebruikt gegevens die nodig zijn om te onderzoeken of iemand met een WW-uitkering in het buitenland is en zich niet aan de regels houdt. De gegevens gaan alleen over het gedrag van deze persoon. We noemen ze daarom gedragskenmerken. Bijvoorbeeld het aantal keren dat iemand met een WW-uitkering met ons belt in een bepaalde periode. Of het kanaal waarmee de WW-uitkering is aangevraagd (bijvoorbeeld digitaal of via een formulier).\n\nDe risicoscan geeft de verschillende gedragskenmerken een score. Op basis van deze score volgt een bericht aan de medewerker. Die bepaalt of verder onderzoek nodig is.\n\nWe kunnen niet vermelden welke gedragskenmerken dit algoritme precies gebruikt. Zo voorkomen we dat mensen die misbruik maken van een WW-uitkering hun gedrag gaan veranderen.", + "application_url": null, + "publiccode": null, + "mprd": null, + "source_data": null, + "methods_and_models": null, + "monitoring": "Medewerkers van UWV houden op de volgende manieren toezicht op het gebruik van het algoritme:\n.\n- Iedere twee weken controleren gespecialiseerde UWV-medewerkers de kwaliteit van de gegevens die de risicoscan gebruikt. Zo testen zij het algoritme.\n- We verwijderen gedragskenmerken die geen toegevoegde waarde hebben voor het algoritme.\n- Zodra we zien dat de risicoscan onvoldoende resultaat geeft, stoppen we het algoritme direct en starten we een onderzoek. Vinden we iets dat niet klopt? Dan passen we de risicoscan aan.", + "human_intervention": "De medewerker beslist over de situatie van iemand met een WW-uitkering en eventuele vervolgstappen. De risicoscan neemt dus zelf geen besluiten.\n\nZodra we zien dat de risicoscan onvoldoende resultaat geeft, stoppen we het algoritme direct en starten we een onderzoek. Vinden we iets dat niet klopt? Dan passen we de risicoscan aan.", + "risks": "We zorgen ervoor dat we blijven voldoen aan de eisen van informatiebeveiliging en privacy. Dat doen we op de volgende manier:\n- We controleren de kwaliteit van de gegevens steeds opnieuw. \n- We zorgen er altijd voor dat medewerkers de uiteindelijke beoordeling doen en niet het algoritme.\n- We laten andere organisaties controleren of wat we doen binnen de normen past.\n- Adviesbureau KPMG voert kwaliteitscontroles uit om te toetsen of het algoritme zorgvuldig en volledig is.", + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.500748+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "89741375", + "owner": "uitvoeringsinstituut-werknemersverzekeringen", + "leverancier_id": null + }, + { + "name": "Klantapplicatie WW", + "organization": "Uitvoeringsinstituut Werknemersverzekeringen (UWV)", + "department": "Uitkeren", + "description_short": "Met de Klantapplicatie WW kunnen mensen die werkloos zijn of binnenkort hun baan verliezen gemakkelijk en snel een WW-uitkering aanvragen via Mijn UWV.", + "type": "Regelgebaseerd", + "category": "WW, uitkering", + "website": "https://www.uwv.nl/overuwv/algoritmes-bij-uwv/klantapplicatie-ww.aspx", + "status": "In gebruik", + "goal": "De Klantapplicatie WW zorgt ervoor dat u uw online aanvraag gemakkelijk en snel kunt doen. Onze medewerkers kunnen deze aanvragen vervolgens sneller beoordelen.", + "impact": "De Klantapplicatie WW toont de gegevens die UWV al heeft en die van belang zijn voor uw aanvraag. U kunt kijken of de gegevens kloppen en hoeft dan alleen nog maar de ontbrekende gegevens in te vullen. Daarna bepaalt UWV of u recht heeft op een WW-uitkering.", + "proportionality": "Om de aanvraag WW conform de wettelijke voorschriften te kunnen beoordelen, zijn alle gegevens nodig die Uitkeren WW op het digitale - en papieren aanvraagformulier uitvraagt. Gezien het grote aantal aanvragen WW en de duidelijke wettelijke regels over wanneer recht op WW-uitkering bestaat, is het proportioneel om geautomatiseerde besluitvorming toe te passen. ", + "decision_making_process": null, + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": "Burgers kunnen bezwaar maken tegen een beslissing van het UWV. Dat kan via de volgende link: https://www.uwv.nl/particulieren/klantenservice/klachten-bezwaar-beroep/bezwaar/index.aspx", + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": "algoritmeregister@uwv.nl", + "area": null, + "lang": null, + "revision_date": null, + "description": "Als u werkloos bent of binnenkort uw baan verliest, krijgt u misschien een WW-uitkering via UWV. U vraagt deze uitkering aan via Mijn UWV. De Klantapplicatie WW zorgt ervoor dat u uw online aanvraag gemakkelijk en snel kunt doen. Onze medewerkers kunnen deze aanvragen vervolgens sneller beoordelen.\n\nDe Klantapplicatie WW toont de gegevens die UWV al heeft en die van belang zijn voor uw aanvraag. U kunt kijken of de gegevens kloppen en hoeft dan alleen nog maar de ontbrekende gegevens in te vullen. De Klantapplicatie WW gebruikt gegevens als leeftijd, inkomen, arbeidsverleden en uitkeringsgegevens vanuit verschillende overheidssystemen. Wij krijgen bijvoorbeeld informatie over uw inkomen en arbeidsverleden van de Belastingdienst. Gegevens over uw leeftijd en adres komen van de gemeente waar u woont. Daarna bepaalt UWV of u recht heeft op een WW-uitkering.De afhandeling van uw aanvraag gaat voor een deel geautomatiseerd. Met de Klantapplicatie WW stelt UWV de volgende zaken vast:\n\n- Of u recht heeft op een uitkering.\n- Hoe hoog uw uitkering ongeveer is.\n- Hoelang u een uitkering krijgt. ", + "application_url": null, + "publiccode": null, + "mprd": null, + "source_data": null, + "methods_and_models": null, + "monitoring": "Wij toetsen de processen waarmee we het algoritme ontwikkelen, beheren en gebruiken steeds opnieuw. Zo zorgen wij ervoor dat de beoordeling van aanvragen voor een WW-uitkering goed blijft verlopen.\n\nOntstaat er toch een risico op een foute beoordeling? Dan kan UWV de Klantapplicatie WW, of bronsystemen die erop zijn aangesloten, uitzetten en een onderzoek starten.", + "human_intervention": "Medewerkers van UWV houden op de volgende manieren toezicht op het gebruik van het algoritme:\n\nBij de ontwikkeling en het beheer van de Klantapplicatie WW zijn verschillende partijen betrokken. Denk aan analisten, juristen, uitvoerende medewerkers en klantpanels. Zij controleren maandelijks of het algoritme nog goed werkt.\n\nUWV handelt een aanvraag voor een WW-uitkering geautomatiseerd of handmatig af. Dat laatste gebeurt in lastige situaties waarbij het nodig is dat een medewerker meekijkt. Medewerkers bekijken daarnaast regelmatig aanvragen. Bijvoorbeeld om te controleren of mensen recht hebben op een WW-uitkering.\n\nTijdens uw online WW-aanvraag kunt u via de telefoon vragen stellen over de werking van de Klantapplicatie WW.\nOnze medewerkers houden in de gaten of wetten en regels veranderen. Als dat gebeurt passen we het algoritme aan. Zo blijft het algoritme voldoen aan de geldende wetten en regels.", + "risks": "Wij toetsen de processen waarmee we het algoritme ontwikkelen, beheren en gebruiken steeds opnieuw. Zo zorgen wij ervoor dat de beoordeling van aanvragen voor een WW-uitkering goed blijft verlopen. \n\nOntstaat er toch een risico op een foute beoordeling? Dan kan UWV de Klantapplicatie WW, of bronsystemen die erop zijn aangesloten, uitzetten en een onderzoek starten.", + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.505784+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "51845995", + "owner": "uitvoeringsinstituut-werknemersverzekeringen", + "leverancier_id": null + }, + { + "name": "Claim beoordelings- en borgingsysteem (CBBS)", + "organization": "Uitvoeringsinstituut Werknemersverzekeringen (UWV)", + "department": null, + "description_short": "Dit model zoekt mogelijke banen voor burgers.", + "type": "Op regels gebaseerd", + "category": null, + "website": "https://www.uwv.nl/overuwv/algoritmes-bij-uwv/claim-beoordelings-en-borgingssysteem-cbbs.aspx", + "status": "In gebruik", + "goal": null, + "impact": null, + "proportionality": null, + "decision_making_process": null, + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": "algoritmeregister@uwv.nl", + "area": "Nederland", + "lang": "Nederlands", + "revision_date": null, + "description": "U bent (gedeeltelijk) arbeidsongeschikt als u door ziekte of een handicap minder of helemaal niet kunt werken. UWV beoordeelt of en hoeveel u nog kunt werken. Dat vertalen wij in een arbeidsongeschiktheidspercentage. De hoogte van dit percentage bepaalt of u (nog) recht heeft op een uitkering voor arbeidsongeschiktheid.\n\nBij het vaststellen van het arbeidsongeschiktheidspercentage gebruiken we het Claim Beoordelings- en Borgingssysteem (CBBS). Hierin staan beschrijvingen van duizenden functies die in Nederland voorkomen. Een arbeidsdeskundige van UWV beoordeelt met behulp van het CBBS welke banen geschikt zijn voor u. Door de ondersteuning van het CBBS hoeft onze arbeidsdeskundige deze functies niet allemaal handmatig te onderzoeken. Zo kunnen wij u sneller helpen.", + "application_url": null, + "publiccode": null, + "mprd": "Ja", + "source_data": "In het CBBS zit een bestand met beschrijvingen van duizenden functies. Deze functies geven een goed beeld van de Nederlandse arbeidsmarkt. Elke functieomschrijving geeft uitgebreide informatie over onder andere de werkomgeving, de taken in de functie, het aantal werkuren, de vereiste opleidingen en werkervaring en hoe zwaar het werk is (werkbelasting).\n\nDaarnaast haalt het CBBS gegevens uit de volgende bronnen:\n\nUWV-polisadministratie\nHierin staan alle gegevens over lonen, uitkeringen en arbeidsverhoudingen van alle werknemers en mensen met een uitkering in Nederland. Dit systeem levert naam, geboortedatum en geslacht aan het CBBS. Wij gebruiken deze gegevens om uw arbeidsongeschiktheid te beoordelen. Dat werkt als volgt:\n\nWij gebruiken uw naam en geslacht om zichtbaar te maken over wie de beoordeling gaat.\nUw leeftijd gebruiken wij voor het hanteren van de juiste regels en berekeningen. Ook controleren wij hiermee of u te jong of te oud bent om een bepaalde functie uit te mogen voeren.\nBeoordeling van de verzekeringsarts\nDe verzekeringsarts legt in het CBBS de code vast die hoort bij de medische diagnose. Ook beoordeelt de verzekeringsarts uw belastbaarheid en registreert hij deze in het CBBS.\n\nAanvullende gegevens van de arbeidsdeskundige\nDe arbeidsdeskundige voert de volgende gegevens in het CBBS in:\n\nhet aantal uren dat u heeft gewerkt direct voordat u ziek werd\nhet bijbehorende loon\nuw opleidingsniveau en de opleidingsrichting", + "methods_and_models": null, + "monitoring": null, + "human_intervention": "Medewerkers van UWV houden op de volgende manieren toezicht op het gebruik van het algoritme:\n\nEen beoordeling over een uitkering is maatwerk en gebeurt op individueel niveau. Onze medewerkers voeren de beoordeling daarom altijd zelf uit. Zij kijken kritisch naar de resultaten van het CBBS.\nWij controleren regelmatig de kwaliteit van beoordelingen die willekeurig zijn geselecteerd.\nWij onderzoeken de manier waarop onze medewerkers het CBBS gebruiken. Dit doen wij op verzoek of als er aanleiding voor is.\nWij onderzoeken en gebruiken de resultaten van de beoordelingen om de kwaliteit van onze vestigingen onderling te vergelijken.\nVerder gebruiken we deze resultaten op landelijk niveau. Bijvoorbeeld om de kwaliteit van de beoordelingen op hetzelfde peil te houden.\nTot slot gebruiken we de resultaten om verantwoording af te leggen aan bijvoorbeeld het ministerie of de toezichthouder.\nSoms passen we het CBBS aan\nBijvoorbeeld in de volgende situaties:\n\nWetten en regels veranderen.\nFuncties en de zwaarte van functies veranderen.\nEr komen nieuwe medische inzichten.\nProcessen en werkwijzen bij UWV veranderen.\nWe testen het systeem\nOm te zorgen dat het CBBS goed blijft werken, testen wij het systeem iedere dag. Veranderingen bereiden wij zorgvuldig voor. Dat doen we met een groot aantal deskundigen. Denk aan juristen, ontwerpers, bouwers, testers, verzekeringsartsen en arbeidsdeskundigen. Wij testen doorgevoerde veranderingen in CBBS altijd uitgebreid. Pas als het systeem de testen succesvol heeft doorlopen, nemen wij het weer in gebruik.", + "risks": "Alleen met de juiste kennis over het CBBS kunnen onze medewerkers uw arbeidsongeschiktheid goed beoordelen. Het is bijvoorbeeld belangrijk dat zij gebruikte definities begrijpen. Of weten hoe het systeem functies aan personen koppelt. Daarom kunnen zij alleen zelfstandig met het systeem werken als ze een opleiding hebben gevolgd en een certificaat hebben behaald. Bij grote wijzigingen vindt nascholing plaats. Ook scholen wij regelmatig onze arbeidsdeskundig analisten. En zijn er handleidingen beschikbaar voor gebruikers en medewerkers die betrokken zijn bij de ontwikkeling van het algoritme.", + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.510514+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "21447945", + "owner": "uitvoeringsinstituut-werknemersverzekeringen", + "leverancier_id": null + }, + { + "name": "Kinderbijslag", + "organization": "Sociale Verzekeringsbank (SVB)", + "department": null, + "description_short": "Door algoritmes kunnen we automatisch bepalen of u recht heeft op kinderbijslag. ", + "type": "Op regels gebaseerd", + "category": null, + "website": "https://www.svb.nl/nl/over-de-svb/hoe-werken-we/algoritmes-kinderbijslag", + "status": "In gebruik", + "goal": "Met een algoritme is beter te voorspellen hoeveel alle uitkeringen bij elkaar gaan kosten voor de Rijksbegroting. Een goed algoritme zorgt ervoor dat we minder klantdossiers handmatig verwerken. Dit bespaart kosten en onze medewerkers kunnen hun aandacht richten op maatwerk waar dat nodig is.", + "impact": "Als wij de kinderbijslag verkeerd berekenen kunt u in de problemen komen. U krijgt dan te weinig geld om te leven. Of u krijgt teveel en moet dat later terugbetalen. Dit is vervelend en kan leiden tot schulden. Een algoritme verwerkt gegevens vooral automatisch. Daarmee voorkomt het schulden.", + "proportionality": null, + "decision_making_process": null, + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": "Nederland", + "lang": "Nederlands", + "revision_date": null, + "description": "De gemeente levert gegevens aan van het kind en de ouders. Een van de algoritmes combineert al deze gegevens. Hiermee bepalen wij of het nodig is om u een aanvraagformulier voor de kinderbijslag te sturen. Wij sturen geen aanvraagformulier als u geen recht op kinderbijslag heeft.\n\nAls de kinderbijslag is toegewezen, zorgen andere algoritmes ervoor dat de betaling per kwartaal automatisch gaat. Eenvoudige wijzigingen als een verhuizing van het hele gezin binnen Nederland of de geboorte van een volgend kind worden automatisch verwerkt.\n\nDoor het gebruik van algoritmes lukt het om 90% van de beslissingen helemaal automatisch te doen. Hierdoor hoeven wij u om minder informatie te vragen en worden de kosten per uitkering ook lager.", + "application_url": null, + "publiccode": null, + "mprd": "Ja", + "source_data": "Onze belangrijkste bronnen om gegevens uit te halen zijn:\n\nde bevolkingsadministratie van de Nederlandse gemeenten\nde administratie wij bijhouden over de verzekering voor de volksverzekeringen\ninternationale systemen voor klanten buiten Nederland\nLees meer over hoe we omgaan met uw gegevens", + "methods_and_models": "Beslisboom (rule-based)", + "monitoring": null, + "human_intervention": null, + "risks": "We verwerken erg gevoelige gegevens. Daarom zetten wij de meest ervaren medewerkers in bij het ontwikkelen van de algoritmes. Ook gebruiken wij voor deze algoritmes klantenpanels om tijdens de ontwikkeling mee te kijken.\n\nDaarnaast is er voor het gebruik van de gegevens een werkwijze met veel details ingericht. Meerdere partijen binnen de SVB kijken of het gebruik van gegevens veilig gebeurt en of wij ons aan alle regels houden.", + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.515628+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "48155188", + "owner": "sociale-verzekeringsbank", + "leverancier_id": null + }, + { + "name": "AIO-aanvulling", + "organization": "Sociale Verzekeringsbank (SVB)", + "department": null, + "description_short": "Algoritmes bepalen of er recht is op AIO-aanvulling. Ook bepalen algoritmes of u de AIO-aanvulling als uitkering of als lening krijgt. En hoe hoog de AIO-aanvulling is.", + "type": "Op regels gebaseerd", + "category": null, + "website": "https://www.svb.nl/nl/over-de-svb/hoe-werken-we/algoritmes-aio-aanvulling", + "status": "In gebruik", + "goal": "Met een algoritme is beter te voorspellen hoeveel alle uitkeringen bij elkaar gaan kosten voor de Rijksbegroting. Een goed algoritme zorgt ervoor dat we minder klantdossiers handmatig verwerken. Dit bespaart kosten en onze medewerkers kunnen hun aandacht richten op maatwerk waar dat nodig is.", + "impact": "Als wij de AIO-aanvulling verkeerd berekenen kunt u in de problemen komen. U krijgt dan te weinig geld om te leven. Of u krijgt teveel en moet dat later terugbetalen. Dit is vervelend en kan leiden tot schulden. Een algoritme verwerkt gegevens vooral automatisch. Daarmee voorkomt het schulden.", + "proportionality": null, + "decision_making_process": null, + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": "Nederland", + "lang": "Nederlands", + "revision_date": null, + "description": "Algoritmes bepalen of er recht is op AIO-aanvulling. Ook bepalen algoritmes of u de AIO-aanvulling als uitkering of als lening krijgt. En hoe hoog de AIO-aanvulling is.\n\nHet algoritme neemt de beslissing met de gegevens die wij hebben en de gegevens die u levert. Maar gebruikt ook handmatige deelbeslissingen van medewerkers. Bijvoorbeeld de onderdelen van de vermogenstoets.", + "application_url": null, + "publiccode": null, + "mprd": "Ja", + "source_data": "Onze belangrijkste bronnen om gegevens uit te halen zijn:\n\nde bevolkingsadministratie van de Nederlandse gemeenten\nde inkomensgegevens van het UWV en de Belastingdienst\nvermogensgegevens van de Belastingdienst\nvoertuiggegevens van de Rijksdienst voor het Wegverkeer (RDW)\ngegevens die u zelf aanlevert", + "methods_and_models": "Beslisboom (rule-based)", + "monitoring": null, + "human_intervention": null, + "risks": null, + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.521509+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "14748484", + "owner": "sociale-verzekeringsbank", + "leverancier_id": null + }, + { + "name": "Sancties", + "organization": "Sociale Verzekeringsbank (SVB)", + "department": null, + "description_short": "Een beslistool helpt onze medewerkers om te beoordelen of wij een boete of maatregel moeten geven.", + "type": "Op regels gebaseerd", + "category": null, + "website": "https://www.svb.nl/nl/over-de-svb/hoe-werken-we/algoritmes-sancties", + "status": "In gebruik", + "goal": "Algoritmes helpen bij moeilijke beslissingen waarbij verschillende zaken een rol spelen. Hierdoor worden minder fouten gemaakt. Het systeem behandelt iedereen in dezelfde situatie op dezelfde manier.", + "impact": "Een sanctie heeft vaak financi\u00eble gevolgen voor u. Daarnaast heeft een sanctie ook emotionele gevolgen. Nog meer dan het terug moeten betalen van een bedrag. Het geven van een sanctie heeft ook gevolgen voor de manier waarop moet worden terugbetaald. Schulden komen vaak voor.", + "proportionality": null, + "decision_making_process": null, + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": "Nederland", + "lang": "Nederlands", + "revision_date": null, + "description": "n kinderbijslag kunnen wij in sommige gevallen een sanctie geven. Een sanctie is een boete of maatregel. Wij kunnen een sanctie geven als u bijvoorbeeld een wijziging niet doorgeeft.\n\nEen beslistool helpt onze medewerkers om te beoordelen of wij een boete of maatregel moeten geven. En hoe hoog de boete is of hoelang de maatregel duurt. Hierbij kijken we naar:\n\nhet bedrag dat u teveel heeft betaald\nhoe lang u teveel heeft betaald\nde datum dat de melding binnenkwam\nde datum dat de melding binnen had moeten komen", + "application_url": null, + "publiccode": null, + "mprd": "Nee", + "source_data": "Onze belangrijkste bronnen zijn uw gegevens in onze systemen.", + "methods_and_models": "Beslisboom (rule-based)", + "monitoring": null, + "human_intervention": null, + "risks": null, + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.526697+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "23448142", + "owner": "sociale-verzekeringsbank", + "leverancier_id": null + }, + { + "name": "Vrijwillige verzekering AOW en Anw", + "organization": "Sociale Verzekeringsbank (SVB)", + "department": null, + "description_short": "Een algoritme berekent de hoogte van de premie voor de vrijwillige verzekering AOW en Anw.", + "type": "Op regels gebaseerd", + "category": null, + "website": "https://www.svb.nl/nl/over-de-svb/hoe-werken-we/algoritmes-vrijwillige-verzekering-aow-en-anw", + "status": "In gebruik", + "goal": "Algoritmes helpen bij het nuttig uitvoeren van ons werk. Ook zorgen ze dat u krijgt waar u recht op heeft. En niet te weinig of te veel krijgt.", + "impact": null, + "proportionality": null, + "decision_making_process": null, + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": "Nederland", + "lang": "Nederlands", + "revision_date": null, + "description": "Als u buiten Nederland gaat wonen, betaalt u geen belasting meer in Nederland. En daardoor stopt de opbouw van uw AOW. U of uw werkgever kunnen de verzekering voor de AOW en Anw door laten gaan. Hiervoor moet een premie betaald worden. Hoe hoog de premie is, hangt af van uw inkomen. Een algoritme berekent de hoogte van die premie.", + "application_url": null, + "publiccode": null, + "mprd": "Ja", + "source_data": "Onze belangrijkste bronnen zijn:\n\npersoonsgegevens uit de bevolkingsadministratie van de Nederlandse gemeenten en van de klant\ninkomen en omstandigheden van de klant\nonze verzekeringsgegevens", + "methods_and_models": "Beslisboom (rule-based)", + "monitoring": null, + "human_intervention": null, + "risks": null, + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.531584+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "96585577", + "owner": "sociale-verzekeringsbank", + "leverancier_id": null + }, + { + "name": "Preventie & Handhaving", + "organization": "Sociale Verzekeringsbank (SVB)", + "department": null, + "description_short": "Met dit model voorspellen wij hoe groot de kans is dat een alleenstaande toch samenwoont.", + "type": "Zelflerend", + "category": null, + "website": "https://www.svb.nl/nl/over-de-svb/hoe-werken-we/algoritmes-preventie-en-handhaving", + "status": "In ontwikkeling", + "goal": "Door het SWAN-model kunnen wij ons richten op het verminderen van risico\u2019s. Wij kunnen situaties waarin u krijgt waar u geen recht op heeft eerder herkennen. En aanpassen om het bedrag dat u terug moet betalen laag te houden. Ook zorgen wij ervoor dat toezichthouders nuttig worden ingezet. Het model zorgt ervoor dat we geld besparen op uitkeringen en op het werk dat we uitvoeren.", + "impact": "Om vast te stellen of iemand samenwoont, kan onze afdeling Preventie & Handhaving u thuis bezoeken. Dit zijn persoonlijke bezoeken. Daarom maken we met het SWAN-model een selectie binnen de groep, zodat er zo min mogelijk mensen worden gecontroleerd.", + "proportionality": null, + "decision_making_process": null, + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": null, + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": "Nederland", + "lang": "Nederlands", + "revision_date": null, + "description": "Iemand die samenwoont krijgt minder AOW dan een alleenstaande. Wij kunnen controleren of een alleenstaande die volgens onze systemen alleen woont, toch niet samenwoont.\u202fDit heet het SWAN-model. Met dit model voorspellen wij hoe groot de kans is dat een alleenstaande toch samenwoont. Het SWAN-model is een algoritme.", + "application_url": null, + "publiccode": null, + "mprd": "Ja", + "source_data": "Onze belangrijkste bronnen zijn interne gegevens die beschikbaar zijn over de klant. Bijvoorbeeld:\n\ninformatie over het adres waar de klant nu woont of in het verleden woonde\nwoonsituatie\nleeftijd\ngeslacht", + "methods_and_models": "Zelflerend", + "monitoring": null, + "human_intervention": null, + "risks": "Wij toetsen onze modellen altijd of ze voldoen aan de regels. Dit zijn regels over ethiek en controleerbaarheid. Regels die we gebruiken zijn van de Algemene Rekenkamer en de regels die we zelf hebben opgesteld.\n\nOok hebben partijen binnen onze organisatie en partijen buiten onze organisatie toezicht gehouden op de ontwikkeling van het algoritme. En gezorgd dat de ontwikkeling met veel aandacht en veilig is gedaan.", + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.537021+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "28915384", + "owner": "sociale-verzekeringsbank", + "leverancier_id": null + }, + { + "name": "Beoordeling AOW-verstrekking", + "organization": "Sociale Verzekeringsbank (SVB)", + "department": null, + "description_short": "Ondersteunt bij de beoordeling van\nAOW-aanvragen.", + "type": "Op regels gebaseerd", + "category": null, + "website": "https://www.svb.nl/nl/over-de-svb/hoe-werken-we/algoritmes-aow", + "status": "In gebruik", + "goal": "Met een algoritme is beter te voorspellen hoeveel alle uitkeringen bij elkaar gaan kosten voor de Rijksbegroting. Een goed algoritme zorgt ervoor dat we minder klantdossiers handmatig verwerken. Dit bespaart kosten en onze medewerkers kunnen hun aandacht richten op maatwerk waar dat nodig is.", + "impact": "Als wij de AOW verkeerd berekenen kunt u in de problemen komen. U krijgt dan te weinig geld om van te leven. Of u krijgt teveel en moet dat later terugbetalen. Dit is vervelend en kan leiden tot schulden. Een algoritme verwerkt gegevens vooral automatisch. Daarmee voorkomt het schulden.", + "proportionality": null, + "decision_making_process": null, + "documentation": null, + "competent_authority": "Sociale Verzekeringsbank (SVB)", + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": "Ja", + "dpia_description": null, + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": null, + "area": "Nederland", + "lang": "Nederlands", + "revision_date": null, + "description": "Een van de algoritmes combineert alle gegevens die vooraf bekend en nodig zijn. Zoals woonplaats, verblijf en werk in het buitenland. Met die gegevens berekenen wij of iemand recht heeft op een complete AOW. Als de AOW is toegewezen, zorgen andere algoritmes dat de betaling per maand automatisch gaat. Eenvoudige wijzigingen als een verhuizing van het hele gezin binnen Nederland worden automatisch verwerkt.\n\nDoor algoritmes te gebruiken, lukt het al om meer dan 90% van de beslissingen helemaal automatisch te doen. Hierdoor hoeven wij u minder om informatie te vragen en worden de kosten per uitkering ook lager. Twijfelt het algoritme of de gegevens wel kloppen? Dan stopt de automatische verwerking en gaat een medewerker kijken wat er aan de hand is.", + "application_url": null, + "publiccode": null, + "mprd": "Ja", + "source_data": "Onze belangrijkste bronnen om gegevens uit te halen zijn:\n\nde bevolkingsadministratie van de Nederlandse gemeenten\nde administratie die wij bijhouden over de verzekering voor de volksverzekeringen\ninternationale systemen voor klanten buiten Nederland", + "methods_and_models": "Beslisboom (rule-based)", + "monitoring": null, + "human_intervention": null, + "risks": "We verwerken erg gevoelige gegevens. Daarom zetten wij de meest ervaren medewerkers in bij het ontwikkelen van de algoritmes. Ook gebruiken wij voor deze algoritmes klantpanels om tijdens de ontwikkeling mee te kijken.\n\nDaarnaast is er voor het gebruik van de gegevens een werkwijze met veel details ingericht. Meerdere partijen binnen de SVB kijken of het gebruik van gegevens veilig gebeurt en of wij ons aan alle regels houden.", + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.541529+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "71631383", + "owner": "sociale-verzekeringsbank", + "leverancier_id": null + }, + { + "name": "Berekenen huurtoeslag", + "organization": "Ministerie van Financi\u00ebn", + "department": "Dienst Toeslagen", + "description_short": "Het algoritme huurtoeslag berekent de hoogte op basis van gegevens over de aanvrager en de huurwoning. Hierbij worden de huurtoeslagregels toegepast.", + "type": "Op regels gebaseerd", + "category": "Sociale zekerheid", + "website": null, + "status": "In gebruik", + "goal": "De inzet van het algoritme heeft als doel:\n- Snel, effici\u00ebnt en consistent huurtoeslag vaststellen.\n\n- De aanvrager direct inzage geven in het besluit en, waar van toepassing, de hoogte van de huurtoeslag. \n\n- Snel, effici\u00ebnt en consistent huurtoeslag verstrekken voor ongeveer \u00e9\u00e9n miljoen huishoudens.", + "impact": "Een aanvraag voor huurtoeslag wordt beoordeeld met behulp van het algoritme. Op basis van de gegevens die de burger door heeft gegeven volgt een geheel automatisch besluit over recht op en hoogte van de huurtoeslag. \nHet algoritme kan bij de aanvraag van huurtoeslag om beoordeling door ambtenaar vragen. De verwerking neemt dan meer tijd in beslag.", + "proportionality": "Het volume is te groot voor handmatige behandeling van alle huurtoeslag aanvragen en mutaties.", + "decision_making_process": "Huurtoeslag", + "documentation": "Informatie over huurtoeslag is gepubliceerd op:\n\nhttps://www.belastingdienst.nl/wps/wcm/connect/nl/huurtoeslag/huurtoeslag", + "competent_authority": "Dienst Toeslagen", + "lawful_basis": "De wettelijke grondslag is vastgelegd in de Wet op de huurtoeslag: (https://wetten.overheid.nl/BWBR0008659/2022-01-01).\n\nIn de Algemene wet inkomensafhankelijke regelingen (AWIR) staat de toezicht en controle taak voor Dienst Toeslagen genoemd. \n(https://www.belastingdienst.nl/wps/wcm/connect/bldcontentnl/belastingdienst/intermediairs/toeslagen/wetgeving/wetgeving)\n\nDaarnaast is de Algemene Verordening Gegevensbescherming (AVG) van toepassing op de inzet van het algoritme huurtoeslag door Dienst Toeslagen.", + "iama": null, + "iama_description": null, + "dpia": "ja", + "dpia_description": "Door het algoritme worden bedrijfsregels geautomatiseerd afgehandeld. Een uitworp door het algoritme van een aanvraag ontstaat als er sprake is van:\n- Niet door het geautomatiseerde proces vast te stellen gegevens (teveel of onduidelijke gegevens, waardoor beoordeling door een ambtenaar nodig is), en/of;\n- Ontbrekende gegevens (noodzakelijk voor bepalen van recht en hoogte), en/of;\n- dienstverlening aan de burger die niet voldoet aan de eisen (maar ambtshalve hersteld wordt), en/of:\n- Technische fouten (de automaat mist gegevens om verder te kunnen gaan), en/of:\n- Afwijkende behandeling (door een ambtenaar opgevoerd om te voorkomen dat gewijzigde gegevens automatisch worden overschreven).", + "objection_procedure": "Mijn toeslag klopt niet moet ik bezwaar maken:\n\nhttps://www.belastingdienst.nl/wps/wcm/connect/nl/toeslagen/content/mijn-toeslag-klopt-niet\n\nVeel gestelde (FAQ-) vragen zijn opgenomen op:\n\nhttps://www.belastingdienst.nl/wps/wcm/connect/nl/huurtoeslag/huurtoeslag", + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": "Specifieke vragen die betrekking hebben op het algoritme kunnen gesteld worden aan:\n CIO.Office.DG.Toeslagen@toeslagen.nl", + "area": "Nederland", + "lang": "Nederlands", + "revision_date": null, + "description": "Burgers kunnen huurtoeslag aanvragen voor het adres waarop zij volgens de BasisRegistratie Personen (BRP) op het moment van de aanvraag zijn ingeschreven. Bij de aanvraag geeft hij of zij door: \n1) de gegevens van een eventuele partner of medebewoners die onderdeel uitmaken van het huishouden,\n2) de huurprijs en \n3) het (geschatte) inkomen en vermogen per lid van het huishouden. \n\nOmdat precieze huishoudsamenstelling niet altijd overeenkomt met de basisregistratie personen (BRP), huurprijs en/of (gezamenlijk) inkomen niet altijd actueel zijn, worden redelijkheidscontroleregels toegepast om zowel burgers, als de uitvoerder te behoeden voor onbedoelde fouten en de mogelijke consequenties daarvan.\n\nIn specifieke situaties vindt een uitworp van de aanvraag plaats en volgt een handmatige behandeling (zie menselijke tussenkomst) .\n\n", + "application_url": null, + "publiccode": null, + "mprd": "Het algoritme huurtoeslag maakt onderdeel uit van de huurtoeslagtoepassing (applicatie). Deze is gekoppeld aan de basisregistratie personen (BRP), basisregistratie gebouwen (BAG) en de basisregistratie Inkomen (BRI) en gebruikt de gegevens die daar bekend zijn.", + "source_data": "Bij het ontwikkelen van het model worden geen databronnen gebruikt.", + "methods_and_models": "Het algoritme huurtoeslag gebruikt eenvoudige bedrijfsregels met absulte waarden of percentage van numerieke gegevens en de regels uit de Algemene wet inkomensafhankelijke regelingen (AWIR). Met deze informatie worden persoonsrelaties en partnerschap gecontroleerd. Ook vindt met behulp van de basisregistratie personen (BRP) controle plaats op verblijfstatus, leeftijd, ouder-kindrelatie en partnerrelatie.", + "monitoring": null, + "human_intervention": "In specifieke situaties (zie omschrijving DPIA) vindt handmatige behandeling plaats, waarbij desgewenst contact wordt gezocht met de burger voor aanvullende informatie of validatie. \nGecorrigeerde gegevens worden vervolgens weer aangeboden aan het algoritme voor berekening.", + "risks": "Het algoritme is door de Algemene Rekenkamer getoetst. Het rapport met de voorziene risico's is gepubliceerd.\n\nhttps://www.rekenkamer.nl/publicaties/rapporten/2022/05/18/algoritmes-getoetst", + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.546164+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "29328576", + "owner": "ministerie-fin", + "leverancier_id": null + }, + { + "name": "Ontdooiverzoeken", + "organization": "Omgevingsdienst Noordzeekanaalgebied", + "department": "Proces & Informatie", + "description_short": "Op verzoek van de medewerker tijdelijk de zaak beschikbaar stellen voor het op orde brengen van de administratie.", + "type": "Regelgebaseerd", + "category": null, + "website": null, + "status": "In gebruik", + "goal": "Administratieve taak van het ontdooien zaken overnemen van de medewerker.", + "impact": "Deze DIVA werkt alleen intern en heeft daarom geen impact op de omgeving.", + "proportionality": "Verzoeken van medewerkers worden geautomatiseerd en sneller afgehandeld.\nAdministratieve taken worden verminderd.\n\nAls een zaak niet goed wordt ontdooid levert dat een vertraging op bij de administratie van de aanvrager en eventueel wat frustratie. Verder heeft het geen risico's voor de omgeving; de zaak is al afgehandeld en aan eventuele termijnen is al (niet) voldaan.\n\nDe risico's worden als erg laag ingeschat. Daarom zijn de verwachte baten een stuk groter.", + "decision_making_process": "n.v.t.", + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": "Nee", + "dpia_description": "N.v.t", + "objection_procedure": "N.v.t.", + "url": null, + "contact_email": null, + "area": "Noordzeekanaalgebied", + "lang": "Nederlands", + "standard_version": "0.1.0", + "uuid": null, + "revision_date": "2022-09-21 00:00:00", + "description": "Soms moeten collega\u2019s nog dingen wijzigen in zaken die al bevroren zijn, bijv. documenten toevoegen, mails versturen, etc.. Via een ontdooiverzoek kunnen deze collega\u2019s bij P&I aangeven welke zaak hiervoor tijdelijk ontdooid moet worden. DIVA neemt het afhandelen van deze ontdooiverzoeken van P&I over. Dit bestaat uit het ontdooien van de zaak en het versturen van een mail naar de aanvrager. Na zeven dagen check DIVA of Mozard de zaak weer vanzelf bevroren heeft. Is dit niet het geval, dan wordt dit alsnog gedaan.", + "mprd": "n.v.t.", + "source_data": null, + "methods_and_models": null, + "publiccode": null, + "application_url": null, + "monitoring": "Na afloop van de verwerking wordt een logmail gestuurd naar de informatieadviseurs en procesbeheerders die informatie bevat over de behandelde verzoeken. Aan de hand van deze logmails (die de behandelde zaaknummers bevatten) kan gecheckt worden of alles goed is gegaan.", + "human_intervention": "Indien uit logging blijkt dat het proces niet goed verlopen is, wordt dit door de medewerker hersteld. Fouten die niet uit de logging volgen, worden gesignaleerd door de indiener van het verzoek en herstelt door de medewerker. Indien nodig wordt DIVA aangepast om herhaling te voorkomen.", + "risks": "Het kan dat door een programeerfout een ontdooiverzoek niet goed behandeld wordt. Dit heeft als gevolg dat de aanvrager langer moet wachten met dat wat hij/zij moet wijzigen in de reeds bevroren zaak. Naast vertraging en eventuele frustratie bij de collega heeft dit geen gevolgen; de zaak is al afgehandeld en aan eventuele termijnen is al (niet) voldaan.", + "performance_standard": "Nader te bepalen", + "lars": "39555540", + "create_dt": "2023-04-06 08:50:18.467502+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "leverancier_id": null, + "published": true, + "released": true, + "owner": "omgevingsdienst-noordzeekanaalgebied" + }, + { + "name": "RVO-meldingen", + "organization": "Omgevingsdienst Noordzeekanaalgebied", + "department": "Milieu en Leefomgeving", + "description_short": "Binnengekomen RVO-meldingen worden gekoppeld aan de juiste inrichting in Mozard.", + "type": "Regelgebaseerd", + "category": null, + "website": null, + "status": "In gebruik", + "goal": "Adminitratieve taak van het koppelen van de melding aan de inrichting in Mozard overnemen van de medewerker.", + "impact": "Deze DIVA werkt alleen intern en heeft daarom geen impact op de omgeving.", + "proportionality": "Administratieve taken worden verminderd.\n\nWanneer de zaak foutief of niet wordt gekoppeld levert dit werk op voor de toezichthouder, om het te corrigeren. Iedere zaak wordt handmatig behandeld vanaf status 3; er vindt dus altijd een menselijke check plaats. Daarom zijn er verder geen risico's. \n\nDe vermindering in adminstratieve taken is bestaat zolang het proces vaak genoeg goed gaat. ", + "decision_making_process": "n.v.t.", + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": "Nee", + "dpia_description": "N.v.t.", + "objection_procedure": null, + "url": null, + "contact_email": null, + "area": "Noordzeekanaalgebied", + "lang": "Nederlands", + "standard_version": "0.1.0", + "uuid": null, + "revision_date": "2022-09-21 00:00:00", + "description": "Veel bedrijven zijn verplicht te melden wat zij doen om energie te besparen. De meldingen komen via het RVO en voor elke melding is een zaak aangemaakt. Deze zaken en meldingen horen in de meeste gevallen bij een reeds in Mozard bestaande inrichting. DIVA zorgt ervoor dat deze zaken vast gekoppeld worden. Zo hoeven de toezichthouders alleen nog te zorgen dat er een inrichting wordt opgevoerd bij zaken waarbij er nog geen inrichting bestaat. De toezichthouder gaat bij elke zaak daarna verder met de inhoudelijke behandeling.", + "mprd": "0", + "source_data": null, + "methods_and_models": null, + "publiccode": null, + "application_url": null, + "monitoring": "Na afloop van de verwerking wordt een logmail gestuurd naar de toezichthouders met informatieover de behandelde zaken. Aan de hand van deze logmails (die de behandelde zaaknummers bevatten) kan gecheckt worden of alles goed is gegaan.", + "human_intervention": "Elke zaak wordt inhoudelijk behandeld door een toezichthouder. Daardoor wordt elke zaak automatisch ook gemonitord; bij deze inhoudelijke behandeling komen fouten vanzelf bovendrijven.", + "risks": "Het enige risico is dat de toezichthouder alsnog de koppeling handmatig moet uitvoeren.", + "performance_standard": "Nader te bepalen", + "lars": "66996617", + "create_dt": "2023-04-06 08:50:18.473256+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "leverancier_id": null, + "published": true, + "released": true, + "owner": "omgevingsdienst-noordzeekanaalgebied" + }, + { + "name": "Anonimiseren", + "organization": "Omgevingsdienst Noordzeekanaalgebied", + "department": "Regiebureau", + "description_short": "Zwart lakken van AVG-gevoelige informatie in documenten.", + "type": "Voorspellend", + "category": null, + "website": null, + "status": "In gebruik", + "goal": "De OD wil graag transparant zijn naar de omgeving maar moet ook voldoen aan privacy-wetgeving. De inzet van NLP-software maakt dit mogelijk, zonder dat dit te veel inzet van medewerkers kost.", + "impact": "Gepubliceerde documenten zijn geanonimiseerd. Deze automatisering bepaalt dus feitelijk wat burgers wel en wat ze niet te lezen krijgen. ", + "proportionality": "Met de inzet van deze automatisering wordt bij schatting 6 FTE uitgespaard. \n\n1. Er is een foutmarge. Tussen de 1 tot 5% van de zwarte balkjes wordt vergeten.\n2. Er kan geen onderscheid gemaakt worden tussen minder en meer gevoelige dossiers.\n\nHet inhuren van 6 FTE voor handmatig anonimiseren is zo duur dat gekozen is voor de automatische wijze en bijbehorende risico's.", + "decision_making_process": "Woo, verplichte publicaties", + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": "Nee", + "dpia_description": null, + "objection_procedure": null, + "url": null, + "contact_email": null, + "area": "Noordzeekanaalgebied", + "lang": "Nederlands", + "standard_version": "0.1.0", + "uuid": null, + "revision_date": "2022-09-13 00:00:00", + "description": "Aan de hand van NLP-software worden privacygevoelige termen in documenten zwartgelakt. Deze software is niet in eigen beheer; wij kopen deze in bij het bedrijf TM7. Samen met TM7 wordt bepaald welke regels er gehanteerd worden. ", + "mprd": "0", + "source_data": null, + "methods_and_models": null, + "publiccode": null, + "application_url": null, + "monitoring": "Aan de hand van steekproeven wordt bijgehouden wat de kwaliteit van de software is. Hierbij wordt geteld hoeveel zwarte balkjes er gemist zijn en hoeveel privacygevoelige informatie er dus onterecht gepubliceerd is.", + "human_intervention": "Bij gevoelige zaken kan er een controle plaats vinden nadat er geautomatiseerd geanonimiseerd is. Hierbij vindt er dan een 100% controle plaats.", + "risks": "De software functioneert niet 100%. Dit betekent dat er hier en daar privacygevoelige informatie niet wordt zwartgelakt en niet-privacygevoelige informatie w\u00e9l wordt zwartgelakt. De risico's zijn dan ook ofwel het openbaar maken van informatie wat niet zou mogen, of juist niet openbaar maken van informatie, wat wel zou moeten.", + "performance_standard": "In de DR is vastgesteld dat de prestaties van de software >95% moeten zijn. Dat betekent dat er niet meer dan 5% zwarte balkjes vergeten mogen worden. Aan de hand van een steekproef worden de prestaties bijgehouden.\n", + "lars": "74541993", + "create_dt": "2023-04-06 08:50:18.478025+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "leverancier_id": null, + "published": true, + "released": true, + "owner": "omgevingsdienst-noordzeekanaalgebied" + }, + { + "name": "Publiceren", + "organization": "Omgevingsdienst Noordzeekanaalgebied", + "department": "Regiebureau", + "description_short": "Het publiceren van binnengekomen aanvragen, meldingen en genomen besluiten op officielebekendmakingen.nl en op de eigen website Omgevingsdienst Noordzeekanaalgebied.nl", + "type": "Regelgebaseerd", + "category": null, + "website": null, + "status": "In gebruik", + "goal": "De OD NZKG is wettelijk verplicht om kennisgevingen van binnengekomen meldingen en aanvragen te publiceren. Daarnaast moeten besluiten openbaar gemaakt worden zodat belanghebbenden er kennis van kunnen nemen en bezwaar/beroep kunnen indienen. Met behulp van DIVA wordt deze repetetieve handeling geautomatiseerd.", + "impact": "De publicaties worden geautomatiseerd op- en samengesteld op dagelijkse basis. Daar zit geen verschil in met handmatige publicaties. Er worden daarom ook geen consequenties voorzien.", + "proportionality": "De publicaties worden elke ochtend uitgevoerd waardoor de medewerkers zich kunnen richten op andere taken, dit betreft circa 3 FTE inzet. Er zijn veel verschillende soorten publicaties met bijkomend risico op fouten. Door automatisering vindt de publicatie altijd volgens dezelfde vaste regels plaats, dus is de tekst van gelijksoortige publicaties altijd hetzelfde.\n\nDIVA verwerkt de door de medewerkers klaargezette publicaties. Als deze foutief worden klaargezet, wordt dit niet in het publicatieproces hersteld. Er zijn wel diverse controles bij de start van het proces ingebouwd om te zorgen dat benodigde informatie voor de publicatie compleet is.\n\nAangezien er een menselijke controle aan de voorkant zit, levert het inzetten op kwaliteit een meerwaarde op voor de OD en daarmee de omgeving.", + "decision_making_process": "Publicaties voor Wabo, meldingen Activiteitenbesluit, BUS-meldingen", + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": "Nee", + "dpia_description": null, + "objection_procedure": null, + "url": null, + "contact_email": null, + "area": "Noordzeekanaalgebied", + "lang": "Nederlands", + "standard_version": "0.1.0", + "uuid": null, + "revision_date": "2022-09-16 00:00:00", + "description": "Publicaties die zijn toegewezen aan DIVA worden zowel op officielebekendmakingen.nl en op de eigen website Omgevingsdienst Noordzeekanaalgebied.nl gepubliceerd met alle bijbehorende teksten, zoals soort publicatie, bezwaar- en beroepsmogelijkheden, etc.. Het betreft aanvragen, meldingen en besluiten die ingediend zijn bij of genomen zijn door de Omgevingsdienst Noordzeekanaalgebied.", + "mprd": "0", + "source_data": null, + "methods_and_models": null, + "publiccode": null, + "application_url": null, + "monitoring": "Na afloop van de verwerking wordt een logmail gestuurd naar de medewerkers van het Regiebureau met informatie over de behandelde zaken. Aan de hand van deze logmails (die de behandelde zaaknummers bevatten) kan gecheckt worden of alles goed is gegaan.", + "human_intervention": "Alleen publicaties die aan afgesproken voorwaarden voldoen, worden door medewerkers toegewezen aan DIVA. Daarbij kan dus vooraf bepaald worden dat het risico voor geautomatiseerde verwerking te groot is en kan worden gekozen voor handmatige verwerking.", + "risks": "Alleen aan DIVA toegewezen publicaties worden afgehandeld, daarmee wordt voorkomen dat publicaties opgepakt worden voordat controle heeft plaatsgevonden. Daarbij start automatische verwerking met een aantal controles om de volledigheid van de publicatie voor verwerking te controleren.", + "performance_standard": "Nader te bepalen", + "lars": "36143229", + "create_dt": "2023-04-06 08:50:18.483839+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "leverancier_id": null, + "published": true, + "released": true, + "owner": "omgevingsdienst-noordzeekanaalgebied" + }, + { + "name": "Deelzaken starten Arbeidsinspectie ILT", + "organization": "Omgevingsdienst Noordzeekanaalgebied", + "department": "Milieu en Industrie", + "description_short": "Het starten van deelzaken 'Adviesverzoek extern uitzetten' bij Waboprocedures.", + "type": "Regelgebaseerd", + "category": null, + "website": null, + "status": "In gebruik", + "goal": "Om te voldoen aan wet- en regelgeving moet de OD NZKG bij elke Wabo-zaak een adviesverzoek doen bij de ILT en de aanvraag ter informatie aanbieden aan de Arbeidsinspectie. Het automatiseren van dit proces heeft als primair doel het geven van een kwaliteitsimpuls: het starten van de deelzaken wordt bij handmatig uitvoeren nog wel eens vergeten. Daarnaast levert de automatisering een tijdsbesparing op, waardoor vergunningverleners meer tijd overhouden voor inhoudelijk werk. ", + "impact": "Bij de Wabo-vergunningsprocedure worden de Arbeidsinspectie en ILT al vroeg in het proces in de gelegenheid gesteld advies te geven. Als er iets fout gaat met de automatisering, heeft dat daarmee invloed op de kans die deze organen hebben om hun advies uit te brengen.", + "proportionality": "Door automatisering kan het uitzetten van de deelzaken niet meer worden vergeten door een van de vergunningverleners. Verwacht wordt daarom dat het aantal niet-gedane verzoeken/ niet-aangeboden aanvragen zal afnemen.\n\nOok wanneer de deelzaken geautomatiseerd worden gestart, bestaat de kans dat dit misgaat en het verzoek/ de aanvraag niet verstuurd wordt. Dit heeft als gevolg dat de organen die worden aangschreven niet genoeg tijd hebben/ niet de gelegenheid krijgen om hun advies uit te brengen.\n\nDe verwachting is dat er bij geautomatiseerde adviesverzoeken minder deelzaken worden overgeslagen dan bij het handmatig starten van deze deelzaken. ", + "decision_making_process": "De volgende wetgeving verplicht ons tot het doen van de adviesvrzoeken:\nArt. 2.26 lid 3 Wabo\nArt. 6.3 lid 2 Bor\nArt. 6.15 lid 2 or", + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": "Nee", + "dpia_description": "N.v.t.", + "objection_procedure": null, + "url": null, + "contact_email": null, + "area": "Noordzeekanaalgebied", + "lang": "Nederlands", + "standard_version": "0.1.0", + "uuid": null, + "revision_date": "2022-09-21 00:00:00", + "description": "Met dit proces worden bij zaken voor Wabo-regulier- en Wabo-uitgebreid deelzaken 'Adviesverzoek extern uitzetten' gestart voor het ter informatie aanbieden van de aanvraag aan de Nederlandse Arbeidsinspectie en een adviesverzoek aan de Inspectie Leefomgeving en Transport. ", + "mprd": "0", + "source_data": null, + "methods_and_models": null, + "publiccode": null, + "application_url": null, + "monitoring": "Na afloop van de verwerking wordt een logmail gestuurd naar de vergunningverleners met informatieover de behandelde zaken. Aan de hand van deze logmails (die de behandelde zaaknummers bevatten) kan gecheckt worden of alles goed is gegaan.", + "human_intervention": "Bij de inhoudelijke behandeling van de Waboprocedure kan de vergunningverlener altijd nalopen of de juiste deelzaken zijn uitgezet. Fouten kunnen zo worden geconstateerd en hersteld.", + "risks": "Bij fouten voldoet de OD NZKG niet aan wet- en regelgeving.", + "performance_standard": "Nader te bepalen", + "lars": "74973213", + "create_dt": "2023-04-06 08:50:18.489378+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "leverancier_id": null, + "published": true, + "released": true, + "owner": "omgevingsdienst-noordzeekanaalgebied" + }, + { + "name": "OD Besluit", + "organization": "Omgevingsdienst Noordzeekanaalgebied", + "department": "Regulering en Expertise", + "description_short": "Documentnummer en link naar besluit toevoegen aan registratie OD Besluit in Mozard", + "type": "Regelgebaseerd", + "category": null, + "website": null, + "status": "In gebruik", + "goal": "Administratieve taak van het koppelen van het besluitdocument aan de registratie OD Besluit in Mozard uitvoeren in plaats van dat het handmatig door de medewerker gedaan moet worden.", + "impact": "Medewerkers gebruiken OD Besluit als ingang om de genomen besluiten overzichtelijk te raadplegen.\nOD Besluit wordt ontsloten op de website van de OD via de GISviewer. Burgers kunnen deze kaart raadplegen wanneer zij op zoek zijn naar besluiten die de OD genomen heeft. Door inzet van DIVA zijn de besluiten beschikbaar voor inzage.", + "proportionality": "De inzet van DIVA scheelt per besluit naar schatting 8 minuten administratief werk. Elke maand worden er zo'n 50 besluiten genomen. Dit betekent een totaal van circa 7 uur per maand.\n\nHet risico bestaat dat er geen of een onjuist besluitdocument wordt gekoppeld aan de registratie. Bij menselijk handelen kan hier hier nog een check op plaatsvinden, echter, bij geautomatiseerd handelen kan dit niet. Hierdoor krijgen burgers en/of OD-medewerkers eventueel geen of het verkeerde document te zien. \n\nAls het juiste document in de zaak staat, wordt ook het juiste document gekoppeld. Er zijn verschillende checks om ervoor te zorgen dat het juiste besluitdocument in de zaak staat (collegiale toets, goedkeuring door de manager). De kans op een verkeerd document is zeer klein (bij een steekproef van 35 documenten 100% score). Hiermee zijn de baten groter dan het geschatte risico.", + "decision_making_process": "Wabo-vergunningverleningsprocessen", + "documentation": null, + "competent_authority": null, + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": "Nee", + "dpia_description": "N.v.t", + "objection_procedure": null, + "url": null, + "contact_email": null, + "area": "Noordzeekanaalgebied", + "lang": "Nederlands", + "standard_version": "0.1.0", + "uuid": null, + "revision_date": "2022-11-28 00:00:00", + "description": "Van alle Wabo-besluiten die genomen worden, wordt een registratie aangemaakt waardoor medewerkers en burgers inzicht kunnen verkrijgen welke door de OD genomen besluiten op een locatie gelden. Hiervoor wordt bij het afhandelen van een vergunningzaak een registratie opgevoerd. Als administratieve lastenverlichting voor de medewerker in combinatie met kwaliteitsverbetering wordt vervolgens geautomatiseerd het bijbehorende document aan deze registratie gekoppeld.", + "mprd": "n.v.t.", + "source_data": null, + "methods_and_models": null, + "publiccode": null, + "application_url": null, + "monitoring": "Na afloop van de verwerking wordt een logmail gestuurd naar de key-users van vergunningverlening met informatieover de behandelde zaken. Aan de hand van deze logmails (die de behandelde zaaknummers bevatten) kan gecheckt worden of alles goed is gegaan.", + "human_intervention": "Indien DIVA geen besluit kan vinden of als er meerdere documenten met dezelfde kenmerken in een zaak aanwezig zijn, zal DIVA een melding geven dat v\u00f3\u00f3r verdere afhandeling eerst de medewerker het dossier op orde moet maken.", + "risks": "De automatisering wordt zo ingericht dat alleen verwerking plaatsvindt indien er \u00e9\u00e9n document voldoet aan de voorwaarden om toe te voegen aan de registratie. In alle andere gevallen wordt een medewerker ingeschakeld. Het enige risico wat daarmee overblijft is dat dit ene document niet het juiste is, maar de achterliggende oorzaak daarvan is een menselijke fout.", + "performance_standard": ">90% geautomatiseerd verwerkt.", + "lars": "91657145", + "create_dt": "2023-04-06 08:50:18.494471+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "leverancier_id": null, + "published": true, + "released": true, + "owner": "omgevingsdienst-noordzeekanaalgebied" + }, + { + "name": "Gladheid meldsysteem", + "organization": "Provincie Noord-Brabant", + "department": "Multimodale Bereikbaarheid", + "description_short": "Het algoritme gebruikt sensordata om een calculatie te maken voor voorspellingen van gladheidsrisico's. Deze voorspellingen worden gebruikt om te bepalen waar (preventief) gestrooid moet worden, in overleg met meteorologen. Daarnaast kan het algoritme verschillende alarmen geven, bijvoorbeeld bij kans op bevriezing van natte wegdelen of gladheid door condensatie. ", + "type": "Voorspellend en diagnostisch", + "category": "Verkeersveiligheid", + "website": null, + "status": "In werking", + "goal": "Het doel van het algoritme is om de veiligheid en doorstroming op de weg te waarborgen, door op tijd gladheidsrisico's te melden waardoor er op tijd gestrooid kan worden.", + "impact": "Burgers, met name weggebruikers, die gebruik maken van het weggennetwerk. Zij merken of er gestrooid is of niet.", + "proportionality": "Negatieve effecten en risico's zijn verwaarloosbaar. De verwachte baten zijn vooral gericht op effici\u00ebnter proces en stooibeleid.", + "decision_making_process": "Het gladheidsmeldsysteem verbetert de veiligheid en doorstroming op de weg, daarbij draagt het bij aan de mobiliteitsopgave. De mobiliteitsopgave is een wettelijke taak. Voor de veiligheid van het wegennetwerk heeft de Provincie een inspanningsverplichting, die ze verplicht inspanning te verrichten om het wegennet veilig te houden, waaronder het strooien valt. Er is geen resultaatverplichting. Artikel 16 en verder van de Wegenwet.", + "documentation": null, + "competent_authority": "De Provincie is eigenaar van het algoritme, maar het kan zelf geen aanpassingen doen.\nOnderhoud en aanpassingen worden gedaan door Rijkswaterstaat \nDe rekenregels die gebruikt worden zijn van het KMNI. ", + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": "Nee", + "dpia_description": "N.v.t.", + "objection_procedure": null, + "standard_version": "0.1.0", + "uuid": null, + "url": null, + "contact_email": "algoritmeregister@brabant.nl", + "area": "Noord-Brabant", + "lang": "Nederlands", + "revision_date": null, + "description": null, + "application_url": null, + "publiccode": null, + "mprd": "Nee", + "source_data": "De data die gebruikt wordt is de sensordata van de meetpunten:\n- Wegdektemperatuur\n- Luchttemperatuur\n- Ondergrondtemperatuur\n- Neerslag\n- Geleiding\n- Dauwpunttemperatuur\nEr wordt geen gevoelige/persoonlijke data gebruikt.", + "methods_and_models": null, + "monitoring": "Omdat het onderhoud onder Rijkswaterstaat valt, controleren zij de werking van het algoritme, zij kalibreren het systeem jaarlijks.\nDaarnaast krijgt de Provincie automatisch een melding bij een kapotte sensor.", + "human_intervention": "Het algoritme is adviserend, en heeft geen beslissingsbevoegdheid. Er is altijd een mens die besluit of er inderdaad gestrooid zal worden of niet. ", + "risks": "Als het algoritme niet goed werkt en er niet tijdig gestrooid wordt kan de veiligheid op de weg in het geding komen, daarnaast kan de doorstroom verminderd worden. Dit risico wordt ondervangen doordat het strooien altijd in overleg gebeurt met meteorologen. Als meteorologen aangeven dat zij denken dat er gestrooid moet worden, terwijl het algoritme dit niet aangeeft, kan er alsnog besloten worden te gaan strooien.\nEen tweede risico is dat de situatie op specifieke meetpunten bekeken wordt (15 in Brabant) waarop het risico voor de omgeving wordt bepaalt. Dit kan tot onnauwkeurigheden leiden. Ook dit risico wordt ondervangen door de samenwerking met meteorologen.", + "performance_standard": null, + "create_dt": "2023-03-31 08:34:12.551042+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "85816259", + "owner": "provincie-noord-brabant", + "leverancier_id": null + }, + { + "name": "intelligente Verkeers Regel Installatie (iVRI)", + "organization": "Provincie Noord-Brabant", + "department": "Multimodale Bereikbaarheid", + "description_short": "Het veilig, autonoom en automatisch regelen van de verkeerstromen op een kruispunt middels een iVRI.", + "type": "Binnen het algoritme worden alle types gebruikt om tot een continue uitkomst te komen, dus meten, diagnostiseren, voorspellen en voorschrijdend inzicht word verwerkt.", + "category": null, + "website": "Talking Traffic (talking-traffic.com)", + "status": "In werking", + "goal": "1. Zorg dragen voor een effici\u00ebnte doorstroming op kruispunten met iVRI's op een veilige (zonder ongevallen) en geloofwaardige (zonder dat mensen voor niks staan te wachten / logische volgorde) manier.\n\n2. Generen van data voor controle juiste werking door Provincie, en als input voor het centraal landelijk datapunt UDAP.\n\n3. De inzet van de iVRI's draagt ook bij aan een betere bereikbaarheid, aan meer reiscomfort, aan verkeersveiligheid en aan vergroening van de mobiliteit.", + "impact": "Het algoritme bepaalt de stand/kleur van de verkeerslichten en zodoende of een burger mag doorrijden of moet stoppen.", + "proportionality": "De verkeersintensiteit in en rond steden neemt toe, de beleidsdoelen die wegbeheerders dienen zijn veelvoudig: doorstroming, bereikbaarheid, verkeersveiligheid, leefbaarheid, duurzaamheid, economische vitaliteit dienen allemaal zoveel als mogelijk bevorderd te worden. Hierbij moet ook rekening gehouden worden met de verschillende gedragingen van verkeersdeelnemers (lopen, fietsen, personenauto\u2019s, OV, vrachtwagens, nood en hulpdiensten) met elk hun eigen karakteristieken, noodzaken en beperkingen waarbij politiek-bestuurlijke prioriteiten regelmatig ander accenten vergen in het accommoderen van de ene groep boven de andere(bijv. meer voorrang voor fietsers boven personenauto\u2019s) en het gebied zich ook blijft ontwikkelen en veranderen (denk aan nieuwe woonwijken en bedrijfsterreinen en/of kantoorlocaties). Binnen dit speelveld van doelen, belangen en veranderingen zijn iVRI's noodzakelijk om dit op een effici\u00ebnte manier in de praktijk uit te voeren.", + "decision_making_process": "De inzet van de iVRI's is noodzakelijk om de taak als wegbeheerder van provinciale wegen op een effici\u00ebnte manier uit te kunnen voeren.", + "documentation": "Het algoritme is een cluster van verschillende algoritme's van verschillende leveranciers die allemaal verschillende nuaces hebben. Voor elk kruispunt wordt een uniek algoritme ontwikkeld door verschillende leveranciers:\nwww.vialis.nl\nwww.dynniq.nl\nwww.swarco.nl", + "competent_authority": "De formele wegbeheerder, zijnde Provincie Noord-Brabant.", + "lawful_basis": "De grondslag voor het inzetten van iVRI's is een combinatie van de verschillende opgaves (met name: veiligheid-, mobiliteits-, ruimtelijke ordening-, en financi\u00eble opgave) van de provincie.", + "iama": null, + "iama_description": null, + "dpia": "Nee", + "dpia_description": "N.v.t.", + "objection_procedure": "Een burger kan melding doen van een slecht/niet functionerend regelsysteem via een elektrisch formulier.\nhttps://fd9.formdesk.com/provincienoordbrabant/Infra_melding_provinciale_wegen/?get=1&sidn=c34ae56da0cf4088b5bbd9fc1b320828", + "standard_version": "0.1.0", + "uuid": "N.v.t.", + "url": "N.v.t.", + "contact_email": "algoritmeregister@brabant.nl", + "area": "Noord-Brabant", + "lang": "Nederlands", + "revision_date": null, + "description": "Het algoritme detecteert de aanwezigheid van verschillende mobiliteiten (auto's / fietsen / vrachtwagens / voetgangers) met behulp van detectielussen, drukknoppen, mobile app data, en boordcomputer. Dit zal in de toekomst waarschijnlijk nog een breder pallet van inputs worden. Op basis van deze data en vooraf gedefinieerde criteria wordt per cyclus (+/- 90 of 120 seconden) de meest effici\u00ebnte doorstroom op een veilige en geloofwaardige manier berekend. Hierop worden in Real-Time door het regel-algoritme de verkeerslichten afgestemd (wie krijgt eerst groen etc.). Het 'regel-algoritme' wordt gecontroleerd door het 'controle-algoritme' om de veilgheid van de kruispunten te kunnen garanderen.", + "application_url": "Voor elk kruispunt met iVRI's wordt een specifiek algoritme gemaakt door verschillende leveranciers. Deze informatie is nu (nog) niet beschikbaar.", + "publiccode": "N.v.t.", + "mprd": "Nee", + "source_data": "De data die het algoritme gebruikt is de real-time data die het regelsysteem zelf meet met behulp van o.a. detectielussen en drukknoppen.\nDaarnaast wordt data opgehaald via landelijke UDAP. Deze specifieke dataflow (origine vanuit mobieltjes en boordcomputers) zijn betiteld als (mogelijke) persoon herleidbare data. Alle partijen die deze data verwerken dienen een dataverwerkersoverkeenkomst te ondertekenen.", + "methods_and_models": "https://www.talking-traffic.com/nl/\n\nwww.crow.nl", + "monitoring": "https://www.talking-traffic.com/nl/\n\nwww.crow.nl", + "human_intervention": "De formele wegbeheerder mag ingrijpen op de werking van de iVRI inclusief het algoritme. Voor elk kruispunt wordt een uniek algoritme ontwikkeld door leveranciers op basis van de inrichting van het kruispunt en het beleid van de provincie. Elk kruispunt bestaat uit honderde parameters die door verkeerskundigen aangepast kunnen worden om de doorstroming van de kruispunten te verbeteren op basis van beleid (verkeersveiligheid, doorstrooming, leefbaarheid,,,).", + "risks": "De risico\u2019s zijn veelvuldig maar ook klein. Zodra verkeersonveilige situaties zouden kunnen ontstaan (conflicteren richtingen krijgen groen) zal het algoritme afgebroken worden en zullen de verkeerslichten gaan knipperen. Dit komt omdat er naast het 'regel-algoritme' die de verkeerslichten regelt, ook een controle-algoritme is. Het afbreken gebeurd door dit separate veiligheids-controle-algoritme. Hiernaast is de algemene verkeerswet ook van toepassing als de verkeerslichten \u2018knipperen\u2019. Verkeersveiligheid is een basisontwerp principe bij verkeerslichten en de gebruikte algoritmes.", + "performance_standard": "Maandelijks wordt functioneel onderhoud bij het slechts presterende systeem in Noord Brabant gedaan. \nGemiddeld 1x per 5 jaar wordt ieder verkeerslicht fysiek gecontroleerd of systeem nog naar beheren werkt.\n1x per jaar is er preventief technisch onderhoud.", + "create_dt": "2023-03-31 08:34:12.555891+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "46452825", + "owner": "provincie-noord-brabant", + "leverancier_id": null + }, + { + "name": "Webapplicatie Impactmonitor Brugopening ", + "organization": "Provincie Zuid-Holland", + "department": "Dienst Beheer en Infrastructuur (DBI)", + "description_short": "De Impactmonitor Brugopeningen is een beslissingsondersteunende webapplicatie die brugbedieners ondersteunt bij het kiezen van het optimale moment voor een brugopening. Er wordt rekening gehouden met de verkeersdoorstroom en de uitstoot (CO2 voetafdruk). De applicatie is uitgerust om de verkeersdrukte tot 21 minuten vooruit te voorspellen in combinatie met actuele (real-time) verkeerinformatie.", + "type": "Voorspellend\nDe app is een real-time voorspelmodel dat tot 21 minuten in de toekomst de overlast voor het wegverkeer als gevolg van een brugopening kan voorspellen (voertuigverliesuren op basis van verkeersintensiteit en verkeerscongestiemodel)", + "category": "Verkeer en vaarwegen, Brug monitoringsysteem (BMS), Verkeersdoorstroming Voorspellen, Deep learning, Long Short-Term Memory (LSTM), Verkeerscongestiemodel, Data science, Prognosemodel, Real-time, API", + "website": "https://werkenvoor.zuid-holland.nl/artikelen/slimme-bruggen-door-data-deeplearning/\n https://baae58888c14f40f89d08821.blob.core.windows.net/paper/SmartShipping_paper_nl.pdf", + "status": "Het algoritme is in productie en het gebruik zit in een pilotfase. Het gebruik is enkel intern. Er zijn op dit moment drie bruggen opgenomen in de Impactmonitor Brugopeningen: de Coenecoopbrug (Waddinxveen), de Lammebrug (Leiden) en de Kruithuisbrug (Delft). De applicatie wordt momenteel met een selecte groep getest, waarna deze na verdere evaluatie gefaseerd zal worden ingevoerd in de bediencentrale.", + "goal": "De Impactmonitor Brugopeningen is gebouwd om brugbedieners te ondersteunen in het kiezen van het optimale moment voor een brugopening. De applicatie is uitgerust om de verkeersdrukte tot 21 minuten vooruit te voorspellen in combinatie met actuele scheepsverkeer informatie. De Impactmonitor Brugopeningen is aangepast op het gedrag en werkproces van brugbedieners. De brugbedienaar ziet in de applicatie bij een brug 3 tijdsvakken van 7 minuten. De app berekent in welke van de drie tijdsvakken een brugopening de minste overlast voor het wegverkeer veroorzaakt. De brugbedienaar neemt vervolgens het besluit wanneer en hoe lang de brug opengaat.", + "impact": "Het algoritme verwerkt geen persoonsgegevens (zoals leeftijd, geslacht, inkomen, gezondheid, enzovoort). De informatie is op geen enkele wijze herleidbaar tot een natuurlijk persoon. Bovendien is er altijd nog een menselijke tussenkomst en bepaalt de brugbedienaar uiteindelijk nog altijd op welk moment een brug het beste open kan. Het algoritme zelf is enkel beslissingsondersteunend.", + "proportionality": "Het algoritme verwerkt geen persoonsgegevens (zoals leeftijd, geslacht, inkomen, gezondheid, enzovoort). De informatie is op geen enkele wijze herleidbaar tot een natuurlijk persoon. Bovendien is er altijd nog een menselijke tussenkomst en bepaalt de brugbedienaar uiteindelijk nog altijd op welk moment een brug het beste open kan. Het algoritme zelf is enkel beslissingondersteunend.", + "decision_making_process": "Binnen het proces van de brugbediening operatie. Wettelijke taak om de weg- en vaarverkeer te verbeteren en ervoor te zorgen dat dit veilig gebeurt. ", + "documentation": " https://baae58888c14f40f89d08821.blob.core.windows.net/paper/SmartShipping_paper_nl.pdf ", + "competent_authority": "DBI is verantwoordelijk voor de tool en het gebruik en inzet van het algoritme. DBI is echter niet verantwoordelijk voor het toetsen van de inhoud, dat ligt bij mensen van de techniek.", + "lawful_basis": "De provincie Zuid-Holland heeft een belangrijke rol in de verkeersdoorstroming binnen de regio en is verantwoordelijk voor het beheer, onderhoud en bedienen van meer dan 100 bruggen in Zuid-Holland. Zie onder andere: https://lokaleregelgeving.overheid.nl/CVDR431299/1", + "iama": null, + "iama_description": null, + "dpia": "Er zijn geen persoonsgegevens bij dit algoritme betrokken.", + "dpia_description": "Er ziijn geen persoonsgegevens bij dit algoritme betrokken.", + "objection_procedure": "Voor vragen en opmerkingen kan je terecht bij: digitaalzuidholland@pzh.nl.\nWil je bezwaar maken, dan kan je terecht bij de Juridische afdeling van dienst beheer organisatie. https://www.zuid-holland.nl/contact/", + "standard_version": "0.1.0", + "uuid": "Niet bekend.", + "url": "Niet bekend.", + "contact_email": "Voor vragen en opmerkingen kan je terecht bij: digitaalzuidholland@pzh.nl.\nWil je bezwaar maken, dan kan je terecht bij de Juridische afdeling van dienst beheer organisatie. https://www.zuid-holland.nl/contact/", + "area": "Provincie Zuid-Holland", + "lang": "Nederlands", + "revision_date": "Wordt vervolgd", + "description": "De provincie Zuid-Holland heeft een belangrijke rol in de verkeersdoorstroming binnen de regio door het bedienen en onderhouden van meer dan 100 bruggen. Slimme ICT-oplossingen bieden nieuwe kansen om via sensoren en algoritmes haarfijn actuele verkeersinformatie te koppelen aan realtime scheepvaart informatie. \nVan deze 100 bruggen zijn er 55 die sensoren hebben, waarmee gemonitord wordt of de brug open of dicht is. Voor een steeds groter wordend aantal van deze bruggen staat de provincie voor een uitdaging om de verkeersstroom optimaal af te stemmen met de scheepvaart en een toenemende verkeersdrukte. De provincie zet zich in voor een slimmere, veiligere en effici\u00ebntere doorvaart om deze uitdagingen te verwezenlijken. \nIn het project \u2018Impactmonitor Brugopeningen\u2019 is hierin een wezenlijke stap gezet in het voorspellen van verkeersintensiteiten rondom een aantal belangrijke bruggen in de provincie Zuid-Holland. De gebruikte Long Short-Term Memory neurale netwerken kunnen met een correlatieco\u00ebffici\u00ebnt nauwkeurigheid van 75-95% voorspellingen doen tot 21 minuten vooruit. De ontwikkelde algoritmes zijn uitgerold binnen een Azure cloud omgeving. Het is opgeleverd als gebruiksvriendelijke webapplicatie waarin live scheepvaart en verkeersinformatie gepresenteerd wordt. Deze informatie wordt door de applicatie gebruikt om het optimale moment voor een brugopening te adviseren aan een brugbediener. \nIn een volgende fase kan deze informatie direct teruggevoerd worden aan het verkeersnetwerk waarmee bijvoorbeeld navigatie software rekening kan gaan houden met geplande brugopeningen. Samenvattend, de ontwikkelde webapplicatie gebruikt recente technologie op het gebied van kunstmatige intelligentie waarmee brugbedieners vakkennis kunnen combineren met de laatste technologie.", + "application_url": "Komt er nog.", + "publiccode": null, + "mprd": "Er komen geen persoonsgegevens in voor.", + "source_data": "De data die worden gebruikt, worden real-time ingelezen uit de Nationale Databank Wegverkeergegevens (NDW). Data over vaarwegen zit er nu nog niet in.\n\n- Aantal voertuigen\n- Soort voertuigen\n- Snelheid per voertuigen\n\nHIG Meetlusgegevens\nIn de provinciale wegen liggen meetlussen die de doorstroom van het verkeer in aantal voertuigen, soort voertuig en snelheid per voertuig registreert. Slechts een subset van deze lussen wordt real-time ontsloten aan het NDW (Nationale Databank Wegverkeersgegevens) \u2013 de rest wordt gebruikt voor monitoring en evaluatie. Omdat niet alle voor het project relevante meetlussen beschikbaar waren in het NDW is bij de leverancier een ruwe dataset opgevraagd voor de drie in de inleiding genoemde bruggen. Hierin stonden de meest gedetailleerde data van alle voertuigen die over een meetlus rijden, waarbij elke regel in de dataset \u0301een voertuig is. Voor het verdere gebruik van deze data zijn de individuele regels geaggregeerd per minuut met de som van aantal voertuigen, gemiddelde snelheid en gemiddelde lengte en aantallen per voertuigclasses. Hierbij is tussen de \u0301e \u0301en en twee jaar aan historische data gebruikt voor het maken van het voorspelmodel afhankelijk van beschikbaarheid per meetlus\n\nNDW real-time wegverkeersintensiteiten \nNDW heeft actuele verkeersgegevens van het aantal voertuigen dat per minuut een meetpunt passeert. \n\nCentrale Object Bediening Analyse Log Data (COBALD) brugopening data \nCOBALD is een voor de Provincie ontwikkeld systeem dat gekoppeld staat aan de bediencentrale. Alle historische brugopeningen met daarin het moment (start datum/tijd) en de duur van de brugopening staan hierin. Deze historische data is gebruikt voor het prepareren en analyseren van de meetlusgegevens.\n\nBridge Sense real-time data \nOp de meeste bruggen zijn extra sensoren geplaatst die real-time brugopeningen detecteert en doorstuurt aan de Blauwe Golf Verbindend en het NDW \u2013 die het beschikbaar stellen als Open Data. Deze real-time data wordt gebruikt voor de actuele brugstatus in de ontwikkelde webapplicatie.", + "methods_and_models": "LSTM Long short term memory. Deep learning algoritme\nVerkeersintensiteitenmodel ontwikkeling Deep learning modellen zijn ontwikkeld in de Keras library (versie 2.2.4), een open-source neural netwerk pakket geschreven in Python. Keras stelt onderzoekers in staat om snel te experimenteren met deep neural networks. Keras was gebruikt in samenhang met TensorFlow (versie 1.5.0) als backend waarbij in de experimentele fase de GPU variant van het gekozen model (sectie 3) is gebruikt. Een grid-search was toegepast ontleed aan de Scikit-learn machine learning library voor Python. Alle analyses voor het opschonen van data en het modelleren van verkeersintensiteiten zijn uitgevoerd in Python.\n\nArtifici\u00eble Neurale Netwerken (ANN) zijn een set aan algoritmes ge\u00efnspireerd door de enorm effici\u00ebnte werking van het menselijk brein om patronen te herkennen. Een ANN bestaat uit artifici\u00eble neuronen en kan in recente jaren tot in vergaande diepte en complexiteit effici \u0308ent getraind worden door zogenoemde deep learning algoritmes. Voor tijdseries data zoals in deze casus zijn Recurrent (Terugkerend) Neuraal Netwerken (RNN) vaak een geschikte oplossing omdat hierbij neuronen niet alleen informatie uit vorige lagen van het netwerk meewegen, maar ook informatie uit vorige tijdspunten meenemen. Een krachtige variant op RNN\u2019s is het Long Short-Term Memory (LSTM) netwerk die\nspeciaal is ontwikkeld om lange tijdsreeksen te modelleren. In het hier gepresenteerde werk zijn LSTM gekozen als uiteindelijk algoritme om real-time verkeersintensiteiten te voorspellen voor drie bruggen\n\nAls eerste is een LSTM model getraind op historische verkeersdata waarbij een tijdsreeks aan input gebruikt is om een vector aan stappen vooruit te voorspellen (script 1). In het tweede geval is een encoder-decoder LSTM gebruikt (script 2) waarbij de invoer tijdreeks aan data gecodeerd wordt (encode). De decoder gebruikt deze gecodeerde data en maakt een voorspelling een stap vooruit voor elk element in de output reeks. Het verschil is klein, aangezien in de praktijk beide modellen een reeks vooruit voorspellen. Het belangrijkste verschil is dat een LSTM model encoder decoder model informatie heeft over zowel de voorgaande stap die voorspeld is als ook de geaccumuleerde informatie uit de encoder stap wordt meegewogen in het voorspellen van de output sequentie", + "monitoring": "Tijdens de pilotfase is er een dashboard ontwikkeld waarop te zien is hoe het algoritme wordt ingezet en waar het wordt ingezet. ", + "human_intervention": "Het algoritme zelf is enkel beslissingsondersteunend. De brugbediende maakt zelf de eind beslissing. Hiermee is de brugbedienaar verantwoordelijk. Er zit nog menselijke interactie tussen. Het algoritme bepaalt niet zelf wanneer de brug open en dicht gaat.", + "risks": "De gebruikte Long Short-Term Memory neurale netwerken kunnen met een correlatieco\u00ebffici\u00ebnt nauwkeurigheid van 75-95% voorspellingen doen tot 21 minuten vooruit. Dit is niet 100%. De nauwkeurigheid van het algoritme zou te laag kunnen zijn, waardoor je minder inzicht krijgt en je minder goed een beslissing kan maken als brugbedienaar.\n\nOok kan het algoritme mogelijk verkeerd worden ge\u00efnterpreteerd door de brugbedienaar. Die kans bestaat, maar de impact ervan is heel klein. Daarom wordt er nu een pilot gedaan om brugbedienaars hierin mee te nemen, zodat zij het algoritme goed begrijpen.", + "performance_standard": "Performance is van enorm belang \u2013 gezien de brugbedieners niet willen wachten op de uitkomst van het model. De Non Functional Requirement (NFR) is dat de voorspelling binnen 3 seconden op het scherm te zien moet zijn. De uiteindelijk oplossing biedt een responsetijd tussen de 0,5 en 2 seconden.", + "create_dt": "2023-03-31 08:34:12.560649+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "96895333", + "owner": "provincie-zuid-holland", + "leverancier_id": null + }, + { + "name": "Keuzehulp WBU-Tabel", + "organization": "Provincie Zuid-Holland", + "department": "Dienst, Beheer en Infrastructuur", + "description_short": "De verkeersmanagers willen voorspelbaar onderhoud aan de weg kunnen plannen op basis van de werkbare uren. Om onderhoud te kunnen plegen, moeten er verkeersmaatregelen worden genomen (in de vorm van gedeeltelijke wegafsluitingen). Dit kan een een negatief effect hebben op de capaciteit van de weg om verkeer te kunnen verwerken. \nWerkbare uren worden bepaald door:\n\u2022de capaciteit van de locatie.\n\u2022het tijdstip (dag, uur).\n\u2022de minimaal vereiste restcapaciteit van de locatie.\n\u2022het effect van het type verkeersmaatregel op de capaciteit. \n\nWerkbare uren worden nu statisch bepaald. Het doel van deze fase is om te bepalen of we deze werkbare uren data-gedreven kunnen bepalen. \nDe definitie van data-gedreven in deze fase is: maximale capaciteit van de locatie wordt bepaald door daadwerkelijk bemeten intensiteiten (vanuit verkeersdata NDW, met interpolatie) op dezelfde tijdstippen. \nAan de hand van historische data kan je met dit algoritme zien welke type afzetting en verkeersmaatregel kan worden toegepast op een weg. Ook kan je zien welke momenten geschikt zijn.\n\nDe keuzehulp WBU-tabel wordt mede gebruikt om de WBU-tabel op te stellen. Bij het opstellen van de tool wordt naast de tool ook rekening gehouden met bepaalde afspraken uit het bedrijfsleven en andere beleidskeuzes van PZH.", + "type": "Diagnostich", + "category": "Wegwerkzaamheden en verkeer", + "website": "De (tijdelijke) URL is: https://c6ae6fa2db7da44c79581d7e.azurewebsites.net/ \nEr komt nog een URL waarmee eerst via PZH netwerk moet worden ingelogd. Tevens is het (nog) niet de bedoeling dat deze URL door externe wordt gebruikt. In eerste instantie wordt de WBU doorvertaald in een tabel (zoas nu ook het geval is). ", + "status": "Op dit moment worden de laatste kinderziektes uit de tool gehaald (nov, 2022)", + "goal": "Verlagen van operationele kosten en verhogen van de verkeersveiligheid.\n\n\u2022Verhogen verkeersveiligheid \nDe CROW96b geeft rekenmethodes om te bepalen bij welke verkeersintensiteit bij welke verkeersmaatregel toegepast mag worden. De huidige WBU-tabel houdt hier geen rekening mee. Doordat een webapplicatie per type verkeersmaatregel de WBU weergegeven wordt, wordt er altijd voldaan aan de eisen vanuit de richtlijn. Hierdoor blijft de verkeersveiligheid gewaarborgd. \n\n\u2022Operationele kosten \nDe webapplicatie maakt het in tegenstelling tot de oude WBU-tabel mogelijk om de WBU per dag te berekenen. Ervaring leert dat het verkeersbeeld op een woensdag en vrijdag significant rustiger is dan op een dinsdag of donderdag. Onderstaande casus laat zien wat dit voor financi\u00eble consequenties met zich meebrengt. Onze DBO-aannemer heeft in de gehele maand december maaiwerkzaamheden ingepland in de Hoeksche-Waard. De werkzaamheden worden uitgevoerd conform een halve rijbaanafzetting (fig 1323b). De oude WBU-tabel geeft aan dat de WBU tussen 09:00 uur en 15:00 uur is. De te maken webapplicatie geeft aan dat op maandag, woensdag en vrijdag er gewerkt kan worden van 09:00 uur tot en met 16:00 uur. Dit houdt in dat de aannemer 3 uur extra per week kan werken. Dit is dus 12 uur extra per maand. Doordat de aannemer 12 uur extra werktijd heeft, hoeft hij minder vaak de weg op. Ervan uitgaande dat de werkzaamheden worden uitgevoerd middels een voorwaarschuwingswagen, actiewagen en eindewagen scheelt dit de huur en operationele kosten van drie werkvoertuigen en drie chauffeurs. Dit kan geldbesparing met zich meebrengen. Dit is slechts een voorbeeld van \u00e9\u00e9n aannemer die aan het werk is. Jaarlijks worden er circa 2400 TVM aanvragen ingediend. Door het toepassen van de WBU-applicatie kan waarschijnlijk bij een groot gedeelte van deze aanvragen effici\u00ebnter gewerkt worden en kunnen kosten worden bespaard. \nHet is aannemelijk, dat dankzij de WBU-webapplicatie het verkeer minder vaak in de file staat. Hierdoor worden ook maatschappelijke kosten bespaard in de vorm van minder voertuigverliesuren. ", + "impact": "Met het algoritme is er minder hinder voor weggebruikers. Daarnaast wordt de verkeersveiligheid verhoogd.", + "proportionality": "Veiligheid wordt verhoogd, omdat er voldaan wordt aan de richtlijn CROW96B.\nEr is minder file en minder voertuigverliesuren.", + "decision_making_process": "Het algoritme geeft een advies/voorspelling. Maar er wordt wel rekening gehouden met de geldende richtlijnen van CROW 96B en APV (algemeen plaatselijke verordeningen) vastgelegd. En de voorwaarden van Melvin(Melden van verstoringen van Infrastructuur in Nederland). ", + "documentation": "Richtlijn TVM (inclusief huidige WBU-tabel)\u00a0\u00a0\nhttps://www.zuid-holland.nl/onderwerpen/verkeer-vervoer/tijdelijke/melvin/\u00a0\u00a0\n\nOnderzoek WBU Frank de Winter 2018 (LET OP: rapport is niet openbaar)\u00a0\nhttp://idms/otcs/llisapi.dll/link/656243217\u00a0\u00a0", + "competent_authority": "Provincie Zuid-Holland", + "lawful_basis": "Het algoritme geeft een advies/voorspelling. Maar er wordt wel rekening gehouden met de geldende richtlijnen van CROW 96B en APV (algemeen plaatselijke verordeningen) vastgelegd. En de voorwaarden van Melvin(Melden van verstoringen van Infrastructuur in Nederland). ", + "iama": null, + "iama_description": null, + "dpia": "Geen persoonsgegevens, ook niks bekend over de voertuigen of kentekens.", + "dpia_description": "Geen persoonsgegevens, ook niks bekend over de voertuigen of kentekens.", + "objection_procedure": "Voor vragen en opmerkingen kan je terecht bij: digitaalzuidholland@pzh.nl.\nWil je bezwaar maken, dan kan je terecht bij de Juridische afdeling van dienst beheer organisatie. https://www.zuid-holland.nl/contact/", + "standard_version": "0.1.0", + "uuid": "Niet bekend.", + "url": "Niet bekend.", + "contact_email": "Voor vragen en opmerkingen kan je terecht bij: digitaalzuidholland@pzh.nl.\nWil je bezwaar maken, dan kan je terecht bij de Juridische afdeling van dienst beheer organisatie. https://www.zuid-holland.nl/contact/", + "area": "Provincie Zuid-Holland", + "lang": "Nederlands", + "revision_date": "Jaarlijks onderhoud beheer gaat via afdeling I&A", + "description": "In de provincie Zuid-Holland wordt gebruik gemaakt van een werkbare urentabel (WBU-tabel). In deze WBU-tabel staat aangegeven binnen welke tijdvensters welke verkeersbeperkende maatregelen mogen worden genomen door aannemers, ten behoeve van het plegen van onderhoud aan de Provinciale wegen.\nDeze tabel is gebaseerd op kennis en ervaring van de toezichthouders en verkeersmanagers. Het is niet cijfermatig onderbouwd. De WBU-tabel is nu niet gebaseerd op de actuele verkeerssituaties. Het gevolg kan zijn dat er onnodig streng wordt gestuurd (bijv. alleen \u2019s nachts werken), terwijl op een aantal wegen tijdens een ruimere periode gewerkt kan worden. Dit kan schelen in de operationele kosten. \nUitgangspunt moet zijn: meten is weten. We meten op basis van de feitelijke drukte op straat en de verwachtte veroorzaakte hinder. Het cijfermatig onderbouwen van de tabel helpt ons, om het gesprek te voeren met stakeholders. \nDaarnaast wordt er nu in de WBU geen onderscheid gemaakt in de verschillende type verkeersmaatregelen die toegepast kunnen worden. Dit houdt in dat er verkeersmaatregelen op de weg kunnen komen, waar conform de verkeersdrukte en de richtlijnen vanuit de CROW dit feitelijk niet is toegestaan. Hierdoor kunnen verkeersonveilige situaties ontstaan.\nEr is een professionaliseringslag nodig, die ervoor zorgt dat de WBU-tabel cijfermatig wordt onderbouwd. Door het cijfermatig onderbouwen van onze WBU kunnen wij transparant richting stakeholders aangeven waarom op bepaalde tijdstippen verkeersbeperkende maatregelen mogen worden getroffen. Hiermee kunnen wij werken aan de effici\u00ebntie en de verkeersveiligheid verhogen.", + "application_url": "https://c6ae6fa2db7da44c79581d7e.azurewebsites.net/", + "publiccode": "Is er nog niet (nov, 2022)", + "mprd": "Gebaseerd op data van de NDW, openbare data en gebasseerd op het SWUNG 2 model.", + "source_data": "\u2022Lusdata (hoe hard verkeer rijdt, hoe lang een voertuig is, om onderscheid te maken tussen vrachtwagen en persoonsauto\u2019s; intensiteiten) \n\u2022Informatietrajecten met hoeveel rijstroken en maximale snelheid \n\u2022Planningsdata in Melvin\n\u2022SWUNG 2 model\n\u2022Floating car data", + "methods_and_models": "Werking van het model nu:\nWe geven aan:\n\u2022Welke N-weg het betreft\n\u2022We geven het start en eindpunt aan in hectometrering\n\u2022het type verkeersmaatregel aan (wisselstrook met doorgangsregeling) \n\u2022de datum in op komende maandag\n\nWe krijgen terug:\n\u2022Een overzicht van de tijdsvakken (per half uur), met daarbij per tijdvak een rood/groen score op werkbare uren voor de hele week \n\u2022Het historisch profiel is bepalend voor de score van de tijdvakken\n\u2022Het historisch profiel per tijdvak wordt berekend op basis van dezelfde tijd en weekdag, van de afgelopen weken (groeiende historie sinds juni 2021)", + "monitoring": "De webapplicatie wordt getest aan de hand van eigen bevindingen en tellingen.", + "human_intervention": "Op dit moment testen wij de applicatie uit. We kijken of deze overeenkomt met onze eigen bevindingen en die van de weginspecteurs. Op deze manier proberen wij eventuele bugs uit de tool te filteren. ", + "risks": "De volgende risico\u2019s zijn ge\u00efnventariseerd. \n\n\u2022Data van de verkeerslussen is niet dekkend voor het gehele wegennet van de provincie \n> stand van zaken nov 2021: GEEN RISICO. \n\nIn eerste instantie was niet zeker of er voldoende data beschikbaar zou zijn om de verkeersintensiteiten op alle provinciale wegen te kunnen voorspellen. Op basis van de NDW-data en de gegevens vanuit het SWUNG2 model kan echter per 100 meter wegvak de verkeersintensiteit worden voorspeld. De methodes hierachter, zijn gebaseerd op de methodes vanuit het geluid- en luchtberekeningsmodel en dus reeds bewezen. \n\n\u2022Rekenregels vanuit de CROW kunnen niet worden toegepast \n> stand van zaken nov 2021: GEEN RISICO \n\nBinnen de provincie Zuid-Holland wordt voor het dagelijks beheer en onderhoud gebruik gemaakt van vijf verschillende afzettingen. Op basis van de methodes uit de CROW96b kan relatief eenvoudig aan de hand van de verkeersintensiteiten worden bepaald wanneer welke afzetting kan worden toegepast. Aandachtspunt is dat we deze methodes nog goed moeten worden gespiegeld aan de huidige WBU. \n\n\u2022Problemen tijdens verder softwareontwikkeling \n> stand van zaken nov 2021: KLEIN RISICO \n\n Risico\u2019s worden bijgehouden en gemonitord in de voortgangsrapportages.", + "performance_standard": "Resultaten:\n- Een overzicht van de tijdsvakken (per half uur), met daarbij per tijdvak een rood/groen score op werkbare uren voor de hele week\u00a0\u200b\n- Het historisch profiel is bepalend voor de score van de tijdvakken\u200b\n- Het historisch profiel per tijdvak wordt berekend op basis van dezelfde tijd en weekdag, van de afgelopen weken (groeiende historie sinds juni 2021)\u200b", + "create_dt": "2023-03-31 08:34:12.566027+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "18747788", + "owner": "provincie-zuid-holland", + "leverancier_id": null + }, + { + "name": "Remote Sensing gebiedsclassificatie op basis van AI beeldherkenning", + "organization": "Provincie Zuid-Holland", + "department": "Afdeling Informatisering en Automatisering & Water en Groen", + "description_short": "Op basis van beeldherkenning van satellietbeelden en analyses worden veranderingen in natura2000 gebieden inzichtelijk gemaakt en gedetailleerd in kaart gebracht. Dit doen we voor ecologische doeleinden (stikstofbeleid).", + "type": "Diagnostisch (vaststellen van aanwezigheid van plantsoorten)", + "category": "Natuur, vegetatieverandering onder andere door stikstof en uitlaatgassen CO2", + "website": "https://github.com/Provincie-Zuid-Holland/satellite_images_nso_extractor\nhttps://github.com/Provincie-Zuid-Holland/satellite-images-nso-datascience\nhttps://github.com/Provincie-Zuid-Holland/satellite_images_nso_tif_model_iterator\nhttps://github.com/Provincie-Zuid-Holland/vdwh_ahn_processing", + "status": "Twee natuurgebieden zijn in gebruik (pilot). Het algoritme bestaat, maar wordt nog niet in gebruik genomen door ecologen. ", + "goal": "De biodiversiteit van de leefomgeving is lager dan gewenst. Overheidsinstanties hebben de taak om dit te verbeteren. Op basis van beeldherkenning worden veranderingen in natura2000 gebieden inzichtelijk gemaakt en gedetailleerd in kaart gebracht. Dit doen we voor de habitatkwaliteit. Op deze manier kunnen planten- en diersoorten worden herkend, zoals insecten. Op die manier kunnen we de verspreiding van exoten en indicatorsoorten in kaart brengen. Ook kunnen we op basis hiervan herstelmaatregelen nemen tegen stikstof. Binnen natuurgebieden heb je bepaalde natuur die gevoelig is voor stikstof. Als er teveel stikstof op neer komt dan gaan ze achteruit. Een voorbeeld is het herkennen van vergrassing. Als daar stikstof op neerkomt kunnen er planten, zoals bijvoorbeeld brandnetelgrassen groeien. Dit wil je bij duinen voorkomen. ", + "impact": "De resolutie van de beelden is 50 centimeter rauwe data van NSO, met aggregaties. De ecoloog krijgt 3-4 meter te zien. Er is geen impact op mensen, want zij zijn niet te herkennen op de satellietbeelden (afhankelijk van privacy check NSO). \n\nHoogtedata van Nederland. Actueel Hoogtebestand Nederland (AHN) radarsysteem door de Nederlandse Overheid met Lidar (https://www.ahn.nl/).", + "proportionality": "Open en heldere communicatie (transparantie) over de inzet van het gebruik van satellietbeelden is belangrijk voor de acceptatie door inwoners en het vertrouwen dat mensen hebben in (het inzetten van) de technologie. Het is puur voor de natuur en stikstofbeleid.", + "decision_making_process": "Besluitvormingsproces stikstofbeleid (verandering in vegetatie Natura2000) en gebruik door ecologen binnen de provincie.", + "documentation": "https://github.com/Provincie-Zuid-Holland/satellite_images_nso_extractor", + "competent_authority": "Afdeling Water en Groen", + "lawful_basis": null, + "iama": null, + "iama_description": null, + "dpia": "Nee, want er is geen sprake van persoonsgegevens.", + "dpia_description": null, + "objection_procedure": "Voor vragen en opmerkingen kan je terecht bij: digitaalzuidholland@pzh.nl.\nWil je bezwaar maken, dan kan je terecht bij de Juridische afdeling van dienst beheer organisatie. https://www.zuid-holland.nl/contact/", + "standard_version": "0.1.0", + "uuid": "Niet van toepassing", + "url": "NSO en AHN, Scikit", + "contact_email": "Voor vragen en opmerkingen kan je terecht bij: digitaalzuidholland@pzh.nl.\nWil je bezwaar maken, dan kan je terecht bij de Juridische afdeling van dienst beheer organisatie. https://www.zuid-holland.nl/contact/", + "area": "Provincie Zuid-Holland", + "lang": "Nederlands", + "revision_date": "Mogelijk 2023", + "description": "Het algoritme classificeert vegetatiestructuur van Natura 2000 gebieden, gebaseerd op gemodelleerde satellietbeeld- herkenning.\nProvincie Zuid-Holland wordt door verschillende sensoren (beeld, LIDAR, IR, multispectraal, microgolf, etc) gemeten. Dit gebeurt vanuit satellieten, vliegtuigen en helikopters. Een groot deel van de data is gratis beschikbaar. Het benutten van dergelijke vlakdekkende meetreeksen kan een grote impuls geven aan het monitoren van natuurgebieden. \nHet interpreteren van remote sensing-data tot ecologisch relevante inzichten kan een belangrijke bouwsteen zijn van een digital twin natuur. Deze meetreeksen kunnen het \u2018skelet\u2019 of raamwerk bieden waarop de digital twin verder kan worden opgebouwd. Drone-beelden bieden in combinatie met soortherkenning een tool om zeer hoge resolutie-data te verkrijgen. \nHet verhoogt de dekking en het zorgt voor een grotere actualisatie voor de provincie. ", + "application_url": "https://pzh.maps.arcgis.com/apps/dashboards/478920c4012042b0a17b42e353345aba", + "publiccode": null, + "mprd": "Nee.", + "source_data": "Deze dataset bevat momentopnames van geautomatiseerd gegenereerde vegetatiestructuur-classificaties van de Natura 2000 gebieden, op basis van SuperView Netherlands Space Office (NSO) satellietbeelden. De beelden worden elke \u00e9\u00e9n tot vier maanden beschikbaar gesteld door het NSO en middels een modelberekening gesegmenteerd tot vegetatiestructuur-klassen. De geanalyseerde beelden gaan terug tot 2019. De data wordt gevisualiseerd in een ArcGIS Operations Dashboard waarin alle gesegmenteerde momentopnames met elkaar te vergelijken zijn. Ook bevat het dataset Lidar van Actueel Hoogtebestand Nederland (AHN)", + "methods_and_models": "Scikit learn: pakket modellen open source binnen Python. Random forest voor het herkennen van vegetatie structuren. https://scikit-learn.org/stable/", + "monitoring": "Nog niet in gebruik, dus wordt nog niet gemonitord. ", + "human_intervention": "Ja door de ecologen.", + "risks": "Het model is 85-90% waterdicht. Er is menselijke tussenkomst (ecoloog) nodig, om zaken te controleren. Ook is het goed om aanvullend naar dronebeelden te kijken. ", + "performance_standard": "Het beoogd resultaat is een simpel structuurmodel (zand, gras, bos) uitrollen naar andere N2000-gebieden (in aanvulling op duingebieden 3A) over hele provincie. \nDe accuratie is 85% van beeldherkenning met F1 score.", + "create_dt": "2023-03-31 08:34:12.571270+00:00", + "provider": null, + "process_index_url": null, + "tags": null, + "source_id": null, + "published": true, + "released": true, + "lars": "87239212", + "owner": "provincie-zuid-holland", + "leverancier_id": null + }, + { + "name": "Kentekenplaatherkenning autoluwe binnenstad", + "organization": "Gemeente Amersfoort", + "department": "Stad en Ontwikkeling", + "description_short": "De camera's detecteren en lezen d.m.v. Optical Character Recognizing-techniek kentekenplaten van voertuigen die de binnenstad van Amersfoort inrijden.", + "type": "Zelflerend", + "category": "Fysiek domein", + "website": "Nog niet beschikbaar", + "status": "In gebruik", + "goal": "De camera's, en daarmee het algoritme, worden ingezet t.b.v. het handhaven van de geslotenverklaring van de binnenstad voor voertuigen.", + "impact": "De impact van het algoritme op de burger is laag. Enkel het lezen van de kentekenplaat wordt door het algoritme uitgevoerd. Vermeende overtreders worden door een BOA handmatig gecheckt of er is sprake is van een strafbare gedraging waarbij de BOA ook de kentekenplaat zelf nog controleert op camerabeelden. ", + "proportionality": "Het 24 uur per dag gebruik maken van mensen en analoge middelen is vanuit capaciteit gezien niet haalbaar, en een foto van een overtreding vormt een sluitend bewijs. Vermeende overtreders worden door een BOA handmatig gecheckt of er sprake is van een strafbare gedraging. ", + "decision_making_process": null, + "documentation": null, + "competent_authority": null, + "lawful_basis": "Wegenverkeerswet, Verkeersbesluit gemeenteraad, Beleidskader Geslotenverklaringen en Voetgangersgebieden", + "iama": "Nee", + "iama_description": "Niet beschikbaar", + "dpia": "Ja", + "dpia_description": null, + "objection_procedure": "Bezwaar maken conform de Algemene wet bestuursrecht", + "standard_version": "0.3.1", + "uuid": null, + "url": "Nog niet beschikbaar", + "contact_email": "Nog niet beschikbaar ", + "area": "Binnenstad van Amersfoort ", + "lang": "NLD", + "revision_date": null, + "description": null, + "application_url": "https://www.brickyard.eu/camerahandhaving", + "publiccode": null, + "mprd": null, + "source_data": "Kentekenplaten van voertuigen", + "methods_and_models": "Neural network", + "monitoring": "Nog niet beschikbaar", + "human_intervention": "Een BOA constateert of een vermeende overtreder een strafbare gedraging heeft begaan. ", + "risks": null, + "performance_standard": null, + "provider": "Brickyard B.V. ", + "process_index_url": "https://www.amersfoort.nl/register-van-verwerkingen-amersfoort", + "tags": "Objectherkenning", + "source_id": "Nog niet beschikbaar", + "published": true, + "released": true, + "create_dt": "2023-04-26 08:02:54.705668+00:00", + "lars": "77953126", + "owner": "gemeente-amersfoort", + "leverancier_id": null + }, + { + "name": "Anonimiseringstool", + "organization": "Gemeente Amersfoort", + "department": "Informatievoorziening", + "description_short": "Het algoritme herkent en anonimiseert o.a. (persoons)gegevens en vertrouwelijke financi\u00eble gegevens in documenten voordat deze gepubliceerd worden.", + "type": "Zelflerend", + "category": "Bedrijfsvoering", + "website": "Nog niet beschikbaar", + "status": "In ontwikkeling", + "goal": "De anonimiseringssoftware wordt ingezet om invulling te geven aan enerzijds transparantie en anderzijds aan de noodzakelijke bescherming van de personen en bedrijven op wie documenten betrekking hebben.", + "impact": "De impact van het algoritme op de burger is laag. Het algoritme zoekt specifiek naar (persoons)gegevens en vertrouwelijke bedrijfsgegevens en maskeert deze ongeacht de verdere inhoud van documenten.", + "proportionality": "Het gebruik van anonimiseringssoftware zorgt voor een versnelling en vereenvoudiging van het proces voor actieve en passieve openbaarmaking. Het geautomatiseerd anonimiseren is tevens minder foutgevoelig dan menselijk handelen. Daardoor is de kans op een datalek kleiner en zijn de gegevens van burgers en bedrijven beter beschermd.", + "decision_making_process": null, + "documentation": null, + "competent_authority": null, + "lawful_basis": "Wet open overheid en AVG", + "iama": "Nee", + "iama_description": "Niet beschikbaar", + "dpia": "Nee", + "dpia_description": null, + "objection_procedure": "Bezwaar maken conform de Algemene wet bestuursrecht ", + "standard_version": "0.3.1", + "uuid": null, + "url": "Nog niet beschikbaar", + "contact_email": "Nog niet beschikbaar", + "area": null, + "lang": "NLD", + "revision_date": null, + "description": null, + "application_url": "https://www.datamask.nl/", + "publiccode": null, + "mprd": null, + "source_data": "Database voor black- en whitelisting", + "methods_and_models": "Natural Language Processing en Named Entity Recognition", + "monitoring": "Nog niet beschikbaar", + "human_intervention": "De door middel van de software geanonimiseerde documenten kunnen na afloop gecontroleerd worden door een medewerker. Het algoritme zelf wordt periodiek hertraind.", + "risks": null, + "performance_standard": null, + "provider": "Data Mask B.V.", + "process_index_url": "https://www.amersfoort.nl/register-van-verwerkingen-amersfoort", + "tags": "tekstanalyse, naamherkenning", + "source_id": null, + "published": true, + "released": true, + "create_dt": "2023-04-26 13:57:08.531237+00:00", + "lars": "36779938", + "owner": "gemeente-amersfoort", + "leverancier_id": null + } +] \ No newline at end of file diff --git a/backend/app/etl/load.py b/backend/app/etl/load.py index 4e012d93..8de4de9c 100644 --- a/backend/app/etl/load.py +++ b/backend/app/etl/load.py @@ -1,7 +1,26 @@ from app.etl.resources.loader import AlgoritmeLoader -def load(): +def load_excel(): excel_file = "app/etl/data/Masterlijst_Algoritmeregister.xlsx" loader = AlgoritmeLoader(excel_file=excel_file) return loader.load_algoritmes() + + +def load_json(): + json_file = "app/etl/data/pub_data.json" + loader = AlgoritmeLoader(json_file=json_file) + return loader.load_algoritmes() + + +if __name__ == "__main__": + from app.util.logger import get_logger + + logger = get_logger(__name__) + + # data_loaded = load_json() + data_loaded = load_excel() + if data_loaded: + logger.info("Algoritmes loaded") + else: + logger.info("Data not loaded") diff --git a/backend/app/etl/resources/loader.py b/backend/app/etl/resources/loader.py index af9b2b5e..41818b28 100644 --- a/backend/app/etl/resources/loader.py +++ b/backend/app/etl/resources/loader.py @@ -1,17 +1,17 @@ import pandas as pd import numpy as np import json +from pydantic import ValidationError from app.database.database import SessionLocal -from app.etl.config.main import models, column_grouping from app.etl.config.excel_column_mapping import excel_column_mapping -from slugify import slugify +from app import models, schemas +from app.util import upc class AlgoritmeLoader: """Load algoritmes from a json file. Existing algoritmes will be removed.""" def __init__(self, excel_file: str | None = None, json_file: str | None = None): - if excel_file is not None: df = self.__get_df_algoritme_from_excel(excel_file) elif json_file is not None: @@ -39,72 +39,116 @@ def __get_df_algoritme_from_excel(excel_file: str) -> pd.DataFrame: .T ) df_all = pd.concat([df_all, df]) + + df_all["lars"] = None + df_all["published"] = True + df_all["released"] = True + df_all["Schema"] = "0.1.0" + df_all["Herzieningsdatum"] = df_all["Herzieningsdatum"].astype("string") + return df_all.rename(columns=excel_column_mapping) @staticmethod def __get_df_algoritme_from_json(json_file: str) -> pd.DataFrame: with open(json_file) as f: algoritmes: list[dict] = json.load(f) - df = pd.DataFrame(algoritmes)[3:] + df = pd.DataFrame(algoritmes) return df @staticmethod def process_df(df: pd.DataFrame) -> list[dict]: - df.columns = df.columns.str.lower() - - boolean_cols = ["dpia", "mprd"] - non_null_columns = [c for c in list(df.columns) if c not in boolean_cols] - string_cols = [ "source_data", + "description_short", ] - - for bc in boolean_cols: - df[bc] = df[bc].map({"Ja": True, "Nee": False, np.nan: None}) - - for nc in non_null_columns: - df[nc] = df[nc].fillna("") - for sc in string_cols: df[sc] = df[sc].str.slice(0, 5000) - return df.replace({np.nan: None}).to_dict(orient="records") + # build a column to indicate who owns the algorithm. If there are two parties (separated by a comma), take the + # first one. + if "owner" not in df.columns: + df["owner"] = ( + df.organization.replace(" ", "-", regex=True) + .apply(str.lower) + .str.split(pat=",", expand=True)[0] + ) - def __get_model_from_algoritme_data(self, algoritme: dict, model_key: str): - kwargs = {c: algoritme[c] for c in column_grouping[model_key]} - model = models[model_key](**kwargs) - return model + df = df.replace( + { + "owner": { + "ministerie-van-financiën": "ministerie-fin", + "ministerie-van-economische-zaken-en-klimaat": "ministerie-ezk", + "sociale-verzekeringsbank-(svb)": "sociale-verzekeringsbank", + "uitvoeringsinstituut-werknemersverzekeringen-(uwv)": "uitvoeringsinstituut-werknemersver" + "zekeringen", + "rijksdienst-voor-identiteitsgegevens-(rvig)": "rijksdienst-voor-identiteitsgegevens", + } + } + ) - def load_algoritmes(self): + return df.replace({np.nan: None}).to_dict(orient="records") - algoritmes = self.__algoritmes - - with SessionLocal() as session: - session.query(models["algoritme"]).delete() - session.commit() - - # insert algoritmes - for a in algoritmes: - new_algoritme = self.__get_model_from_algoritme_data( - algoritme=a, model_key="algoritme" - ) - a_name: str = new_algoritme.name - a_organization: str = new_algoritme.organization - new_algoritme.slug = self.slugify_str_list([a_name, a_organization]) - - property_keys = [key for key in models.keys() if key != "algoritme"] - for pk in property_keys: - setattr( - new_algoritme, - pk, - self.__get_model_from_algoritme_data(algoritme=a, model_key=pk), + def load_algoritmes(self): + counter = 0 + with SessionLocal() as db: + db.query(models.Algoritme).delete() + db.commit() + for new_version in self.__algoritmes: + # Checks presence in db based on LARS-code. + lars = new_version["lars"] + if lars: + algo_in_db = ( + db.query(models.Algoritme) + .filter(models.Algoritme.lars == lars) + .first() ) - - session.add(new_algoritme) - - session.commit() - return True - - @staticmethod - def slugify_str_list(str_list: list[str]): - return slugify("-".join(str_list)) + else: + algo_in_db = None + + if not algo_in_db: + # If not found, makes a new algorithm. + + # Test provided LARS-code for validity. + lars_is_valid = upc.validate_upc(new_version["lars"]) + if not lars_is_valid: + # Redefines LARS-code. + lars_list = [ + id[0] for id in db.query(models.Algoritme.id).all() + ] + lars = upc.find_new_upc(avoid_upc_list=lars_list) + + # Makes a new algorithm. + algoritme_dict = { + "lars": lars, + "owner": new_version["owner"], + } + new_algoritme = models.Algoritme(**algoritme_dict) + db.add(new_algoritme) + db.flush() + db.refresh(new_algoritme) + algoritme_id = new_algoritme.id + else: + # If found, archive newest algo + algoritme_id = algo_in_db.id + + # add a new algorithm_version + # Remove all the columns that belong in the 'algoritme' table. + new_version.pop("lars") + new_version.pop("owner") + new_version["algoritme_id"] = algoritme_id + new_version_model = models.AlgoritmeVersion(**new_version) + + # test validity + + version_str = "v" + new_version["standard_version"].replace(".", "_") + schema = schemas.versions.create_algorithm_in_loader_schema(version_str) + try: + schema.parse_obj(new_version) + except ValidationError as e: + print(e) + counter += len(e.args[0]) + + db.add(new_version_model) + db.commit() + print("Number of validation errors:", counter) + return True diff --git a/backend/app/main.py b/backend/app/main.py index dfb86e13..d155cb1a 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -1,27 +1,63 @@ from fastapi import FastAPI from starlette.middleware.cors import CORSMiddleware from fastapi import APIRouter -from app.routers import default, aggregations -from app.etl.load import load +from app.routers import default, aggregations, text_loader +from app.api import api +from app.etl.load import load_json from app.util.logger import get_logger - +from app.config.settings import Settings, Keycloak logger = get_logger(__name__) -data_loaded = load() -if data_loaded: - logger.info("Algoritmes loaded") +# Only do automatic data loading on the public website +env_settings = Settings() +logger.info(f"Environment variable TYPE: {env_settings.type}") + +if (env_settings.type == "PUB") or (env_settings.type == "DEV"): + data_loaded = load_json() + if data_loaded: + logger.info("Algoritmes loaded") + else: + logger.info("Data not loaded") + +if (env_settings.type == "PUB") or (env_settings.type == "DEV"): + fe_api_url = "/api" else: - logger.info("Data not loaded") + fe_api_url = "/conceptapi" -app = FastAPI(docs_url="/api-docs", title="Application API") +logger.info(f"API prefix set to {fe_api_url}") -router = APIRouter() -app.include_router(default.router, prefix="/api", tags=["default"]) + +app = FastAPI( + docs_url=f"{fe_api_url}/api-docs", + openapi_url=f"{fe_api_url}/openapi.json", + title="Application API", + swagger_ui_parameters={"displayRequestDuration": True}, +) router = APIRouter() -app.include_router(aggregations.router, prefix="/api", tags=["aggregations"]) +app.include_router(default.router, prefix=fe_api_url, tags=["default"]) +app.include_router(aggregations.router, prefix=fe_api_url, tags=["aggregations"]) +app.include_router(text_loader.router, tags=["text loader"]) app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"] ) + +if (env_settings.type == "API") or (env_settings.type == "DEV"): + logger.info(f"Mounting {env_settings.type}") + app.mount("/aanleverapi", api) + + +if (env_settings.type == "API") or (env_settings.type == "DEV"): + + @app.get("/conceptapi/config") + def get_config(): + """I cannot get variables in the frontend relating to differentiate between test, acc and prod""" + settings = Keycloak() + response = { + "keycloak_uri": settings.KEYCLOAK_URI, + "keycloak_realm": settings.KEYCLOAK_REALM, + "keycloak_client": settings.KEYCLOAK_CLIENT, + } + return response diff --git a/backend/app/middleware/__init__.py b/backend/app/middleware/__init__.py new file mode 100644 index 00000000..fe76411a --- /dev/null +++ b/backend/app/middleware/__init__.py @@ -0,0 +1,3 @@ +from .middleware import get_db # noqa +from .decorators import * # noqa +from .keycloak_authenticator import get_current_user # noqa diff --git a/backend/app/middleware/decorators/__init__.py b/backend/app/middleware/decorators/__init__.py new file mode 100644 index 00000000..79f9f809 --- /dev/null +++ b/backend/app/middleware/decorators/__init__.py @@ -0,0 +1 @@ +from .auth import authorized_user_only, publisher_only, admin_only # noqa diff --git a/backend/app/middleware/decorators/auth.py b/backend/app/middleware/decorators/auth.py new file mode 100644 index 00000000..a92b0dd3 --- /dev/null +++ b/backend/app/middleware/decorators/auth.py @@ -0,0 +1,89 @@ +from functools import wraps +from fastapi import HTTPException, status +from sqlalchemy.orm import Session +import logging +from app import schemas, models + +logger = logging.getLogger(__name__) + + +def authorized_user_only(func): + """Validates that the user has authorization to access the requested resource. + + Returns the same function as the input (including the args and kwargs). + + The decorator makes several assumptions regarding the database structure, and is + fit-for-purpose. It is not a general tool to check your authorization. + + Only to be used as a @decorator with FastAPI routing.""" + + @wraps(func) + async def wrapper( + *args, + db: Session, + lars: str | None = None, + as_org: str, + user: schemas.User, + **kwargs, + ): + # Tests if the user can act on behalf of this organisation + if as_org not in user.organizations: + logger.error( + f"Authorization error, requested org: {as_org}.\nOrganisations under this user: \n{user.organizations}" + ) + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail=f"Er zijn geen accountsrechten gevonden voor een organisatie '{as_org}'.", + ) + + # if no code is given, only authorisation for organisation is needed + if lars is None: + return await func(*args, **kwargs, db=db, as_org=as_org, user=user) + + # Tests if the algorithm requested is in the scope of this organisation + algos_in_scope = ( + db.query(models.algoritme.Algoritme.lars) + .filter(models.algoritme.Algoritme.owner == as_org) + .all() + ) + algos_in_scope_dict = [algo[0] for algo in algos_in_scope] + if lars not in algos_in_scope_dict: + logger.error( + f"""Authorization error, requested LARS-code: {lars}.\nAvailable LARS-codes for this organisation: + \n{algos_in_scope_dict}""" + ) + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail=f"Er is geen algoritme gevonden met LARS-code '{lars}' onder de organisatie '{as_org}'.", + ) + + # After authorization, return decorated function + return await func(*args, **kwargs, db=db, lars=lars, as_org=as_org, user=user) + + return wrapper + + +def publisher_only(func): + @wraps(func) + async def wrapper(*args, user: schemas.User, **kwargs): + if (user.role != "publisher") and (user.role != "admin"): + raise HTTPException( + status_code=status.HTTP_403_FORBIDDEN, + detail="Not authorized to perform this action.", + ) + return await func(*args, user=user, **kwargs) + + return wrapper + + +def admin_only(func): + @wraps(func) + async def wrapper(*args, user: schemas.User, **kwargs): + if user.role != "admin": + raise HTTPException( + status_code=status.HTTP_403_FORBIDDEN, + detail="Not authorized to perform this action.", + ) + return await func(*args, user=user, **kwargs) + + return wrapper diff --git a/backend/app/middleware/keycloak_authenticator.py b/backend/app/middleware/keycloak_authenticator.py new file mode 100644 index 00000000..48d5ef39 --- /dev/null +++ b/backend/app/middleware/keycloak_authenticator.py @@ -0,0 +1,112 @@ +from fastapi.security import OAuth2AuthorizationCodeBearer +from fastapi import Depends +from keycloak import KeycloakOpenID +from fastapi import HTTPException, status +import jwt +from jwt.exceptions import ExpiredSignatureError +import logging +import time +from app.config.settings import Keycloak +from app import schemas + +logger = logging.getLogger(__name__) + +settings = Keycloak() +URI = settings.KEYCLOAK_URI +CLIENT = settings.KEYCLOAK_CLIENT +REALM = settings.KEYCLOAK_REALM + +oauth2_scheme = OAuth2AuthorizationCodeBearer( + authorizationUrl=f"{URI}/realms/{REALM}/protocol/openid-connect/auth", + tokenUrl=f"{URI}/realms/{REALM}/protocol/openid-connect/token", +) + +cache = dict() + +logger.info(f"{URI}/realms/{REALM}/protocol/openid-connect/auth") + + +class UserUnauthorizedException(HTTPException): + def __init__(self): + super().__init__( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="Inloggegevens konden niet succesvol worden gevalideerd.", + headers={"WWW-Authenticate": "Bearer"}, + ) + + +def _update_public_key(keycloak_openid: KeycloakOpenID, update_interval=30): + """ + Update cache by fetching a new public key + Returns false if last update is less than seconds ago to prevent overusage and infinite loops + """ + if time.time() - cache["keycloak_public_key_updated"] > update_interval: + cache["keycloak_public_key"] = keycloak_openid.public_key() + cache["keycloak_public_key_updated"] = time.time() + return True + return False + + +def _get_public_key(keycloak_openid: KeycloakOpenID): + if "keycloak_public_key" not in cache: + logger.info("fetching public key") + cache["keycloak_public_key"] = keycloak_openid.public_key() + cache["keycloak_public_key_updated"] = time.time() + return cache["keycloak_public_key"] + + +def _decode_token(token: str): + """ + Fetch the public key from Keycloak and decode the token from the frontend. + Note: Data in the token is NOT encrypted. the public key is only to validate. + """ + logger.info("authorizing") + # public access type + keycloak_openid = KeycloakOpenID( + server_url=URI, + client_id=CLIENT, + realm_name=REALM, + ) + + public_key = _get_public_key(keycloak_openid) + KEYCLOAK_PUBLIC_KEY = ( + "-----BEGIN PUBLIC KEY-----\n" + public_key + "\n-----END PUBLIC KEY-----" + ) + try: + decoded = jwt.decode( + token, + key=KEYCLOAK_PUBLIC_KEY, + options={"verify_signature": True, "verify_aud": False, "exp": True}, + algorithms=["RS256"], + ) + logger.info(f'session for {decoded["preferred_username"]} still active') + return decoded + + except ExpiredSignatureError: + logger.info("session expired") + raise UserUnauthorizedException() + + except jwt.exceptions.DecodeError: + if _update_public_key(keycloak_openid): + logger.info("Could not decode token. Updating public key and retry once") + return _decode_token(token) + logger.info("Could not decode token") + raise UserUnauthorizedException() + + except jwt.exceptions.ImmatureSignatureError: + logger.info("token not yet valid, retrying") + time.sleep(0.5) + return _decode_token(token) + + +def get_current_user(token=Depends(oauth2_scheme)) -> schemas.User: + user = _decode_token(token) + logger.debug(f"received token for {user['preferred_username']}") + # Keycloak gives organisations with a '/' before the organisation, slice it. + organizations = [org[1:] for org in user.get("group", [])] + user_schema = schemas.User( + organizations=organizations, + name=user.get("preferred_username"), + role=user.get("role"), + ) + return user_schema diff --git a/backend/app/middleware/middleware.py b/backend/app/middleware/middleware.py index 4107fc6f..90e3f309 100644 --- a/backend/app/middleware/middleware.py +++ b/backend/app/middleware/middleware.py @@ -1,7 +1,6 @@ from app.database.database import SessionLocal -# Dependency def get_db(): db = SessionLocal() try: diff --git a/backend/app/models/__init__.py b/backend/app/models/__init__.py index 362d84db..95493203 100644 --- a/backend/app/models/__init__.py +++ b/backend/app/models/__init__.py @@ -1,6 +1,3 @@ from .algoritme import Algoritme # noqa -from .inzet import Inzet # noqa -from .juridisch import Juridisch # noqa -from .metadata import Metadata # noqa -from .toepassing import Toepassing # noqa -from .toezicht import Toezicht # noqa +from .algoritme_version import AlgoritmeVersion # noqa +from .action_history import ActionHistory, OperationEnum # noqa diff --git a/backend/app/models/action_history.py b/backend/app/models/action_history.py new file mode 100644 index 00000000..bbd3a0af --- /dev/null +++ b/backend/app/models/action_history.py @@ -0,0 +1,32 @@ +from sqlalchemy import Column, Integer, DateTime, VARCHAR, Enum +import enum +from sqlalchemy import ForeignKey +from sqlalchemy.sql import func +from app.database.database import Base + + +class OperationEnum(str, enum.Enum): + created = "created" + new_version = "new version" + released = "released" + published = "published" + retracted = "retracted" + preview_activated = "preview activated" + preview_used = "preview used" + preview_timeout = "preview timeout" + removed = "removed" + + +class ActionHistory(Base): + __tablename__ = "action_history" + + id = Column(Integer, primary_key=True, index=True) + algoritme_version_id = Column( + Integer, ForeignKey("algoritme_version.id"), nullable=False + ) + operation = Column(Enum(OperationEnum), nullable=False) + user_id = Column(VARCHAR(1024), nullable=False) + + create_dt = Column( + DateTime(timezone=True), nullable=False, server_default=func.now() + ) diff --git a/backend/app/models/algoritme.py b/backend/app/models/algoritme.py index 517956fc..31cc10e2 100644 --- a/backend/app/models/algoritme.py +++ b/backend/app/models/algoritme.py @@ -1,29 +1,18 @@ -from sqlalchemy import Column, Integer, VARCHAR, DateTime -from app.database.database import Base +from sqlalchemy import Column, Integer, DateTime, VARCHAR from sqlalchemy.orm import relationship from sqlalchemy.sql import func +from app.database.database import Base class Algoritme(Base): __tablename__ = "algoritme" id = Column(Integer, primary_key=True, index=True) - name = Column(VARCHAR(1024)) - organization = Column(VARCHAR(1024)) - department = Column(VARCHAR(1024)) - description_short = Column(VARCHAR(1024)) - type = Column(VARCHAR(1024)) - category = Column(VARCHAR(1024)) - website = Column(VARCHAR(1024)) - status = Column(VARCHAR(1024)) - slug = Column(VARCHAR(128)) + lars = Column(VARCHAR(8), nullable=True, index=True) + owner = Column(VARCHAR(1024), nullable=True) - toegevoegd_op = Column(DateTime(timezone=True), server_default=func.now()) - - inzet = relationship("Inzet", back_populates="algoritme", uselist=False) - juridisch = relationship("Juridisch", back_populates="algoritme", uselist=False) - metadata_algorithm = relationship( - "Metadata", back_populates="algoritme", uselist=False + create_dt = Column( + DateTime(timezone=True), nullable=False, server_default=func.now() ) - toepassing = relationship("Toepassing", back_populates="algoritme", uselist=False) - toezicht = relationship("Toezicht", back_populates="algoritme", uselist=False) + + versions = relationship("AlgoritmeVersion", back_populates="algoritme") diff --git a/backend/app/models/algoritme_version.py b/backend/app/models/algoritme_version.py new file mode 100644 index 00000000..2c455d6b --- /dev/null +++ b/backend/app/models/algoritme_version.py @@ -0,0 +1,76 @@ +from sqlalchemy import Column, Integer, VARCHAR, DateTime, ForeignKey, Boolean +from sqlalchemy.ext.associationproxy import association_proxy +from app.database.database import Base +from sqlalchemy.orm import relationship +from sqlalchemy.sql import func + + +class AlgoritmeVersion(Base): + __tablename__ = "algoritme_version" + + id = Column(Integer, primary_key=True, index=True) + algoritme_id = Column(Integer, ForeignKey("algoritme.id"), nullable=False) + name = Column(VARCHAR(1024)) + organization = Column(VARCHAR(1024)) + department = Column(VARCHAR(1024)) + description_short = Column(VARCHAR(5000)) + type = Column(VARCHAR(1024)) + category = Column(VARCHAR(1024)) + website = Column(VARCHAR(1024)) + status = Column(VARCHAR(1024)) + + # Inzet + goal = Column(VARCHAR(5000)) + impact = Column(VARCHAR(5000)) + proportionality = Column(VARCHAR(5000)) + decision_making_process = Column(VARCHAR(5000)) + documentation = Column(VARCHAR(1024)) + + # Juridisch + competent_authority = Column(VARCHAR(1024)) + lawful_basis = Column(VARCHAR(5000)) + iama = Column(VARCHAR(128)) + iama_description = Column(VARCHAR(5000)) + dpia = Column(VARCHAR(128)) + dpia_description = Column(VARCHAR(5000)) + objection_procedure = Column(VARCHAR(5000)) + + # Metadata + standard_version = Column(VARCHAR(1024)) + uuid = Column(VARCHAR(1024)) + url = Column(VARCHAR(1024)) + contact_email = Column(VARCHAR(1024)) + area = Column(VARCHAR(1024)) + lang = Column(VARCHAR(1024)) + revision_date = Column(VARCHAR(1024)) + + # Toepassing + description = Column(VARCHAR(10000)) + application_url = Column(VARCHAR(1024)) + publiccode = Column(VARCHAR(1024)) + mprd = Column(VARCHAR(500)) + source_data = Column(VARCHAR(5000)) + methods_and_models = Column(VARCHAR(5000)) + + # Toezicht + monitoring = Column(VARCHAR(5000)) + human_intervention = Column(VARCHAR(5000)) + risks = Column(VARCHAR(5000)) + performance_standard = Column(VARCHAR(5000)) + + # Additions by 0.3.1 + provider = Column(VARCHAR(100)) + process_index_url = Column(VARCHAR(500)) + tags = Column(VARCHAR(2500)) + source_id = Column(VARCHAR(100)) + + published = Column(Boolean, nullable=False, default=False) + released = Column(Boolean, nullable=False, default=False) + preview_active = Column(Boolean, nullable=False, default=False) + create_dt = Column(DateTime(timezone=True), server_default=func.now()) + + algoritme = relationship("Algoritme", back_populates="versions") + + lars = association_proxy("algoritme", "lars") + owner = association_proxy("algoritme", "owner") + leverancier_id = association_proxy("algoritme", "leverancier_id") diff --git a/backend/app/models/inzet.py b/backend/app/models/inzet.py deleted file mode 100644 index 1db3e6ae..00000000 --- a/backend/app/models/inzet.py +++ /dev/null @@ -1,20 +0,0 @@ -from sqlalchemy import Column, Integer, VARCHAR, ForeignKey, DateTime -from app.database.database import Base -from sqlalchemy.orm import relationship -from sqlalchemy.sql import func - - -class Inzet(Base): - __tablename__ = "inzet" - - id = Column(Integer, primary_key=True, index=True) - goal = Column(VARCHAR(5000)) - impact = Column(VARCHAR(5000)) - proportionality = Column(VARCHAR(5000)) - decision_making_process = Column(VARCHAR(5000)) - documentation = Column(VARCHAR(1024)) - - algoritme_id = Column(Integer, ForeignKey("algoritme.id")) - toegevoegd_op = Column(DateTime(timezone=True), server_default=func.now()) - - algoritme = relationship("Algoritme", back_populates="inzet") diff --git a/backend/app/models/juridisch.py b/backend/app/models/juridisch.py deleted file mode 100644 index ae06afae..00000000 --- a/backend/app/models/juridisch.py +++ /dev/null @@ -1,21 +0,0 @@ -from sqlalchemy import Column, Integer, VARCHAR, Boolean, ForeignKey, DateTime -from app.database.database import Base -from sqlalchemy.orm import relationship -from sqlalchemy.sql import func - - -class Juridisch(Base): - __tablename__ = "juridisch" - - id = Column(Integer, primary_key=True, index=True) - competent_authority = Column(VARCHAR(1024)) - lawful_basis = Column(VARCHAR(5000)) - iama = Column(VARCHAR(128)) - iama_description = Column(VARCHAR(5000)) - dpia = Column(Boolean) - dpia_description = Column(VARCHAR(5000)) - objection_procedure = Column(VARCHAR(5000)) - algoritme_id = Column(Integer, ForeignKey("algoritme.id")) - toegevoegd_op = Column(DateTime(timezone=True), server_default=func.now()) - - algoritme = relationship("Algoritme", back_populates="juridisch") diff --git a/backend/app/models/metadata.py b/backend/app/models/metadata.py deleted file mode 100644 index b5f9c072..00000000 --- a/backend/app/models/metadata.py +++ /dev/null @@ -1,21 +0,0 @@ -from sqlalchemy import Column, Integer, VARCHAR, ForeignKey, DateTime -from app.database.database import Base -from sqlalchemy.orm import relationship -from sqlalchemy.sql import func - - -class Metadata(Base): - __tablename__ = "metadata" - - id = Column(Integer, primary_key=True, index=True) - schema = Column(VARCHAR(1024)) - uuid = Column(VARCHAR(1024)) - url = Column(VARCHAR(1024)) - contact_email = Column(VARCHAR(1024)) - area = Column(VARCHAR(1024)) - lang = Column(VARCHAR(1024)) - revision_date = Column(VARCHAR(1024)) - algoritme_id = Column(Integer, ForeignKey("algoritme.id")) - toegevoegd_op = Column(DateTime(timezone=True), server_default=func.now()) - - algoritme = relationship("Algoritme", back_populates="metadata_algorithm") diff --git a/backend/app/models/toepassing.py b/backend/app/models/toepassing.py deleted file mode 100644 index 91e1b973..00000000 --- a/backend/app/models/toepassing.py +++ /dev/null @@ -1,20 +0,0 @@ -from sqlalchemy import Column, Integer, VARCHAR, Boolean, ForeignKey, DateTime -from app.database.database import Base -from sqlalchemy.orm import relationship -from sqlalchemy.sql import func - - -class Toepassing(Base): - __tablename__ = "toepassing" - - id = Column(Integer, primary_key=True, index=True) - description = Column(VARCHAR(10000)) - application_url = Column(VARCHAR(1024)) - publiccode = Column(VARCHAR(1024)) - mprd = Column(Boolean) - source_data = Column(VARCHAR(5000)) - methods_and_models = Column(VARCHAR(5000)) - algoritme_id = Column(Integer, ForeignKey("algoritme.id")) - toegevoegd_op = Column(DateTime(timezone=True), server_default=func.now()) - - algoritme = relationship("Algoritme", back_populates="toepassing") diff --git a/backend/app/models/toezicht.py b/backend/app/models/toezicht.py deleted file mode 100644 index d76221f1..00000000 --- a/backend/app/models/toezicht.py +++ /dev/null @@ -1,18 +0,0 @@ -from sqlalchemy import Column, Integer, VARCHAR, ForeignKey, DateTime -from app.database.database import Base -from sqlalchemy.orm import relationship -from sqlalchemy.sql import func - - -class Toezicht(Base): - __tablename__ = "toezicht" - - id = Column(Integer, primary_key=True, index=True) - monitoring = Column(VARCHAR(5000)) - human_intervention = Column(VARCHAR(5000)) - risks = Column(VARCHAR(5000)) - performance_standard = Column(VARCHAR(5000)) - algoritme_id = Column(Integer, ForeignKey("algoritme.id")) - toegevoegd_op = Column(DateTime(timezone=True), server_default=func.now()) - - algoritme = relationship("Algoritme", back_populates="toezicht") diff --git a/backend/app/queries/algoritme.sql b/backend/app/queries/algoritme.sql deleted file mode 100644 index 35b1a74b..00000000 --- a/backend/app/queries/algoritme.sql +++ /dev/null @@ -1,41 +0,0 @@ -with algoritme as ( - select - algoritme.*, - inzet.decision_making_process, - inzet.documentation, - inzet.goal, - inzet.impact, - inzet.proportionality, - juridisch.competent_authority, - juridisch.dpia, - juridisch.dpia_description, - juridisch.lawful_basis, - juridisch.objection_procedure, - metadata.area, - metadata.contact_email, - metadata.lang, - metadata.revision_date, - metadata.schema, - metadata.url, - toepassing.application_url, - toepassing.description, - toepassing.methods_and_models, - toepassing.mprd, - toepassing.publiccode, - toepassing.source_data, - toezicht.human_intervention, - toezicht.monitoring, - toezicht.performance_standard, - toezicht.risks - from - algoritme - join inzet on inzet.algoritme_id = algoritme.id - join juridisch on juridisch.algoritme_id = algoritme.id - join metadata on metadata.algoritme_id = algoritme.id - join toepassing on toepassing.algoritme_id = algoritme.id - join toezicht on toezicht.algoritme_id = algoritme.id -) -select - * -from - algoritme \ No newline at end of file diff --git a/backend/app/routers/__init__.py b/backend/app/routers/__init__.py index e69de29b..a354ccae 100644 --- a/backend/app/routers/__init__.py +++ b/backend/app/routers/__init__.py @@ -0,0 +1 @@ +from . import v0_1_0, v0_2_3, v0_3_1 # noqa diff --git a/backend/app/routers/aggregations.py b/backend/app/routers/aggregations.py index a21870e6..d11395cf 100644 --- a/backend/app/routers/aggregations.py +++ b/backend/app/routers/aggregations.py @@ -5,21 +5,27 @@ from sqlalchemy import text from app.config.resource import Columns import logging +from app import models +from app.config.settings import Settings router = APIRouter() logger = logging.getLogger(__name__) +env_settings = Settings() @router.get("/columns/") async def get_columns(db: Session = Depends(get_db)): stmt = text( - """SELECT table_name, column_name, is_nullable + """SELECT column_name, is_nullable FROM information_schema.columns WHERE table_schema = 'public' + AND table_name = 'algoritme_version' AND column_name != 'algoritme_id' AND column_name != 'id' - AND table_name != 'alembic_version' - ORDER BY table_name, ordinal_position + AND column_name != 'end_dt' + AND column_name != 'create_dt' + AND column_name != 'published' + ORDER BY ordinal_position """ ) return db.execute(stmt).all() @@ -27,7 +33,10 @@ async def get_columns(db: Session = Depends(get_db)): @router.get("/db-count/") async def get_total_count(db: Session = Depends(get_db)) -> int: - stmt = text("SELECT count(id) FROM algoritme") + if (env_settings.type == "API") or (env_settings.type == "DEV"): + stmt = text("SELECT count(id) FROM algoritme_version WHERE released IS TRUE") + else: + stmt = text("SELECT count(id) FROM algoritme_version WHERE published IS TRUE") return int(db.execute(stmt).all()[0][0]) @@ -36,12 +45,8 @@ async def get_count_per_type(column: Columns, db: Session = Depends(get_db)): stmt = text( f""" SELECT count(1), {column.value} as descriptor - FROM algoritme - LEFT JOIN inzet ON algoritme.id=inzet.algoritme_id - LEFT JOIN juridisch ON algoritme.id=juridisch.algoritme_id - LEFT JOIN metadata ON algoritme.id=metadata.algoritme_id - LEFT JOIN toepassing ON algoritme.id=toepassing.algoritme_id - LEFT JOIN toezicht ON algoritme.id=toezicht.algoritme_id + FROM algoritme_version + WHERE algoritme_version.published IS TRUE GROUP BY {column.value} ORDER BY count(1) desc LIMIT 10 @@ -52,24 +57,29 @@ async def get_count_per_type(column: Columns, db: Session = Depends(get_db)): @router.get("/completeness/") async def get_count_with_filled_columns( - columns: list[Columns] | None = Query(default=None), db: Session = Depends(get_db) + columns: list[Columns] = Query(default=None), db: Session = Depends(get_db) ): - selection_string = ", ".join(columns) - stmt = text( - f"""SELECT {selection_string} - FROM algoritme - LEFT JOIN inzet ON algoritme.id=inzet.algoritme_id - LEFT JOIN juridisch ON algoritme.id=juridisch.algoritme_id - LEFT JOIN metadata ON algoritme.id=metadata.algoritme_id - LEFT JOIN toepassing ON algoritme.id=toepassing.algoritme_id - LEFT JOIN toezicht ON algoritme.id=toezicht.algoritme_id - """ - ) + column_list = [col[0] for col in columns] - table = db.execute(stmt).all() + ignore_columns = ["end_dt", "published"] + columns_model_list = [ + col + for col in models.AlgoritmeVersion.__table__.columns + if col.key not in ignore_columns + ] + + if "*" not in column_list: + columns_model_list = [ + col for col in columns_model_list if col.key in column_list + ] + + table = ( + db.query(*columns_model_list).filter(models.AlgoritmeVersion.published).all() + ) - def is_filled(cell: any) -> bool: - return [""].count(cell) == 0 + def is_filled(cell) -> bool: + checks = [cell != "", cell is not None] + return all(checks) compliantRows = [] for row in table: diff --git a/backend/app/routers/default.py b/backend/app/routers/default.py index 2e549637..47fb35ad 100644 --- a/backend/app/routers/default.py +++ b/backend/app/routers/default.py @@ -1,80 +1,111 @@ -from fastapi import APIRouter -from fastapi import Depends -from app.middleware.middleware import get_db +from fastapi import APIRouter, HTTPException, status, Depends from sqlalchemy.orm import Session -import app.models as models -import app.schemas as schemas import logging -from sqlalchemy import or_, and_, func, sql +from sqlalchemy import or_, and_, func, sql, desc import pandas as pd from fastapi.responses import StreamingResponse import io import datetime import csv +import json +from app.config.settings import Settings +from app.middleware.middleware import get_db +from app import models, schemas, controllers router = APIRouter() logger = logging.getLogger(__name__) +env_settings = Settings() + @router.post( "/algoritme/", - # response_model=schemas.algoritme.AlgoritmeQueryResponse, + response_model=schemas.AlgoritmeQueryResponse, ) async def get_all( - algoritme_query: schemas.algoritme.AlgoritmeQuery, db: Session = Depends(get_db) + algoritme_query: schemas.algoritme_version.AlgoritmeQuery, + db: Session = Depends(get_db), ): - model = models.algoritme.Algoritme + model = models.AlgoritmeVersion or_clauses_search = [] + + exclude_columns = [ + "id", + "algoritme_id", + "create_dt", + "end_dt", + "dpia", + "mprd", + "published", + "preview_active", + "released", + "source_id", + ] if len(algoritme_query.search) > 0: - columns_to_search_in = [model.name, model.organization, model.description_short] - for c in columns_to_search_in: - or_clauses_search.append( - or_( - func.lower(c) - .like(f"%{algoritme_query.search.lower()}%") - .self_group() - ) - ) + # Select columns to search in from the table + columns = model.__table__.columns + search_columns = [col for col in columns if col.key not in exclude_columns] + + # Add searching in every column to the or clauses + for col in search_columns: + or_clauses_search.append(col.ilike(f"%{algoritme_query.search.lower()}%")) and_clauses_filters = [] if len(algoritme_query.filters) > 0: - for a in algoritme_query.filters: - column = getattr(model, a.attribute) - if type(a.value) is list: - and_clauses_filters.append(and_(column.in_(a.value)).self_group()) + for a_filter in algoritme_query.filters: + column = getattr(model, a_filter.attribute) + # a_filter.value is a list when multiple filters of the same column (e.g. organization) are applied. + if type(a_filter.value) is list: + and_clauses_filters.append(column.in_(a_filter.value)) else: - and_clauses_filters.append(and_(column == a.value).self_group()) + and_clauses_filters.append(column == a_filter.value) + + search_clause = or_(*or_clauses_search) - search_clause = and_(or_(*or_clauses_search)) - where_clause = and_(search_clause, and_(*and_clauses_filters)) + # Public website sees only published, Concept website sees only released. + if (env_settings.type == "API") or (env_settings.type == "DEV"): + show_clause = model.released + else: # env_settings.type == "PUB" + show_clause = model.published - query_filtered = ( + where_clause = and_(search_clause, *and_clauses_filters, show_clause) + + query = ( db.query(model) - .order_by(model.slug) + .order_by(model.algoritme_id) .filter(where_clause) .limit(algoritme_query.limit) .offset((algoritme_query.page - 1) * algoritme_query.limit) ) + # Constructs returning aggregation dictionary. aggregation_columns = [model.organization] - - aggregation_queries = [ - db.query( + aggregation_queries = [] + for c in aggregation_columns: + query_agg = db.query( sql.expression.literal(c.name).label("aggregation_column"), c.label("aggregation_value"), func.count(c).label("count"), ) - .filter(where_clause) - .group_by(c) - for c in aggregation_columns - ] + + query_agg = query_agg.filter(where_clause).group_by(c) + aggregation_queries.append(query_agg) aggregation_union = aggregation_queries[0].union(*aggregation_queries[1:]).all() + # Constructs returning total count. + total_count = db.query(func.count(model.id)).filter(where_clause).scalar() + + results = [] + for q in query.all(): + algo_dict = q.__dict__.copy() + algo_dict["lars"] = q.lars + results.append(algo_dict) + return { - "results": query_filtered.all(), - "total_count": db.query(func.count(model.id)).filter(where_clause).scalar(), + "results": results, + "total_count": total_count, "aggregations": [ { "values": [a for a in aggregation_union if a[0] == c.name], @@ -85,47 +116,72 @@ async def get_all( } +output_schemas = schemas.util.get_all_output_schemas_union() + + @router.get( - "/algoritme/{slug}/", - response_model=schemas.algoritme.Algoritme, + "/algoritme/{lars}/", + response_model=output_schemas | None, ) -async def get_one(slug: str, db: Session = Depends(get_db)): - return ( - db.query(models.algoritme.Algoritme) - .filter(models.algoritme.Algoritme.slug == slug) - .first() - ) +async def get_one(lars: str, db: Session = Depends(get_db)): + if lars[0] == "C": + result = ( + db.query(models.AlgoritmeVersion) + .filter( + models.AlgoritmeVersion.lars == lars[1:], + models.AlgoritmeVersion.preview_active, + ) + .first() + ) + controllers.disable_preview( + lars=lars[1:], + db=db, + user="anonymous website visitor", + reason=models.OperationEnum.preview_used, + ) + else: + # Public website sees only published, Concept website sees only released. + if (env_settings.type == "API") or (env_settings.type == "DEV"): + show_clause = models.AlgoritmeVersion.released + else: # env_settings.type == "PUB" + show_clause = models.AlgoritmeVersion.published + + result = ( + db.query(models.AlgoritmeVersion) + .filter( + models.AlgoritmeVersion.lars == lars, + show_clause, + ) + .order_by(desc(models.AlgoritmeVersion.create_dt)) + .first() + ) + + if not result: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail="Kan algoritme niet vinden.", + ) + return result -@router.get("/algoritme-simple-list/") -async def get_simple_list(db: Session = Depends(get_db)): - return db.query( - models.algoritme.Algoritme.slug, - models.algoritme.Algoritme.name, - models.algoritme.Algoritme.organization, - ).all() +excel_schema = schemas.get_algorithm_export_schema(truncated=True) @router.get("/file/algoritme") async def download_algoritme(db: Session = Depends(get_db)): result = ( - db.query(models.algoritme.Algoritme) - .order_by(models.algoritme.Algoritme.slug) + db.query(models.AlgoritmeVersion) + .filter(models.AlgoritmeVersion.published) + .order_by(models.AlgoritmeVersion.algoritme_id) .all() ) - data = [schemas.algoritme.Algoritme.from_orm(r).dict() for r in result] - df = pd.json_normalize(data) - relevant_columns = [ - c - for c in df.columns - if c not in ["id", "slug"] - and all( - [excluded_string not in c for excluded_string in ["algoritme_id", ".id"]] - ) - ] + # Use schema to filter output of query + data = [excel_schema.from_orm(r).dict() for r in result] + df = pd.DataFrame(data) + stream = io.BytesIO() - df = df[relevant_columns].replace(r"\n", "", regex=True) + df = df.replace(r"\n", "", regex=True) df.to_csv(stream, index=False, quoting=csv.QUOTE_ALL, encoding="utf-8-sig") response = StreamingResponse(iter([stream.getvalue()]), media_type="text/csv") @@ -137,3 +193,36 @@ async def download_algoritme(db: Session = Depends(get_db)): response.headers["Content-Disposition"] = f"attachment; filename={filename}" return response + + +json_schema = schemas.get_algorithm_export_schema(truncated=False) +if (env_settings.type == "API") or (env_settings.type == "DEV"): + + @router.get( + "/json/algoritme", + response_model=list[json_schema], + ) + async def export_algoritme_json(db: Session = Depends(get_db)): + result = ( + db.query(models.algoritme_version.AlgoritmeVersion) + .filter(models.AlgoritmeVersion.published) + .order_by(models.AlgoritmeVersion.create_dt) + .all() + ) + + data = [json_schema.from_orm(r).dict() for r in result] + df = pd.DataFrame(data) + df["create_dt"] = df["create_dt"].astype(str) + + df = df[(df["owner"] != "sandbox")] + data_out = df.to_dict(orient="records") + + stream = io.BytesIO() + stream.write(json.dumps(data_out).encode()) + response = StreamingResponse(iter([stream.getvalue()]), media_type="json") + + # response.headers["Content-Encoding"] = "UTF-8" + # response.headers["Content-type"] = "json; charset=UTF-8" + response.headers["Content-Disposition"] = "attachment; filename=pub_data.json" + + return response diff --git a/backend/app/routers/text_loader.py b/backend/app/routers/text_loader.py new file mode 100644 index 00000000..b710c1e3 --- /dev/null +++ b/backend/app/routers/text_loader.py @@ -0,0 +1,42 @@ +import logging +from fastapi import APIRouter +import json +from app.config.settings import Settings + +env_settings = Settings() + +# Application specific code +if (env_settings.type == "PUB") or (env_settings.type == "DEV"): + fe_api_url = "/api" +else: + fe_api_url = "/conceptapi" + +GET_URL = f"{fe_api_url}/supporting-text" +JSON_PATH = "app/data/text_loader/supporting_text.json" + +# Boilerplate +if env_settings.type == "DEV": + include_in_schema = True +else: + include_in_schema = False + +logger = logging.getLogger(__name__) +router = APIRouter() + + +def get_content_json() -> dict[str, dict[str, dict[str, str]]]: + path = JSON_PATH + with open(path) as f: + content: dict[str, dict[str, dict[str, str]]] = json.load(f) + return content + + +@router.get(GET_URL) +async def get_all_content(): + """ + Fetch all content. + + :return: Content in dictionary format: lang { group { field { key, label } }} + """ + content = get_content_json() + return content diff --git a/backend/app/routers/v0_1_0/__init__.py b/backend/app/routers/v0_1_0/__init__.py new file mode 100644 index 00000000..735560ed --- /dev/null +++ b/backend/app/routers/v0_1_0/__init__.py @@ -0,0 +1 @@ +from .algoritme import api # noqa diff --git a/backend/app/routers/v0_1_0/algoritme.py b/backend/app/routers/v0_1_0/algoritme.py new file mode 100644 index 00000000..d9f7de2a --- /dev/null +++ b/backend/app/routers/v0_1_0/algoritme.py @@ -0,0 +1,223 @@ +from fastapi import Depends, Path, FastAPI, APIRouter, BackgroundTasks, routing +from sqlalchemy.orm import Session +from app import schemas, models, middleware, controllers +from app.middleware.decorators import authorized_user_only, publisher_only, admin_only +from app.middleware.keycloak_authenticator import get_current_user +from app.config.api import api_text, responses + +version = __name__.split(".")[-2] +input_schema = schemas.create_algorithm_in_schema(version) +output_schemas = schemas.get_all_output_schemas_union() + +version_str = version[1:].replace("_", ".") +api = FastAPI( + docs_url="/api-docs", + title=f"Algoritmeregister aanlevering API, versie {version_str} ", + swagger_ui_parameters={ + "displayRequestDuration": True, + "defaultModelsExpandDepth": -1, + }, +) + +router = APIRouter() +published_router = APIRouter() +action_router = APIRouter() + + +@router.get( + "/organizations/{organization_name}/algorithms", + response_model=list[schemas.AlgorithmSummary], + responses=responses["get_all"], + summary=api_text["get_all"]["summary"], + description=api_text["get_all"]["description"], +) +@authorized_user_only +async def get_all_algorithms( + as_org: str = Path(alias="organization_name"), + db: Session = Depends(middleware.get_db), + user: schemas.User = Depends(middleware.get_current_user), +) -> list[schemas.AlgorithmSummary]: + result = controllers.algoritme_version.get_all_newest( + as_org=as_org, + db=db, + user=user, + ) + return result + + +@router.get( + "/organizations/{organization_name}/algorithms/{algorithm_id}", + response_model=output_schemas | None, + responses=responses["get_one"], + summary=api_text["get_one"]["summary"], + description=api_text["get_one"]["description"], +) +@authorized_user_only +async def get_one_algorithm( + as_org: str = Path(alias="organization_name"), + lars: str = Path(alias="algorithm_id"), + db: Session = Depends(middleware.get_db), + user: schemas.User = Depends(get_current_user), +) -> models.AlgoritmeVersion: + return controllers.algoritme_version.get_one_newest(lars=lars, db=db, user=user) + + +@router.post( + "/organizations/{organization_name}/algorithms", + response_model=schemas.NewAlgorithmResponse, + responses=responses["post"], + summary=api_text["post"]["summary"], + description=api_text["post"]["description"], +) +@authorized_user_only +async def create_one_algorithm( + body: input_schema, + as_org: str = Path(alias="organization_name"), + db: Session = Depends(middleware.get_db), + user: schemas.User = Depends(get_current_user), +) -> schemas.NewAlgorithmResponse: + # The standard_version can not be required, because it isn't according to BZK. + if body.standard_version is None: # type: ignore + body.standard_version = version_str + + return controllers.algoritme_version.post_one( + as_org=as_org, body=body, db=db, user=user + ) + + +@router.put( + "/organizations/{organization_name}/algorithms/{algorithm_id}", + responses=responses["put"], + summary=api_text["put"]["summary"], + description=api_text["put"]["description"], +) +@authorized_user_only +async def update_one_algorithm( + body: input_schema, + as_org: str = Path(alias="organization_name"), + lars: str = Path(alias="algorithm_id"), + db: Session = Depends(middleware.get_db), + user: schemas.User = Depends(get_current_user), +) -> schemas.AlgorithmActionResponse | None: + # The standard_version can not be required, because it isn't according to BZK. + if body.standard_version is None: # type: ignore + body.standard_version = version_str + + return controllers.algoritme_version.update_new_version( + body=body, lars=lars, db=db, user=user + ) + + +@action_router.get( + "/organizations/{organization_name}/algorithms/{algorithm_id}/preview", + response_model=schemas.PreviewUrl, + responses=responses["preview"], + summary=api_text["preview"]["summary"], + description=api_text["preview"]["description"], +) +@authorized_user_only +async def get_one_preview_url( + background_tasks: BackgroundTasks, + as_org: str = Path(alias="organization_name"), + lars: str = Path(alias="algorithm_id"), + db: Session = Depends(middleware.get_db), + user: schemas.User = Depends(get_current_user), +) -> schemas.PreviewUrl: + background_tasks.add_task( + controllers.algoritme_version.wait_then_disable_preview, lars=lars, db=db + ) + return controllers.algoritme_version.get_preview_link(lars=lars, db=db, user=user) + + +@published_router.get( + "/organizations/{organization_name}/published-algorithms/{algorithm_id}", + response_model=output_schemas | None, + responses=responses["get_one_published"], + summary=api_text["get_one_published"]["summary"], + description=api_text["get_one_published"]["description"], +) +@authorized_user_only +async def get_one_published_algorithm( + as_org: str = Path(alias="organization_name"), + lars: str = Path(alias="algorithm_id"), + db: Session = Depends(middleware.get_db), + user: schemas.User = Depends(get_current_user), +) -> models.AlgoritmeVersion: + return controllers.algoritme_version.get_one_published(lars=lars, db=db, user=user) + + +@action_router.delete( + "/organizations/{organization_name}/published-algorithms/{algorithm_id}/retract", + responses=responses["delete"], + summary=api_text["delete"]["summary"], + description=api_text["delete"]["description"], +) +@authorized_user_only +async def retract_one_published_algorithm( + as_org: str = Path(alias="organization_name"), + lars: str = Path(alias="algorithm_id"), + db: Session = Depends(middleware.get_db), + user: schemas.User = Depends(get_current_user), +) -> None: + return controllers.algoritme_version.retract_one(lars=lars, db=db, user=user) + + +@action_router.put( + "/organizations/{organization_name}/algorithms/{algorithm_id}/release", + responses=responses["release"], + summary=api_text["release"]["summary"], + description=api_text["release"]["description"], +) +@authorized_user_only +async def release_one_algorithm( + as_org: str = Path(alias="organization_name"), + lars: str = Path(alias="algorithm_id"), + db: Session = Depends(middleware.get_db), + user: schemas.User = Depends(get_current_user), +) -> schemas.AlgorithmActionResponse | None: + return controllers.algoritme_version.release_one(lars=lars, db=db, user=user) + + +@action_router.put( + "/organizations/{organization_name}/algorithms/{algorithm_id}/publish", + responses=responses["publish"], + summary=api_text["publish"]["summary"], + description=api_text["publish"]["description"], +) +@publisher_only +@authorized_user_only +async def publish_one_algorithm( + as_org: str = Path(alias="organization_name"), + lars: str = Path(alias="algorithm_id"), + db: Session = Depends(middleware.get_db), + user: schemas.User = Depends(get_current_user), +) -> schemas.AlgorithmActionResponse | None: + return controllers.algoritme_version.publish_one(lars=lars, db=db, user=user) + + +@action_router.delete( + "/organizations/{organization_name}/algorithms/{algorithm_id}/remove", + responses=responses["remove"], + summary=api_text["remove"]["summary"], + description=api_text["remove"]["description"], + include_in_schema=False, +) +@admin_only +@authorized_user_only +async def remove_one_algorithm( + as_org: str = Path(alias="organization_name"), + lars: str = Path(alias="algorithm_id"), + db: Session = Depends(middleware.get_db), + user: schemas.User = Depends(get_current_user), +) -> schemas.AlgorithmActionResponse | None: + return controllers.algoritme_version.remove_one(lars=lars, db=db, user=user) + + +api.include_router(router, tags=["Algoritmes in ontwikkeling"]) +api.include_router(published_router, tags=["Gepubliceerde algoritmes"]) +api.include_router(action_router, tags=["Acties"]) + +# Rename all the operation_id's in the schema to the name of the corresponding route. +for route in api.routes: + if isinstance(route, routing.APIRoute): + route.operation_id = route.name diff --git a/backend/app/routers/v0_2_3/__init__.py b/backend/app/routers/v0_2_3/__init__.py new file mode 100644 index 00000000..735560ed --- /dev/null +++ b/backend/app/routers/v0_2_3/__init__.py @@ -0,0 +1 @@ +from .algoritme import api # noqa diff --git a/backend/app/routers/v0_2_3/algoritme.py b/backend/app/routers/v0_2_3/algoritme.py new file mode 100644 index 00000000..d9f7de2a --- /dev/null +++ b/backend/app/routers/v0_2_3/algoritme.py @@ -0,0 +1,223 @@ +from fastapi import Depends, Path, FastAPI, APIRouter, BackgroundTasks, routing +from sqlalchemy.orm import Session +from app import schemas, models, middleware, controllers +from app.middleware.decorators import authorized_user_only, publisher_only, admin_only +from app.middleware.keycloak_authenticator import get_current_user +from app.config.api import api_text, responses + +version = __name__.split(".")[-2] +input_schema = schemas.create_algorithm_in_schema(version) +output_schemas = schemas.get_all_output_schemas_union() + +version_str = version[1:].replace("_", ".") +api = FastAPI( + docs_url="/api-docs", + title=f"Algoritmeregister aanlevering API, versie {version_str} ", + swagger_ui_parameters={ + "displayRequestDuration": True, + "defaultModelsExpandDepth": -1, + }, +) + +router = APIRouter() +published_router = APIRouter() +action_router = APIRouter() + + +@router.get( + "/organizations/{organization_name}/algorithms", + response_model=list[schemas.AlgorithmSummary], + responses=responses["get_all"], + summary=api_text["get_all"]["summary"], + description=api_text["get_all"]["description"], +) +@authorized_user_only +async def get_all_algorithms( + as_org: str = Path(alias="organization_name"), + db: Session = Depends(middleware.get_db), + user: schemas.User = Depends(middleware.get_current_user), +) -> list[schemas.AlgorithmSummary]: + result = controllers.algoritme_version.get_all_newest( + as_org=as_org, + db=db, + user=user, + ) + return result + + +@router.get( + "/organizations/{organization_name}/algorithms/{algorithm_id}", + response_model=output_schemas | None, + responses=responses["get_one"], + summary=api_text["get_one"]["summary"], + description=api_text["get_one"]["description"], +) +@authorized_user_only +async def get_one_algorithm( + as_org: str = Path(alias="organization_name"), + lars: str = Path(alias="algorithm_id"), + db: Session = Depends(middleware.get_db), + user: schemas.User = Depends(get_current_user), +) -> models.AlgoritmeVersion: + return controllers.algoritme_version.get_one_newest(lars=lars, db=db, user=user) + + +@router.post( + "/organizations/{organization_name}/algorithms", + response_model=schemas.NewAlgorithmResponse, + responses=responses["post"], + summary=api_text["post"]["summary"], + description=api_text["post"]["description"], +) +@authorized_user_only +async def create_one_algorithm( + body: input_schema, + as_org: str = Path(alias="organization_name"), + db: Session = Depends(middleware.get_db), + user: schemas.User = Depends(get_current_user), +) -> schemas.NewAlgorithmResponse: + # The standard_version can not be required, because it isn't according to BZK. + if body.standard_version is None: # type: ignore + body.standard_version = version_str + + return controllers.algoritme_version.post_one( + as_org=as_org, body=body, db=db, user=user + ) + + +@router.put( + "/organizations/{organization_name}/algorithms/{algorithm_id}", + responses=responses["put"], + summary=api_text["put"]["summary"], + description=api_text["put"]["description"], +) +@authorized_user_only +async def update_one_algorithm( + body: input_schema, + as_org: str = Path(alias="organization_name"), + lars: str = Path(alias="algorithm_id"), + db: Session = Depends(middleware.get_db), + user: schemas.User = Depends(get_current_user), +) -> schemas.AlgorithmActionResponse | None: + # The standard_version can not be required, because it isn't according to BZK. + if body.standard_version is None: # type: ignore + body.standard_version = version_str + + return controllers.algoritme_version.update_new_version( + body=body, lars=lars, db=db, user=user + ) + + +@action_router.get( + "/organizations/{organization_name}/algorithms/{algorithm_id}/preview", + response_model=schemas.PreviewUrl, + responses=responses["preview"], + summary=api_text["preview"]["summary"], + description=api_text["preview"]["description"], +) +@authorized_user_only +async def get_one_preview_url( + background_tasks: BackgroundTasks, + as_org: str = Path(alias="organization_name"), + lars: str = Path(alias="algorithm_id"), + db: Session = Depends(middleware.get_db), + user: schemas.User = Depends(get_current_user), +) -> schemas.PreviewUrl: + background_tasks.add_task( + controllers.algoritme_version.wait_then_disable_preview, lars=lars, db=db + ) + return controllers.algoritme_version.get_preview_link(lars=lars, db=db, user=user) + + +@published_router.get( + "/organizations/{organization_name}/published-algorithms/{algorithm_id}", + response_model=output_schemas | None, + responses=responses["get_one_published"], + summary=api_text["get_one_published"]["summary"], + description=api_text["get_one_published"]["description"], +) +@authorized_user_only +async def get_one_published_algorithm( + as_org: str = Path(alias="organization_name"), + lars: str = Path(alias="algorithm_id"), + db: Session = Depends(middleware.get_db), + user: schemas.User = Depends(get_current_user), +) -> models.AlgoritmeVersion: + return controllers.algoritme_version.get_one_published(lars=lars, db=db, user=user) + + +@action_router.delete( + "/organizations/{organization_name}/published-algorithms/{algorithm_id}/retract", + responses=responses["delete"], + summary=api_text["delete"]["summary"], + description=api_text["delete"]["description"], +) +@authorized_user_only +async def retract_one_published_algorithm( + as_org: str = Path(alias="organization_name"), + lars: str = Path(alias="algorithm_id"), + db: Session = Depends(middleware.get_db), + user: schemas.User = Depends(get_current_user), +) -> None: + return controllers.algoritme_version.retract_one(lars=lars, db=db, user=user) + + +@action_router.put( + "/organizations/{organization_name}/algorithms/{algorithm_id}/release", + responses=responses["release"], + summary=api_text["release"]["summary"], + description=api_text["release"]["description"], +) +@authorized_user_only +async def release_one_algorithm( + as_org: str = Path(alias="organization_name"), + lars: str = Path(alias="algorithm_id"), + db: Session = Depends(middleware.get_db), + user: schemas.User = Depends(get_current_user), +) -> schemas.AlgorithmActionResponse | None: + return controllers.algoritme_version.release_one(lars=lars, db=db, user=user) + + +@action_router.put( + "/organizations/{organization_name}/algorithms/{algorithm_id}/publish", + responses=responses["publish"], + summary=api_text["publish"]["summary"], + description=api_text["publish"]["description"], +) +@publisher_only +@authorized_user_only +async def publish_one_algorithm( + as_org: str = Path(alias="organization_name"), + lars: str = Path(alias="algorithm_id"), + db: Session = Depends(middleware.get_db), + user: schemas.User = Depends(get_current_user), +) -> schemas.AlgorithmActionResponse | None: + return controllers.algoritme_version.publish_one(lars=lars, db=db, user=user) + + +@action_router.delete( + "/organizations/{organization_name}/algorithms/{algorithm_id}/remove", + responses=responses["remove"], + summary=api_text["remove"]["summary"], + description=api_text["remove"]["description"], + include_in_schema=False, +) +@admin_only +@authorized_user_only +async def remove_one_algorithm( + as_org: str = Path(alias="organization_name"), + lars: str = Path(alias="algorithm_id"), + db: Session = Depends(middleware.get_db), + user: schemas.User = Depends(get_current_user), +) -> schemas.AlgorithmActionResponse | None: + return controllers.algoritme_version.remove_one(lars=lars, db=db, user=user) + + +api.include_router(router, tags=["Algoritmes in ontwikkeling"]) +api.include_router(published_router, tags=["Gepubliceerde algoritmes"]) +api.include_router(action_router, tags=["Acties"]) + +# Rename all the operation_id's in the schema to the name of the corresponding route. +for route in api.routes: + if isinstance(route, routing.APIRoute): + route.operation_id = route.name diff --git a/backend/app/routers/v0_3_1/__init__.py b/backend/app/routers/v0_3_1/__init__.py new file mode 100644 index 00000000..735560ed --- /dev/null +++ b/backend/app/routers/v0_3_1/__init__.py @@ -0,0 +1 @@ +from .algoritme import api # noqa diff --git a/backend/app/routers/v0_3_1/algoritme.py b/backend/app/routers/v0_3_1/algoritme.py new file mode 100644 index 00000000..d9f7de2a --- /dev/null +++ b/backend/app/routers/v0_3_1/algoritme.py @@ -0,0 +1,223 @@ +from fastapi import Depends, Path, FastAPI, APIRouter, BackgroundTasks, routing +from sqlalchemy.orm import Session +from app import schemas, models, middleware, controllers +from app.middleware.decorators import authorized_user_only, publisher_only, admin_only +from app.middleware.keycloak_authenticator import get_current_user +from app.config.api import api_text, responses + +version = __name__.split(".")[-2] +input_schema = schemas.create_algorithm_in_schema(version) +output_schemas = schemas.get_all_output_schemas_union() + +version_str = version[1:].replace("_", ".") +api = FastAPI( + docs_url="/api-docs", + title=f"Algoritmeregister aanlevering API, versie {version_str} ", + swagger_ui_parameters={ + "displayRequestDuration": True, + "defaultModelsExpandDepth": -1, + }, +) + +router = APIRouter() +published_router = APIRouter() +action_router = APIRouter() + + +@router.get( + "/organizations/{organization_name}/algorithms", + response_model=list[schemas.AlgorithmSummary], + responses=responses["get_all"], + summary=api_text["get_all"]["summary"], + description=api_text["get_all"]["description"], +) +@authorized_user_only +async def get_all_algorithms( + as_org: str = Path(alias="organization_name"), + db: Session = Depends(middleware.get_db), + user: schemas.User = Depends(middleware.get_current_user), +) -> list[schemas.AlgorithmSummary]: + result = controllers.algoritme_version.get_all_newest( + as_org=as_org, + db=db, + user=user, + ) + return result + + +@router.get( + "/organizations/{organization_name}/algorithms/{algorithm_id}", + response_model=output_schemas | None, + responses=responses["get_one"], + summary=api_text["get_one"]["summary"], + description=api_text["get_one"]["description"], +) +@authorized_user_only +async def get_one_algorithm( + as_org: str = Path(alias="organization_name"), + lars: str = Path(alias="algorithm_id"), + db: Session = Depends(middleware.get_db), + user: schemas.User = Depends(get_current_user), +) -> models.AlgoritmeVersion: + return controllers.algoritme_version.get_one_newest(lars=lars, db=db, user=user) + + +@router.post( + "/organizations/{organization_name}/algorithms", + response_model=schemas.NewAlgorithmResponse, + responses=responses["post"], + summary=api_text["post"]["summary"], + description=api_text["post"]["description"], +) +@authorized_user_only +async def create_one_algorithm( + body: input_schema, + as_org: str = Path(alias="organization_name"), + db: Session = Depends(middleware.get_db), + user: schemas.User = Depends(get_current_user), +) -> schemas.NewAlgorithmResponse: + # The standard_version can not be required, because it isn't according to BZK. + if body.standard_version is None: # type: ignore + body.standard_version = version_str + + return controllers.algoritme_version.post_one( + as_org=as_org, body=body, db=db, user=user + ) + + +@router.put( + "/organizations/{organization_name}/algorithms/{algorithm_id}", + responses=responses["put"], + summary=api_text["put"]["summary"], + description=api_text["put"]["description"], +) +@authorized_user_only +async def update_one_algorithm( + body: input_schema, + as_org: str = Path(alias="organization_name"), + lars: str = Path(alias="algorithm_id"), + db: Session = Depends(middleware.get_db), + user: schemas.User = Depends(get_current_user), +) -> schemas.AlgorithmActionResponse | None: + # The standard_version can not be required, because it isn't according to BZK. + if body.standard_version is None: # type: ignore + body.standard_version = version_str + + return controllers.algoritme_version.update_new_version( + body=body, lars=lars, db=db, user=user + ) + + +@action_router.get( + "/organizations/{organization_name}/algorithms/{algorithm_id}/preview", + response_model=schemas.PreviewUrl, + responses=responses["preview"], + summary=api_text["preview"]["summary"], + description=api_text["preview"]["description"], +) +@authorized_user_only +async def get_one_preview_url( + background_tasks: BackgroundTasks, + as_org: str = Path(alias="organization_name"), + lars: str = Path(alias="algorithm_id"), + db: Session = Depends(middleware.get_db), + user: schemas.User = Depends(get_current_user), +) -> schemas.PreviewUrl: + background_tasks.add_task( + controllers.algoritme_version.wait_then_disable_preview, lars=lars, db=db + ) + return controllers.algoritme_version.get_preview_link(lars=lars, db=db, user=user) + + +@published_router.get( + "/organizations/{organization_name}/published-algorithms/{algorithm_id}", + response_model=output_schemas | None, + responses=responses["get_one_published"], + summary=api_text["get_one_published"]["summary"], + description=api_text["get_one_published"]["description"], +) +@authorized_user_only +async def get_one_published_algorithm( + as_org: str = Path(alias="organization_name"), + lars: str = Path(alias="algorithm_id"), + db: Session = Depends(middleware.get_db), + user: schemas.User = Depends(get_current_user), +) -> models.AlgoritmeVersion: + return controllers.algoritme_version.get_one_published(lars=lars, db=db, user=user) + + +@action_router.delete( + "/organizations/{organization_name}/published-algorithms/{algorithm_id}/retract", + responses=responses["delete"], + summary=api_text["delete"]["summary"], + description=api_text["delete"]["description"], +) +@authorized_user_only +async def retract_one_published_algorithm( + as_org: str = Path(alias="organization_name"), + lars: str = Path(alias="algorithm_id"), + db: Session = Depends(middleware.get_db), + user: schemas.User = Depends(get_current_user), +) -> None: + return controllers.algoritme_version.retract_one(lars=lars, db=db, user=user) + + +@action_router.put( + "/organizations/{organization_name}/algorithms/{algorithm_id}/release", + responses=responses["release"], + summary=api_text["release"]["summary"], + description=api_text["release"]["description"], +) +@authorized_user_only +async def release_one_algorithm( + as_org: str = Path(alias="organization_name"), + lars: str = Path(alias="algorithm_id"), + db: Session = Depends(middleware.get_db), + user: schemas.User = Depends(get_current_user), +) -> schemas.AlgorithmActionResponse | None: + return controllers.algoritme_version.release_one(lars=lars, db=db, user=user) + + +@action_router.put( + "/organizations/{organization_name}/algorithms/{algorithm_id}/publish", + responses=responses["publish"], + summary=api_text["publish"]["summary"], + description=api_text["publish"]["description"], +) +@publisher_only +@authorized_user_only +async def publish_one_algorithm( + as_org: str = Path(alias="organization_name"), + lars: str = Path(alias="algorithm_id"), + db: Session = Depends(middleware.get_db), + user: schemas.User = Depends(get_current_user), +) -> schemas.AlgorithmActionResponse | None: + return controllers.algoritme_version.publish_one(lars=lars, db=db, user=user) + + +@action_router.delete( + "/organizations/{organization_name}/algorithms/{algorithm_id}/remove", + responses=responses["remove"], + summary=api_text["remove"]["summary"], + description=api_text["remove"]["description"], + include_in_schema=False, +) +@admin_only +@authorized_user_only +async def remove_one_algorithm( + as_org: str = Path(alias="organization_name"), + lars: str = Path(alias="algorithm_id"), + db: Session = Depends(middleware.get_db), + user: schemas.User = Depends(get_current_user), +) -> schemas.AlgorithmActionResponse | None: + return controllers.algoritme_version.remove_one(lars=lars, db=db, user=user) + + +api.include_router(router, tags=["Algoritmes in ontwikkeling"]) +api.include_router(published_router, tags=["Gepubliceerde algoritmes"]) +api.include_router(action_router, tags=["Acties"]) + +# Rename all the operation_id's in the schema to the name of the corresponding route. +for route in api.routes: + if isinstance(route, routing.APIRoute): + route.operation_id = route.name diff --git a/backend/app/schemas/__init__.py b/backend/app/schemas/__init__.py index 7d9528d2..48bea4c2 100644 --- a/backend/app/schemas/__init__.py +++ b/backend/app/schemas/__init__.py @@ -1 +1,4 @@ -from .algoritme import Algoritme # noqa +from .versions import * # noqa +from .algoritme_version import * # noqa +from .misc import * # noqa +from .util import * # noqa diff --git a/backend/app/schemas/algoritme.py b/backend/app/schemas/algoritme.py deleted file mode 100644 index 09c4a50b..00000000 --- a/backend/app/schemas/algoritme.py +++ /dev/null @@ -1,111 +0,0 @@ -from pydantic import BaseModel -from typing import TypedDict - - -class BaseModelOrmMode(BaseModel): - class Config: - orm_mode = True - - -class Inzet(BaseModelOrmMode): - id: str - goal: str - impact: str - proportionality: str - decision_making_process: str - documentation: str | None - algoritme_id: str | None - - -class Juridisch(BaseModelOrmMode): - id: str - competent_authority: str | None - lawful_basis: str - iama: str | None - iama_description: str | None - dpia: bool | None - dpia_description: str | None - objection_procedure: str - algoritme_id: str | None - - -class Metadata(BaseModelOrmMode): - id: str - # schema is an attribute of BaseModel, so name cannot be identical to database - schema_metadata: str | None - uuid: str | None - url: str | None - contact_email: str - area: str | None - lang: str | None - revision_date: str | None - algoritme_id: str | None - - -class Toepassing(BaseModelOrmMode): - id: str - description: str | None - application_url: str | None - publiccode: str | None - mprd: bool | None - source_data: str | None - methods_and_models: str | None - algoritme_id: str | None - - -class Toezicht(BaseModelOrmMode): - id: str - monitoring: str | None - human_intervention: str - risks: str | None - performance_standard: str | None - algoritme_id: str | None - - -class Algoritme(BaseModelOrmMode): - slug: str - id: str - name: str - organization: str - department: str - description_short: str - type: str - category: str - website: str | None - status: str - inzet: Inzet | None - juridisch: Juridisch | None - metadata_algorithm: Metadata | None - toepassing: Toepassing | None - toezicht: Toezicht | None - - -class AlgoritmeFilters(BaseModel): - attribute: str - value: str | list[str] - - -class AlgoritmeQuery(BaseModel): - filters: list[AlgoritmeFilters] = [] - page: int = 1 - limit: int = 10 - search: str = "" - - -class AlgoritmeAggregation(BaseModel): - aggregation_value: str - count: int - - class Config: - orm_mode = True - - -class AggregatedAttribute(TypedDict): - aggregation_attribute: str - values: list[AlgoritmeAggregation] - - -class AlgoritmeQueryResponse(BaseModel): - results: list[Algoritme] - total_count: int - aggregations: list[AggregatedAttribute] diff --git a/backend/app/schemas/algoritme_version.py b/backend/app/schemas/algoritme_version.py new file mode 100644 index 00000000..67253b15 --- /dev/null +++ b/backend/app/schemas/algoritme_version.py @@ -0,0 +1,63 @@ +from pydantic import BaseModel +from datetime import datetime +from typing import TypedDict +from .util import get_all_output_schemas_union + + +# api +class AlgorithmSummary(BaseModel): + name: str | None + schema_version: str | None + last_update_dt: datetime + lars: str + source_id: str | None + published: bool + current_version_released: bool + current_version_published: bool + last_update_by: str | None + + class Config: + orm_mode = True + + +class NewAlgorithmResponse(BaseModel): + lars_code: str + + +class AlgorithmActionResponse(BaseModel): + message: str | None + + +# burgerwebsite +output_schemas = get_all_output_schemas_union() + + +class AlgoritmeFilters(BaseModel): + attribute: str + value: str | list[str] + + +class AlgoritmeQuery(BaseModel): + filters: list[AlgoritmeFilters] = [] + page: int = 1 + limit: int = 10 + search: str = "" + + +class AlgoritmeAggregation(BaseModel): + aggregation_value: str | None + count: int | None + + class Config: + orm_mode = True + + +class AggregatedAttribute(TypedDict): + values: list[AlgoritmeAggregation] + aggregation_attribute: str + + +class AlgoritmeQueryResponse(BaseModel): + results: list[output_schemas] # type: ignore + total_count: int + aggregations: list[AggregatedAttribute] diff --git a/backend/app/schemas/config/v0_1_0.json b/backend/app/schemas/config/v0_1_0.json new file mode 100644 index 00000000..19c3e627 --- /dev/null +++ b/backend/app/schemas/config/v0_1_0.json @@ -0,0 +1,376 @@ +{ + "properties": { + "name": { + "type": "string", + "title": "Naam", + "max_length": 1024, + "show_always": true, + "help_text": "De naam die gebruikt wordt om het algoritme aan te duiden", + "instructions": "", + "example": "", + "required": true + }, + "organization": { + "type": "string", + "title": "Organisatie", + "max_length": 1024, + "show_always": true, + "help_text": "De volledige naam van de organisatie verantwoordelijk voor de inzet van het algoritme.", + "instructions": "", + "example": "", + "required": true + }, + "department": { + "type": "string", + "title": "Afdeling", + "max_length": 1024, + "show_always": true, + "help_text": "De volledige naam van de afdeling of divisie verantwoordelijk voor de inzet van het algoritme.", + "instructions": "", + "example": "", + "required": false + }, + "description_short": { + "type": "string", + "title": "Korte omschrijving", + "max_length": 5000, + "show_always": true, + "help_text": "Een korte, abstracte beschrijving van het algoritme.", + "instructions": "", + "example": "", + "required": false + }, + "type": { + "type": "string", + "title": "Type algoritme", + "max_length": 1024, + "show_always": true, + "help_text": "Is het algoritme op regels gebaseerd of zelflerend? Regelgebaseerde algoritmes zijn handmatig door mensen gebouwd, meestal op basis van wetten of verordeningen. Zelflerende algoritmes kunnen zelf verbanden ontdekken in gegevens.", + "instructions": "", + "example": "", + "required": false + }, + "category": { + "type": "string", + "title": "Beleidsterrein", + "max_length": 1024, + "show_always": true, + "help_text": "Trefwoorden over het beleidsterrein waarin het algoritme wordt ingezet.", + "instructions": "", + "example": "", + "required": false + }, + "website": { + "type": "string", + "title": "Link naar publiekspagina", + "max_length": 1024, + "show_always": false, + "help_text": "Een URL naar een publiekspagina van de organisatie zelf. Op deze pagina kunt u meer vinden over de inzet van het algoritme binnen de organisatie.", + "instructions": "", + "example": "", + "required": false + }, + "status": { + "type": "string", + "title": "Status", + "max_length": 1024, + "show_always": true, + "help_text": "De status van het algoritme: in ontwikkeling, in gebruik, of buiten gebruik.", + "instructions": "", + "example": "", + "required": false + }, + "goal": { + "type": "string", + "title": "Doel", + "max_length": 5000, + "show_always": true, + "help_text": "Het doel waarvoor het algoritme ontwikkeld is en/of hoe de inzet ervan bijdraagt aan het behalen van die doelen.", + "instructions": "", + "example": "", + "required": false + }, + "impact": { + "type": "string", + "title": "Impact", + "max_length": 5000, + "show_always": true, + "help_text": "De impact van het algoritme op burgers en bedrijven. Bijvoorbeeld: hoe werkt het algoritme en wat zijn de verwachte consequenties daarvan voor het individu of bedrijf?", + "instructions": "", + "example": "", + "required": false + }, + "proportionality": { + "type": "string", + "title": "Proportionaliteit", + "max_length": 5000, + "show_always": true, + "help_text": "Een afweging van de voor- en nadelen van de inzet van het algoritme en waarom dit redelijk gerechtvaardigd is.", + "instructions": "", + "example": "", + "required": false + }, + "decision_making_process": { + "type": "string", + "title": "Proces", + "max_length": 5000, + "show_always": true, + "help_text": "De naam van het bedrijfs- of besluitvormingsproces in de organisatie waarbinnen het algoritme wordt ingezet.", + "instructions": "", + "example": "", + "required": false + }, + "documentation": { + "type": "string", + "title": "Link naar projectpagina", + "max_length": 1024, + "show_always": false, + "help_text": "URL van de projectpagina van de organisatie zelf over dit specifieke gebruik van het algoritme.", + "instructions": "", + "example": "", + "required": false + }, + "description": { + "type": "string", + "title": "Omschrijving", + "max_length": 10000, + "show_always": false, + "help_text": "Een uitgebreide beschrijving van het algoritme (500-5000 tekens).", + "instructions": "", + "example": "", + "required": false + }, + "application_url": { + "type": "string", + "title": "Link naar ontwikkelaar", + "max_length": 1024, + "show_always": false, + "help_text": "Een URL naar een applicatiepagina van de ontwikkelaar. Op deze pagina kunt u meer algemene technische informatie vinden over het algoritme en de ontwikkelaar zelf.", + "instructions": "", + "example": "", + "required": false + }, + "publiccode": { + "type": "string", + "title": "Link naar broncode", + "max_length": 1024, + "show_always": false, + "help_text": "Een URL naar de codepagina van de ontwikkelaar. Op deze pagina kunt u meer vinden over de code van het algoritme zelf.", + "instructions": "", + "example": "", + "required": false + }, + "mprd": { + "type": "string", + "title": "Koppeling met basisregistraties", + "max_length": 500, + "show_always": false, + "help_text": "Maakt het algoritme direct gebruik van data uit het Stelsel van Basisregistraties? Meer informatie is te vinden op https://digitaleoverheid.nl/", + "instructions": "", + "example": "", + "required": false + }, + "source_data": { + "type": "string", + "title": "Databronnen", + "max_length": 5000, + "show_always": false, + "help_text": "Een overzicht van de databronnen die op dit moment gebruikt worden door het algoritme en/of in het begin gebruikt zijn bij het maken van het algoritme", + "instructions": "", + "example": "", + "required": false + }, + "methods_and_models": { + "type": "string", + "title": "Methoden en modellen", + "max_length": 5000, + "show_always": false, + "help_text": "Standaardmethoden of modellen die het algoritme gebruikt.", + "instructions": "", + "example": "", + "required": false + }, + "monitoring": { + "type": "string", + "title": "Monitoring", + "max_length": 5000, + "show_always": false, + "help_text": "Een overzicht van hoe de inzet van het algoritme wordt gemonitord.", + "instructions": "", + "example": "", + "required": false + }, + "human_intervention": { + "type": "string", + "title": "Menselijke tussenkomst", + "max_length": 5000, + "show_always": true, + "help_text": "Een omschrijving van hoe uitkomsten van het algoritme door een mens gecontroleerd en bijgesteld (kunnen) worden.", + "instructions": "", + "example": "", + "required": false + }, + "risks": { + "type": "string", + "title": "Risico's", + "max_length": 5000, + "show_always": false, + "help_text": "Een overzicht van de voorziene risico's bij de inzet van het algoritme", + "instructions": "", + "example": "", + "required": false + }, + "performance_standard": { + "type": "string", + "title": "Prestatienormen", + "max_length": 5000, + "show_always": false, + "help_text": "Een omschrijving van de verwachte prestaties van het algoritme en hoe die worden gemeten.", + "instructions": "", + "example": "", + "required": false + }, + "competent_authority": { + "type": "string", + "title": "Bevoegde authoriteit", + "max_length": 1024, + "show_always": true, + "help_text": "Volledige naam van de bevoegde autoriteit verantwoordelijk voor de inzet van het algoritme.", + "instructions": "", + "example": "", + "required": false + }, + "lawful_basis": { + "type": "string", + "title": "Wettelijke grondslag", + "max_length": 5000, + "show_always": true, + "help_text": "Een omschrijving of een link naar de wettelijke grondslag voor de inzet van het algoritme. Bijvoorbeeld: een wet, een verordening of een formeel besluit.", + "instructions": "", + "example": "", + "required": false + }, + "iama": { + "type": "string", + "title": "Impact Assessment Mensenrechten en Algoritmes (IAMA)", + "max_length": 128, + "show_always": true, + "help_text": "Is het algoritme getoetst op het nakomen van mensenrechten met een Impact Assessment Mensenrechten en Algoritmes (IAMA)?", + "instructions": "", + "example": "", + "required": false + }, + "iama_description": { + "type": "string", + "title": "Omschrijving van de IAMA", + "max_length": 5000, + "show_always": true, + "help_text": "Een overzicht van de belangrijkste zaken die uit de impact assessment mensenrechten en algoritmes (IAMA) naar voren kwamen.", + "instructions": "", + "example": "", + "required": false + }, + "dpia": { + "type": "string", + "title": "Data Protection Impact Assessment (DPIA)", + "max_length": 128, + "show_always": false, + "help_text": "Is het algoritme getoetst op veilig gebruik van gegevens met een Data Protection Impact Assessment (DPIA).", + "instructions": "", + "example": "", + "required": false + }, + "dpia_description": { + "type": "string", + "title": "Omschrijving van de DPIA", + "max_length": 5000, + "show_always": false, + "help_text": "Een overzicht van de belangrijkste zaken die uit de data protection impact assessment (DPIA) naar voren kwamen.", + "instructions": "", + "example": "", + "required": false + }, + "objection_procedure": { + "type": "string", + "title": "Bezwaarprocedure", + "max_length": 5000, + "show_always": true, + "help_text": "Een omschrijving van hoe burgers en bedrijven bezwaar kunnen maken tegen de uitkomsten van het algoritme.", + "instructions": "", + "example": "", + "required": false + }, + "standard_version": { + "type": "enum", + "title": "Schema", + "show_always": false, + "help_text": "", + "instructions": "", + "example": "0.1.0", + "required": false, + "permitted_values": [ + "0.1.0" + ] + }, + "uuid": { + "type": "string", + "title": "UUID", + "max_length": 1024, + "show_always": true, + "help_text": "", + "instructions": "", + "example": "", + "required": false + }, + "url": { + "type": "string", + "title": "Link naar bronregistratie", + "max_length": 1024, + "show_always": false, + "help_text": "De URL van de locatie waar dit algoritme eerder al is vastgelegd; in machine leesbaar formaat.", + "instructions": "", + "example": "", + "required": false + }, + "contact_email": { + "type": "string", + "title": "E-mailadres van de contactpersoon", + "max_length": 1024, + "show_always": true, + "help_text": "De e-mail voor contact over deze registratie.", + "instructions": "", + "example": "", + "required": false + }, + "area": { + "type": "string", + "title": "Geografisch gebied", + "max_length": 1024, + "show_always": false, + "help_text": "Het geografische gebied waarin het algoritme wordt ingezet.", + "instructions": "", + "example": "", + "required": false + }, + "lang": { + "type": "string", + "title": "Taal", + "max_length": 1024, + "show_always": false, + "help_text": "De taal waarin deze registratie is ingevoerd.", + "instructions": "", + "example": "", + "required": false + }, + "revision_date": { + "type": "string", + "title": "Herzieningsdatum", + "max_length": 1024, + "show_always": false, + "help_text": "De datum waarvoor deze registratie moet worden herzien.", + "instructions": "", + "example": "", + "required": false + } + } +} \ No newline at end of file diff --git a/backend/app/schemas/config/v0_2_3.json b/backend/app/schemas/config/v0_2_3.json new file mode 100644 index 00000000..64123acb --- /dev/null +++ b/backend/app/schemas/config/v0_2_3.json @@ -0,0 +1,396 @@ +{ + "properties": { + "name": { + "type": "string", + "title": "Naam", + "max_length": 100, + "show_always": true, + "help_text": "De naam die gebruikt wordt om het algoritme aan te duiden", + "instructions": "De algemeen gehanteerde naam van het algoritme.", + "example": "Automatische Verkeersregeling Ringweg", + "required": true + }, + "organization": { + "type": "string", + "title": "Organisatie", + "max_length": 100, + "show_always": true, + "help_text": "De volledige naam van de organisatie verantwoordelijk voor de inzet van het algoritme.", + "instructions": "De naam van de organisatie verantwoordelijk voor het gebruik van het algoritme. In het geval van een uitvoeringsorganisatie vallend onder een ministerie: gebruik de naam van de uitvoeringsorganisatie zelf, gevolgd door de afkorting tussen haakjes.", + "example": "Gemeente Noorderhaaks", + "required": true + }, + "department": { + "type": "string", + "title": "Afdeling", + "max_length": 500, + "show_always": true, + "help_text": "De volledige naam van de afdeling of divisie verantwoordelijk voor de inzet van het algoritme.", + "instructions": "De volledige naam van de afdeling van de organisatie verantwoordelijk voor het gebruik van het algoritme.", + "example": "Afdeling Verkeer & Bereikbaarheid", + "required": false + }, + "description_short": { + "type": "string", + "title": "Korte omschrijving", + "max_length": 150, + "show_always": true, + "help_text": "Een korte, abstracte beschrijving van het algoritme.", + "instructions": "Een korte, abstracte beschrijving van het algoritme. Bij voorkeur in één of twee zinnen. Vul dit veld in op B1-taalniveau.", + "example": "Dit algoritme optimaliseert de doorstroom van verkeer bij kruispunten op basis van sensoren in het wegdek.", + "required": false, + "permitted_values": [ + "Regelgebaseerd", + "Zelflerend" + ] + }, + "type": { + "type": "enum", + "title": "Type algoritme", + "show_always": true, + "help_text": "Is het algoritme op regels gebaseerd of zelflerend? Regelgebaseerde algoritmes zijn handmatig door mensen gebouwd, meestal op basis van wetten of verordeningen. Zelflerende algoritmes kunnen zelf verbanden ontdekken in gegevens.", + "instructions": "Is het algoritme op regels gebaseerd of zelflerend? Op regels gebaseerde algoritmes zijn handmatig door mensen gebouwd, meestal op basis van wetten of verordeningen. Zelflerende algoritmes hebben zichzelf getraind op basis van data. In het geval dat een algoritme beiden doet, kies voor 'Zelflerend'.", + "example": "Regelgebaseerd", + "required": false, + "permitted_values": [ + "Regelgebaseerd", + "Zelflerend" + ] + }, + "category": { + "type": "string", + "title": "Beleidsterrein", + "max_length": 500, + "show_always": true, + "help_text": "Trefwoorden over het beleidsterrein waarin het algoritme wordt ingezet.", + "instructions": "Trefwoorden die te maken hebben met het domein waarin het algoritme wordt ingezet.", + "example": "Verkeer, Mobiliteit, VRI, Infrastructuur", + "required": false + }, + "website": { + "type": "string", + "title": "Link naar publiekspagina", + "max_length": 500, + "show_always": false, + "help_text": "Een URL naar een publiekspagina van de organisatie zelf. Op deze pagina kunt u meer vinden over de inzet van het algoritme binnen de organisatie.", + "instructions": "Een URL naar een publiekspagina over het algoritme van uw organisatie. Op deze pagina kan iemand meer vinden over de inzet van het algoritme binnen de organisatie. Dit is niet te verwarren met de projectpagina, waar de maatschappelijke context wordt vermeld. Denk aan bijvoorbeeld parkeercontrole in het algemeen (projectpagina) versus de inzet van slimme camera's voor nummerbordherkenning (publiekspagina).", + "example": "https://gemeentenoorderhaaks/hoe-werkt-een-VRI", + "required": false + }, + "status": { + "type": "enum", + "title": "Status", + "show_always": true, + "help_text": "De status van het algoritme: in ontwikkeling, in gebruik, of buiten gebruik.", + "instructions": "De huidige status van het algoritme: - In ontwikkeling - In gebruik - Buiten gebruik. Indien het algoritme zowel in ontwikkeling als in gebruik is, kies voor ‘In gebruik’.", + "example": "In gebruik", + "required": false, + "permitted_values": [ + "In ontwikkeling", + "In gebruik", + "Buiten gebruik" + ] + }, + "goal": { + "type": "string", + "title": "Doel", + "max_length": 5000, + "show_always": true, + "help_text": "Het doel waarvoor het algoritme ontwikkeld is en/of hoe de inzet ervan bijdraagt aan het behalen van die doelen.", + "instructions": "Het doel waarvoor het algoritme ontwikkeld is en/of hoe de inzet ervan bijdraagt aan het behalen van die doelen. Vul dit veld in op B1-taalniveau.", + "example": "Het doel van dit algoritme is om de doorstroom van het verkeer binnen de gemeente te verbeteren. Door kortere wachttijden bij het stoplicht kunnen weggebruikers sneller van A naar B komen.", + "required": false + }, + "impact": { + "type": "string", + "title": "Impact", + "max_length": 5000, + "show_always": true, + "help_text": "De impact van het algoritme op burgers en bedrijven. Bijvoorbeeld: hoe werkt het algoritme en wat zijn de verwachte consequenties daarvan voor het individu of bedrijf?", + "instructions": "De impact van het algoritme op burgers en bedrijven. Bijvoorbeeld: hoe werkt het algoritme en wat zijn de verwachte consequenties daarvan voor het individu of bedrijf? Vul dit veld in op B1-taalniveau.", + "example": "De impact op een individu is dat het algoritme bepaalt wanneer diegene aan de beurt is om over het kruispunt te steken. De consequenties van deze impact zijn in alle waarschijnlijkheid erg klein. Het betreft een oponthoud van maximaal enkele minuten.", + "required": false + }, + "proportionality": { + "type": "string", + "title": "Proportionaliteit", + "max_length": 5000, + "show_always": true, + "help_text": "Een afweging van de voor- en nadelen van de inzet van het algoritme en waarom dit redelijk gerechtvaardigd is.", + "instructions": "Een afweging van de voor- en nadelen van de inzet van het algoritme en waarom dit redelijk gerechtvaardigd is. Benoem daarbij ook welke andere alternatieven overwogen zijn.Voor het invullen van dit veld kan gebruik gemaakt worden van de antwoorden uit het IAMA en de DPIA. Vul dit veld in op B1-taalniveau.", + "example": "De voordelen van de inzet van dit algoritme zijn bewezen door het gebruik ervan over de hele wereld. Op plekken waar dit algoritme gebruikt wordt, is de verkeersdoorstroming aanzienlijk beter dan op plekken waar dit niet gedaan wordt. Het alternatief is een standaardvolgorde aanhouden, wat bewezen trager is voor weggebruikers.", + "required": false + }, + "decision_making_process": { + "type": "string", + "title": "Proces", + "max_length": 5000, + "show_always": true, + "help_text": "De naam van het bedrijfs- of besluitvormingsproces in de organisatie waarbinnen het algoritme wordt ingezet.", + "instructions": "De naam van het bedrijfs- of besluitvormingsproces in de organisatie waarbinnen het algoritme wordt ingezet.", + "example": "Het besluitvormingsproces van het algoritme is om te bepalen wie er op dat moment als eerste mag doorrijden over het kruispunt, ter verbetering van de algehele verkeersdoorstroming en bereikbaarheid.", + "required": false + }, + "documentation": { + "type": "string", + "title": "Link naar projectpagina", + "max_length": 500, + "show_always": false, + "help_text": "URL van de projectpagina van de organisatie zelf over dit specifieke gebruik van het algoritme.", + "instructions": "Een URL naar een maatschappelijke pagina van de organisatie zelf. Op deze pagina kunt u meer vinden over het maatschappelijke vraagstuk waar het algoritme voor wordt ingezet.Dit is niet te verwarren met de publiekspagina, waar dit specifieke algoritme onder de loep wordt genomen. Denk aan bijvoorbeeld parkeercontrole in het algemeen (projectpagina) versus de inzet van slimme camera's voor nummerbordherkenning (publiekspagina).Indien u geen aparte projectpagina hanteert, dient dit veld leeg te blijven.", + "example": "https://gemeentenoorderhaaks.nl/wat-doen-we-met-verkeer", + "required": false + }, + "description": { + "type": "string", + "title": "Omschrijving", + "max_length": 5000, + "show_always": false, + "help_text": "Een uitgebreide beschrijving van het algoritme (500-5000 tekens).", + "instructions": "Een uitgebreide beschrijving van het algoritme.Vul dit veld in op B1-taalniveau.", + "example": "Er is veel verkeer op de kruispunten van de ringweg om de gemeente Noorderhaaks. De verkeersregeling van de stoplichten loopt niet altijd hetzelfde. Met behulp van sensoren in het wegdek kan een computersysteem een idee krijgen van waar er iemand voor een stoplicht staat. Het systeem gebruikt een algoritme om te kijken of het stoplicht sneller op groen kan dan het normaal zou gaan. Het checkt of er op dat moment nog weggebruikers op andere plekken rijden. Zo niet, dan kunnen andere stoplichten sneller op rood, en het stoplicht in kwestie op groen. Zo verbetert de doorstroom van verkeer, vooral als het rustig is op de weg.", + "required": false + }, + "application_url": { + "type": "string", + "title": "Link naar ontwikkelaar", + "max_length": 100, + "show_always": false, + "help_text": "Een URL naar een applicatiepagina van de ontwikkelaar. Op deze pagina kunt u meer algemene technische informatie vinden over het algoritme en de ontwikkelaar zelf.", + "instructions": "Een URL naar de derde partij die het algoritme heeft ontwikkeld.Indien u zelf het algoritme hebt ontwikkeld, dient dit veld leeg te blijven.", + "example": "http://haakssoftwarebedrijf.nl/vrisoftware", + "required": false + }, + "publiccode": { + "type": "string", + "title": "Link naar broncode", + "max_length": 100, + "show_always": false, + "help_text": "Een URL naar de codepagina van de ontwikkelaar. Op deze pagina kunt u meer vinden over de code van het algoritme zelf.", + "instructions": "Een URL naar de codepagina van de ontwikkelaar. Op deze pagina is de code van het algoritme te vinden. Indien er geen codebase publiekelijk beschikbaar is, dient dit veld leeg te blijven.", + "example": "http://github.com/haakssoftwarebedrijf/vrisoftware", + "required": false + }, + "mprd": { + "type": "enum", + "title": "Koppeling met basisregistraties", + "show_always": false, + "help_text": "Maakt het algoritme direct gebruik van data uit het Stelsel van Basisregistraties? Meer informatie is te vinden op https://digitaleoverheid.nl/", + "instructions": "Maakt het algoritme direct gebruik van data uit het Stelsel van Basisregistraties? Meer informatie is te vinden op https://www.digitaleoverheid.nl/overzicht-van-alle-onderwerpen/stelselvan-basisregistraties/10-basisregistraties/", + "example": "Ja", + "required": false, + "permitted_values": [ + "Ja", + "Nee" + ] + }, + "source_data": { + "type": "string", + "title": "Databronnen", + "max_length": 5000, + "show_always": false, + "help_text": "Een overzicht van de databronnen die op dit moment gebruikt worden door het algoritme en/of in het begin gebruikt zijn bij het maken van het algoritme", + "instructions": "Een overzicht van de databronnen die op dit moment gebruikt worden door het algoritme en/of in het begin gebruikt zijn bij het maken van het algoritme.Idealiter bevat het overzicht URLs naar relevante publiekspagina's over de bron, of, indien mogelijk, een URL naar de bron zelf.", + "example": "Sensordata van de verkeersregelinstallaties bij kruispunten op de ringweg van gemeente Noorderhaaks.", + "required": false + }, + "methods_and_models": { + "type": "string", + "title": "Methoden en modellen", + "max_length": 5000, + "show_always": false, + "help_text": "Standaardmethoden of modellen die het algoritme gebruikt.", + "instructions": "Een technische uitleg van hoe het algoritme werkt en uitkomsten genereert. Indien beschikbaar, komt een URL naar een schematisch overzicht van het model (zoals een stroomdiagram van een beslisboom) goed van pas.Indien complexe machine learning modellen worden gebruikt (zoals Neurale Netwerken), komen URL’s naar extra documentatie of wetenschappelijke publicaties goed van pas. Dit veld is hoofdzakelijk bedoeld voor de lezer met technische expertise, en mag daarom complexere concepten en taal bevatten.", + "example": "Het model maakt gebruik van een eenvoudige beslisboom zodra een nieuwe bezette voorsorteerstrook zich voordoet (= wanneer de sensor een weggebruiker ontdekt). De beslisboom loopt als volgt: Eerst wordt er gekeken of er al andere partijen staan te wachten, en vervolgens of er op dat moment een andere voorsorteerstrook op groen licht staat. Zo niet, dan springt het stoplicht van de betreffende strook meteen op groen. Zo wel, dan wacht het tot er geen verkeer meer wordt waargenomen bij de andere voorsorteerstrook. Als er andere weggebruikers op andere stroken staan te wachten, sluit de betreffende strook achteraan in de wachtrij. Een grafische weergave van dit model is te vinden op https://algoritmes.gemeentenoorderhaaks.nl/VRI", + "required": false + }, + "monitoring": { + "type": "string", + "title": "Monitoring", + "max_length": 5000, + "show_always": false, + "help_text": "Een overzicht van hoe de inzet van het algoritme wordt gemonitord.", + "instructions": "Een overzicht van hoe de inzet van het algoritme wordt gemonitord, zowel in real time als evaluatie achteraf.", + "example": "Monitoring van het verkeer wordt met plaatselijke camera's uitgevoerd. Dagelijks wordt er met steekproeven gecontroleerd op de camerabeelden of de automatische verkeersregeling zorgt voor een goede doorstroom.", + "required": false + }, + "human_intervention": { + "type": "string", + "title": "Menselijke tussenkomst", + "max_length": 5000, + "show_always": true, + "help_text": "Een omschrijving van hoe uitkomsten van het algoritme door een mens gecontroleerd en bijgesteld (kunnen) worden.", + "instructions": "Een omschrijving van hoe uitkomsten van het algoritme door een mens gecontroleerd en bijgesteld (kunnen) worden.Vul dit veld in op B1-taalniveau.", + "example": "Bij het maken van fouten door het algoritme zou een medewerker van de afdeling handmatig de verkeersregeling aan kunnen passen en stoplichten op groen kunnen zetten. Buiten normale werktijden is er 24/7 toezicht.", + "required": false + }, + "risks": { + "type": "string", + "title": "Risico's", + "max_length": 5000, + "show_always": false, + "help_text": "Een overzicht van de voorziene risico's bij de inzet van het algoritme", + "instructions": "Een overzicht van de voorziene risico's bij de inzet van het algoritme. Denk aan risico's die kunnen ontstaan in de hele keten, van observatiedata tot uitkomst voor een gebruiker.", + "example": "De uitkomsten van het algoritme zijn alleen gebaseerd op sensoren in het wegdek die meten of er een vehikel is gepasseerd. Er is bij binnenkomst van data in het algoritme één voorzien risico: bij een defecte sensor kan het gebeuren dat weggebruikers lang blijven staan omdat ze niet worden als aanwezig worden herkend door het algoritme. Wij gaan dit tegen door de constante monitoring. Zo is de kans bijzonder klein dat dit langdurige nadelen heeft op een individu, en hoeft niemand uren stil te blijven staan. Voor de rest zijn er geen voorziene risico's, omdat bij gebrekkig functioneren van dit algoritme het traditionele systeem ook prima functioneert als plan B.", + "required": false + }, + "performance_standard": { + "type": "string", + "title": "Prestatienormen", + "max_length": 5000, + "show_always": false, + "help_text": "Een omschrijving van de verwachte prestaties van het algoritme en hoe die worden gemeten.", + "instructions": "Een omschrijving van de verwachte prestaties van het algoritme en hoe die worden gemeten.", + "example": "Het algoritme moet in ieder geval even goed presteren als een standaardinstelling van een verkeersinstallatie zonder sensoren. In eerdere pilots zagen we een verbetering van gemiddeld 36% minder wachttijd voor weggebruikers buiten de spits. Wij hanteren een minimum van 15% buiten spitstijden. Tijdens de spits is dit de baseline (0%).", + "required": false + }, + "competent_authority": { + "type": "string", + "title": "Bevoegde authoriteit", + "max_length": 100, + "show_always": true, + "help_text": "Volledige naam van de bevoegde autoriteit verantwoordelijk voor de inzet van het algoritme.", + "instructions": "De autoriteit die binnen de organisatie bevoegd is om te handelen op basis van de uitkomsten van het algoritme.Vaak is dit veld gelijk aan de afdeling van uw organisatie.", + "example": "Afdeling Verkeer en bereikbaarheid", + "required": false + }, + "lawful_basis": { + "type": "string", + "title": "Wettelijke grondslag", + "max_length": 5000, + "show_always": true, + "help_text": "Een omschrijving of een link naar de wettelijke grondslag voor de inzet van het algoritme. Bijvoorbeeld: een wet, een verordening of een formeel besluit.", + "instructions": "Een link naar de wettelijke grondslag voor de inzet van het algoritme. Bijvoorbeeld: een wet, een verordening of een formeel besluit.Indien er geen publiek beschikbare grondslag beschikbaar is, volstaat een beschrijving ook.", + "example": "http://wetten.overheid.nl/BWBR0006622/2023-01-01", + "required": false + }, + "iama": { + "type": "enum", + "title": "Impact Assessment Mensenrechten en Algoritmes (IAMA)", + "show_always": true, + "help_text": "Is het algoritme getoetst op het nakomen van mensenrechten met een Impact Assessment Mensenrechten en Algoritmes (IAMA)?", + "instructions": "Is het algoritme getoetst op het nakomen van mensenrechten met een Impact Assessment Mensenrechten en Algoritmes (IAMA)?", + "example": "Ja", + "required": false, + "permitted_values": [ + "Ja", + "Nee" + ] + }, + "iama_description": { + "type": "string", + "title": "Omschrijving van de IAMA", + "max_length": 5000, + "show_always": true, + "help_text": "Een overzicht van de belangrijkste zaken die uit de impact assessment mensenrechten en algoritmes (IAMA) naar voren kwamen.", + "instructions": "Een overzicht van de belangrijkste zaken die uit de impact assessment mensenrechten en algoritmes (IAMA) naar voren kwamen.", + "example": "Er is geen reden om aan te nemen dat er enige mensenrechtenschending plaats kan vinden op basis van het gebruikte algoritme.", + "required": false + }, + "dpia": { + "type": "enum", + "title": "Data Protection Impact Assessment (DPIA)", + "show_always": false, + "help_text": "Is het algoritme getoetst op veilig gebruik van gegevens met een Data Protection Impact Assessment (DPIA).", + "instructions": "Is het algoritme getoetst op veilig gebruik van gegevens met een Data Protection Impact Assessment (DPIA)?", + "example": "Ja", + "required": false, + "permitted_values": [ + "Ja", + "Nee" + ] + }, + "dpia_description": { + "type": "string", + "title": "Omschrijving van de DPIA", + "max_length": 5000, + "show_always": false, + "help_text": "Een overzicht van de belangrijkste zaken die uit de data protection impact assessment (DPIA) naar voren kwamen.", + "instructions": "Een overzicht van de belangrijkste zaken die uit de Data Protection Impact Assessment (DPIA) naar voren kwamen.", + "example": "Er komen geen gegevens bij dit algoritme kijken waarvan de inhoud privacyrisico's met zich meebrengt of zou kunnen brengen. Er worden geen mensen op schaal of systematisch gevolgd in de openbare ruimte door dit algoritme.", + "required": false + }, + "objection_procedure": { + "type": "string", + "title": "Bezwaarprocedure", + "max_length": 5000, + "show_always": true, + "help_text": "Een omschrijving van hoe burgers en bedrijven bezwaar kunnen maken tegen de uitkomsten van het algoritme.", + "instructions": "Een omschrijving van hoe burgers en bedrijven bezwaar kunnen maken tegen de uitkomsten van het algoritme.", + "example": "Indien de uitkomst van het algoritme een nadelig effect heeft gehad op bijvoorbeeld een weggebruiker of omwonende, neem dan contact op met het gemeenteloket op https://gemeentenoorderhaaks.nl/contact. Wij behandelen uw aanvraag binnen tien werkdagen.", + "required": false + }, + "standard_version": { + "type": "enum", + "title": "Schema", + "show_always": false, + "help_text": "", + "instructions": "De versie van de metadatastandaard die gehanteerd is voor deze registratie.Op dit moment is dat ‘0.2.3’.", + "example": "0.2.3", + "required": false, + "permitted_values": [ + "0.2.3" + ] + }, + "uuid": { + "type": "string", + "title": "UUID", + "max_length": 100, + "show_always": true, + "help_text": "", + "instructions": "De unieke identificatie (UUID) voor deze registratie. Bij het aanleveren van deze registraties wordt er automatisch een UUID gegenereerd door de website van het landelijk algoritmeregister. Hier dient bij de eerste aanlevering dus niks handmatig ingevuld te worden. Bij het wijzigen van registraties kan naar deze UUID verwezen worden om de juiste registratie te vinden. In het geval van een update van een al bestaand en gepubliceerde registratie, moet de UUID in de toekomst wel worden ingevuld.", + "example": "n.v.t.", + "required": false + }, + "url": { + "type": "string", + "title": "Link naar bronregistratie", + "max_length": 100, + "show_always": false, + "help_text": "De URL van de locatie waar dit algoritme eerder al is vastgelegd; in machine leesbaar formaat.", + "instructions": "Als de organisatie zelf ook een algoritmeregister gepubliceerd heeft waarvandaan uiteindelijk de informatie opgehaald wordt, dan kan vanaf hiernaar verwezen worden.", + "example": "https://algoritmes.gemeentenoorderhaaks.nl/", + "required": false + }, + "contact_email": { + "type": "string", + "title": "E-mailadres van de contactpersoon", + "max_length": 100, + "show_always": true, + "help_text": "De e-mail voor contact over deze registratie.", + "instructions": "Het e-mailadres voor contact over deze registratie. Dit moet een geldig mailadres zijn waar burgers, media of andere betrokkenen vragen kunnen stellen over het algoritme zelf of over de gevolgen op basis van uitkomsten van het algoritme.", + "example": "Algoritmes@gemeentenoorderhaaks.nl", + "required": false + }, + "area": { + "type": "string", + "title": "Geografisch gebied", + "max_length": 100, + "show_always": false, + "help_text": "Het geografische gebied waarin het algoritme wordt ingezet.", + "instructions": "Het geografische gebied waarin het algoritme ingezet wordt, zoals een gemeente, (veiligheids)regio, natuurgebied, of provincie.", + "example": "Gemeente Noorderhaaks", + "required": false + }, + "lang": { + "type": "string", + "title": "Taal", + "max_length": 100, + "show_always": false, + "help_text": "De taal waarin deze registratie is ingevoerd.", + "instructions": "Naam van de taal. Op dit moment wordt alleen Nederlands aangeboden.", + "example": "Nederlands", + "required": false + }, + "revision_date": { + "type": "string", + "title": "Herzieningsdatum", + "max_length": 10, + "show_always": false, + "help_text": "De datum waarvoor deze registratie moet worden herzien.", + "instructions": "De datum waarvoor deze registratie moet worden herzien. Het is handig periodiek te controleren of de registratie nog actueel is. Het kan daarbij slim zijn om een datum te kiezen waarop een wijziging verwacht wordt. De wettelijke grondslag van sommige regelingen wijzigt bijvoorbeeld jaarlijks per 1 januari, waardoor dat een logisch moment van herziening is. ", + "example": "01-12-2023", + "required": false + } + } +} \ No newline at end of file diff --git a/backend/app/schemas/config/v0_3_1.json b/backend/app/schemas/config/v0_3_1.json new file mode 100644 index 00000000..ee2f7106 --- /dev/null +++ b/backend/app/schemas/config/v0_3_1.json @@ -0,0 +1,379 @@ +{ + "properties": { + "name": { + "type": "string", + "title": "Naam", + "max_length": 100, + "show_always": true, + "help_text": "De naam die gebruikt wordt om het algoritme aan te duiden", + "instructions": "De algemeen gehanteerde naam van het algoritme.", + "example": "Automatische Verkeersregeling Ringweg", + "required": true + }, + "organization": { + "type": "string", + "title": "Organisatie", + "max_length": 100, + "show_always": true, + "help_text": "De volledige naam van de organisatie verantwoordelijk voor de inzet van het algoritme.", + "instructions": "De naam van de organisatie verantwoordelijk voor de inzetvan het algoritme. In het geval van een uitvoeringsorganisatie vallend onder een ministerie: gebruik de naam van de uitvoeringsorganisatie zelf. Bij het veld 'tags' kunnen afkortingen worden toegevoegd of ministeries voor betere vindbaarheid.", + "example": "Gemeente Noorderhaaks", + "required": true + }, + "department": { + "type": "string", + "title": "Afdeling", + "max_length": 500, + "show_always": true, + "help_text": "De volledige naam van de afdeling of divisie verantwoordelijk voor de inzet van het algoritme.", + "instructions": "De volledige naam van de afdeling van de organisatie verantwoordelijk voor het gebruik van het algoritme.", + "example": "Afdeling Verkeer & Bereikbaarheid", + "required": false + }, + "description_short": { + "type": "string", + "title": "Korte omschrijving", + "max_length": 150, + "show_always": true, + "help_text": "Een korte, abstracte beschrijving van het algoritme.", + "instructions": "Een korte, abstracte beschrijving van het algoritme (<150 tekens). Bij voorkeur in één of twee zinnen. Vul dit veld in op B1-taalniveau.", + "example": "Dit algoritme optimaliseert de doorstroom van verkeer bij kruispunten op basis van sensoren in het wegdek.", + "required": false + }, + "type": { + "type": "enum", + "title": "Type algoritme", + "show_always": true, + "help_text": "Is het algoritme op regels gebaseerd of zelflerend? Regelgebaseerde algoritmes zijn handmatig door mensen gebouwd, meestal op basis van wetten of verordeningen. Zelflerende algoritmes kunnen zelf verbanden ontdekken in gegevens.", + "instructions": "Is het algoritme op regels gebaseerd of zelflerend? Op regels gebaseerde algoritmes zijn handmatig door mensen gebouwd, meestal op basis van wetten of verordeningen. Zelflerende algoritmes hebben zichzelf getraind op basis van data. In het geval dat een algoritme deels beiden doet, kies voor 'Zelflerend'. Ten behoeve van de websitefunctionaliteit is het noodzakelijk om geen andere informatie in dit veld op te nemen dan 'regelgebaseerd' of 'zelflerend'.", + "example": "Regelgebaseerd", + "required": false, + "permitted_values": [ + "Regelgebaseerd", + "Zelflerend" + ] + }, + "category": { + "type": "string", + "title": "Beleidsterrein", + "max_length": 500, + "show_always": true, + "help_text": "Het beleidsterrein waarin het algoritme wordt ingezet.", + "instructions": "Het beleidsterrein waarin het algoritme wordt ingezet.", + "example": "Mobiliteit", + "required": false + }, + "website": { + "type": "string", + "title": "Link naar publiekspagina", + "max_length": 500, + "show_always": false, + "help_text": "Een URL naar een publiekspagina van de organisatie zelf. Op deze pagina kunt u meer vinden over de inzet van het algoritme binnen de organisatie.", + "instructions": "Een URL naar een publiekspagina over het algoritme van uw organisatie. Op deze pagina kan iemand meer vinden over de inzet van het algoritme binnen de organisatie. Begin een URL met https://", + "example": "https://gemeentenoorderhaaks/hoe-werkt-een-VRI", + "required": false + }, + "status": { + "type": "enum", + "title": "Status", + "show_always": true, + "help_text": "De status van het algoritme: in ontwikkeling, in gebruik, of buiten gebruik.", + "instructions": "De huidige status van het algoritme: - In ontwikkeling - In gebruik - Buiten gebruik. Indien het algoritme zowel in ontwikkeling als in gebruik is, kies voor 'In gebruik'.", + "example": "In gebruik", + "required": false, + "permitted_values": [ + "In ontwikkeling", + "In gebruik", + "Buiten gebruik" + ] + }, + "goal": { + "type": "string", + "title": "Doel", + "max_length": 2500, + "show_always": true, + "help_text": "Het doel waarvoor het algoritme ontwikkeld is en/of hoe de inzet ervan bijdraagt aan het behalen van die doelen.", + "instructions": "Het doel waarvoor het algoritme ontwikkeld is en/of hoe de inzet ervan bijdraagt aan het behalen van die doelen. Vul dit veld in op B1-taalniveau.", + "example": "Het doel van dit algoritme is om de doorstroom van het verkeer binnen de gemeente te verbeteren. Door kortere wachttijden bij het stoplicht kunnen weggebruikers sneller van A naar B komen.", + "required": false + }, + "impact": { + "type": "string", + "title": "Impact", + "max_length": 2500, + "show_always": true, + "help_text": "De impact van het algoritme op burgers en bedrijven. Bijvoorbeeld: hoe werkt het algoritme en wat zijn de verwachte consequenties daarvan voor het individu of bedrijf?", + "instructions": "De impact van het algoritme op burgers en bedrijven. Bijvoorbeeld: hoe werkt het algoritme en wat zijn de verwachte consequenties daarvan voor het individu of bedrijf? Vul dit veld in op B1-taalniveau.", + "example": "De impact op een individu is dat het algoritme bepaalt wanneer diegene aan de beurt is om over het kruispunt te steken. De consequenties van deze impact zijn in alle waarschijnlijkheid erg klein. Het betreft een oponthoud van maximaal enkele minuten.", + "required": false + }, + "proportionality": { + "type": "string", + "title": "Proportionaliteit", + "max_length": 2500, + "show_always": true, + "help_text": "Een afweging van de voor- en nadelen van de inzet van het algoritme en waarom dit redelijk gerechtvaardigd is.", + "instructions": "Een afweging van de voor- en nadelen van de inzet van het algoritme en waarom dit redelijk gerechtvaardigd is. Benoem daarbij ook welke andere alternatieven overwogen zijn.Voor het invullen van dit veld kan gebruik gemaakt worden van de antwoorden uit het IAMA en de DPIA. Vul dit veld in op B1-taalniveau.", + "example": "De voordelen van de inzet van dit algoritme zijn bewezen door het gebruik ervan over de hele wereld. Op plekken waar dit algoritme gebruikt wordt, is de verkeersdoorstroming aanzienlijk beter dan op plekken waar dit niet gedaan wordt. Het alternatief is een standaardvolgorde aanhouden, wat bewezen trager is voor weggebruikers.", + "required": false + }, + "provider": { + "type": "string", + "title": "Leverancier", + "max_length": 100, + "show_always": false, + "help_text": "Indien van toepassing, de externe leverancier van het algoritme.", + "instructions": "Naam van de externe leverancier van het algoritme. Indien uw organisatie zelf het algoritme heeft ontwikkeld, dient dit veld leeg te blijven.", + "example": "Haaks softwarebedrijf", + "required": false + }, + "application_url": { + "type": "string", + "title": "Link naar leverancier", + "max_length": 500, + "show_always": false, + "help_text": "Indien van toepassing, de link naar de externe leverancier.", + "instructions": "Een URL naar de derde partij die het algoritme heeft ontwikkeld. Indien uw organisatie zelf het algoritme heeft ontwikkeld, dient dit veld leeg te blijven. Begin een URL met https://", + "example": "https://haakssoftwarebedrijf.nl/vrisoftware", + "required": false + }, + "process_index_url": { + "type": "string", + "title": "Link naar verwerkingsregister", + "max_length": 500, + "show_always": false, + "help_text": "De link naar de AVG-verwerking in een publiek register van het algoritme.", + "instructions": "Indien van toepassing en beschikbaar, de link naar de AVG-verwerking in een publiek register van het algoritme. Begin een URL met https://", + "example": "https://gemeentenoorderhaaks.nl/verwerkingen/Automatische-Verkeersregeling-Ringweg", + "required": false + }, + "lawful_basis": { + "type": "string", + "title": "Wettelijke grondslag", + "max_length": 2500, + "show_always": true, + "help_text": "Een omschrijving of een link naar de wettelijke grondslag voor de inzet van het algoritme. Bijvoorbeeld: een wet, een verordening of een formeel besluit.", + "instructions": "Een link naar de wettelijke grondslag voor de inzet van het algoritme. Bijvoorbeeld: een wet, een verordening of een formeel besluit.Indien er geen publiek beschikbare grondslag beschikbaar is, volstaat een beschrijving ook.", + "example": "https://wetten.overheid.nl/BWBR0006622/2023-01-01", + "required": false + }, + "iama": { + "type": "enum", + "title": "Mensenrechtentoets", + "show_always": true, + "help_text": "Is het algoritme getoetst op het nakomen van mensenrechten zoals middels een Impact Assessment Mensenrechten en Algoritmes (IAMA)?", + "instructions": "Is het algoritme getoetst op het nakomen van mensenrechten, bijvoorbeeld met een Impact Assessment Mensenrechten en Algoritmes (IAMA)? De resultaten van de mensenrechtentoets kunnen verwerkt worden in diverse andere velden. Ook kan er in het veld 'Link naar mensenrechtentoets' gelinkt worden naar een eventueel gepubliceerde mensenrechtentoets. Ten behoeve van de websitefunctionaliteit is het noodzakelijk om geen andere informatie in dit veld op te nemen dan 'Ja' of 'Nee' (let op hoofdletters).'", + "example": "Ja", + "required": false, + "permitted_values": [ + "Ja", + "Nee" + ] + }, + "iama_description": { + "type": "string", + "title": "Link naar Mensenrechtentoets", + "max_length": 500, + "show_always": true, + "help_text": "Link naar de resultaten van een uitgevoerde mensenrechtentoets, zoals een IAMA.", + "instructions": "Link naar de resultaten van een mensenrechtentoets, indien deze is uitgevoerd en publiek beschikbaar is. Een voorbeeld hiervan is het impact assessment mensenrechten en algoritmes (IAMA). Begin een URL met https://", + "example": "https://gemeentenoorderhaaks.nl/Archief/toetsen/AVR-IAMA", + "required": false + }, + "dpia": { + "type": "enum", + "title": "Data Protection Impact Assessment (DPIA)", + "show_always": false, + "help_text": "Is het algoritme getoetst op veilig gebruik van gegevens met een Data Protection Impact Assessment (DPIA).", + "instructions": "Is het algoritme getoetst op veilig gebruik van gegevens met een Data Protection Impact Assessment (DPIA)? Ten behoeve van de websitefunctionaliteit is het noodzakelijk om geen andere informatie in dit veld op te nemen dan 'Ja' of 'Nee' (let op hoofdletters).", + "example": "Ja", + "required": false, + "permitted_values": [ + "Ja", + "Nee" + ] + }, + "objection_procedure": { + "type": "string", + "title": "Bezwaarprocedure", + "max_length": 2500, + "show_always": true, + "help_text": "Een omschrijving van hoe burgers en bedrijven bezwaar kunnen maken tegen de uitkomsten van het algoritme.", + "instructions": "Een omschrijving van hoe burgers en bedrijven bezwaar kunnen maken tegen de uitkomsten van het algoritme.", + "example": "Indien de uitkomst van het algoritme een nadelig effect heeft gehad op bijvoorbeeld een weggebruiker of omwonende, neem dan contact op met het gemeenteloket op https://gemeentenoorderhaaks.nl/contact. Wij behandelen uw aanvraag binnen tien werkdagen.", + "required": false + }, + "url": { + "type": "string", + "title": "Link naar bronregistratie", + "max_length": 500, + "show_always": false, + "help_text": "De URL van de locatie waar dit algoritme eerder al is vastgelegd; in machine leesbaar formaat.", + "instructions": "Als de organisatie zelf ook een algoritmeregister gepubliceerd heeft waarvandaan uiteindelijk de informatie opgehaald wordt, dan kan vanaf hiernaar verwezen worden.", + "example": "https://algoritmes.gemeentenoorderhaaks.nl/", + "required": false + }, + "contact_email": { + "type": "string", + "title": "E-mailadres van de contactpersoon", + "max_length": 500, + "show_always": true, + "help_text": "De e-mail voor contact over deze registratie.", + "instructions": "Het e-mailadres voor contact over deze registratie. Dit moet een geldig mailadres zijn waar burgers, media of andere betrokkenen vragen kunnen stellen over het algoritme zelf of over de gevolgen op basis van uitkomsten van het algoritme.", + "example": "algoritmes@gemeentenoorderhaaks.nl", + "required": false + }, + "area": { + "type": "string", + "title": "Geografisch gebied", + "max_length": 100, + "show_always": false, + "help_text": "Het geografische gebied waarin het algoritme wordt ingezet.", + "instructions": "Het geografische gebied waarin het algoritme ingezet wordt, zoals een gemeente, (veiligheids)regio, natuurgebied, of provincie.", + "example": "Gemeente Noorderhaaks", + "required": false + }, + "lang": { + "type": "string", + "title": "Taal", + "max_length": 3, + "show_always": false, + "help_text": "De taal waarin deze registratie is ingevoerd.", + "instructions": "De ISO 639-3 code van de taal van de registratie. Op dit moment wordt alleen Nederlands (nld) aangeboden.", + "example": "nld", + "required": false + }, + "standard_version": { + "type": "enum", + "title": "Schema", + "show_always": false, + "help_text": "De versie van de publicatiestandaard waar dit algoritme in is geregistreed.", + "instructions": "De versie van de publicatiestandaard die gehanteerd is voor deze registratie.Op dit moment is dat '0.3.1'.", + "example": "0.3.1", + "required": false, + "permitted_values": [ + "0.3.1" + ] + }, + "uuid": { + "type": "string", + "title": "UUID", + "max_length": 100, + "show_always": true, + "help_text": "De unieke code van dit algoritme in het landelijke register.", + "instructions": "De unieke identificatie voor deze registratie in landelijke register. Bij het aanleveren van deze registraties wordt er automatisch een identificatie gegenereerd door de website van het landelijk algoritmeregister. Hier dient bij de eerste aanlevering dus niks handmatig ingevuld te worden. Bij het wijzigen van registraties kan naar deze identificatie verwezen worden om de juiste registratie te vinden. In het geval van een update van een al bestaand en gepubliceerde registratie, moet de identificatie in de toekomst wel worden ingevuld.", + "example": "n.v.t.", + "required": false + }, + "source_id": { + "type": "string", + "title": "Bron-ID", + "max_length": 100, + "show_always": false, + "help_text": "De unieke code van dit algoritme in het register van de eigenaar", + "instructions": "Indien van toepassing, de unieke identificatie voor deze registratie zoals door de eigenaar wordt gehanteerd. Dit is dus de verwijzing naar het algoritme in de interne database of het interne register van uw organisatie.", + "example": "n.v.t.", + "required": false + }, + "revision_date": { + "type": "string", + "title": "Herzieningsdatum", + "max_length": 10, + "show_always": false, + "help_text": "De datum waarvoor deze registratie moet worden herzien.", + "instructions": "De datum waarvoor deze registratie moet worden herzien, in DD-MM-YYYY formaat. Het is handig periodiek te controleren of de registratie nog actueel is. Het kan daarbij slim zijn om een datum te kiezen waarop een wijziging verwacht wordt. De wettelijke grondslag van sommige regelingen wijzigt bijvoorbeeld jaarlijks per 1 januari, waardoor dat een logisch moment van herziening is. ", + "example": "01-12-2023", + "required": false + }, + "tags": { + "type": "string", + "title": "Tags", + "max_length": 2500, + "show_always": false, + "help_text": "Trefwoorden over het algoritme, om de vindbaarheid van een algoritmeregistratie te vergroten.", + "instructions": "Termen gerelateerd aan dit algoritme. Gescheiden door komma's. Dit veld wordt niet weergegeven op de website en kan worden gebruikt om de vindbaarheid van de registratie te verbeteren. Zo kan bijvoorbeeld de naam van het relevante ministerie worden toegevoegd om als uitvoerorganisatie beter vindbaar te zijn met de zoekfunctie.", + "example": "Verkeer, Mobiliteit, VRI, Infrastructuur, Waddengebied", + "required": false + }, + "description": { + "type": "string", + "title": "Omschrijving", + "max_length": 2500, + "show_always": false, + "help_text": "Een uitgebreide beschrijving van het algoritme (500-5000 tekens).", + "instructions": "Een uitgebreide beschrijving van het algoritme. Vul dit veld in op B1-taalniveau.", + "example": "Er is veel verkeer op de kruispunten van de ringweg om de gemeente Noorderhaaks. De verkeersregeling van de stoplichten loopt niet altijd hetzelfde. Met behulp van sensoren in het wegdek kan een computersysteem een idee krijgen van waar er iemand voor een stoplicht staat. Het systeem gebruikt een algoritme om te kijken of het stoplicht sneller op groen kan dan het normaal zou gaan. Het checkt of er op dat moment nog weggebruikers op andere plekken rijden. Zo niet, dan kunnen andere stoplichten sneller op rood, en het stoplicht in kwestie op groen. Zo verbetert de doorstroom van verkeer, vooral als het rustig is op de weg.", + "required": false + }, + "source_data": { + "type": "string", + "title": "Databronnen", + "max_length": 5000, + "show_always": false, + "help_text": "Een overzicht van de databronnen die op dit moment gebruikt worden door het algoritme en/of in het begin gebruikt zijn bij het maken van het algoritme", + "instructions": "Een overzicht van de databronnen die op dit moment gebruikt worden door het algoritme en/of in het begin gebruikt zijn bij het maken van het algoritme. Idealiter bevat het overzicht URL's naar relevante publiekspagina's over de bron, of, indien mogelijk, een URL naar de bron zelf.", + "example": "Sensordata van de verkeersregelinstallaties bij kruispunten op de ringweg van gemeente Noorderhaaks.", + "required": false + }, + "methods_and_models": { + "type": "string", + "title": "Methoden en modellen", + "max_length": 5000, + "show_always": false, + "help_text": "Standaardmethoden of modellen die het algoritme gebruikt.", + "instructions": "Een technische uitleg van hoe het algoritme werkt en uitkomsten genereert. Indien beschikbaar, komt een URL naar een schematisch overzicht van het model (zoals een stroomdiagram van een beslisboom) goed van pas. Indien complexe machine learning modellen worden gebruikt (zoals Neurale Netwerken), komen URL's naar extra documentatie of wetenschappelijke publicaties goed van pas. Dit veld is hoofdzakelijk bedoeld voor de lezer met technische expertise, en mag daarom complexere concepten en taal bevatten.", + "example": "Het model maakt gebruik van een eenvoudige beslisboom zodra een nieuwe bezette voorsorteerstrook zich voordoet (= wanneer de sensor een weggebruiker ontdekt). De beslisboom loopt als volgt: Eerst wordt er gekeken of er al andere partijen staan te wachten, en vervolgens of er op dat moment een andere voorsorteerstrook op groen licht staat. Zo niet, dan springt het stoplicht van de betreffende strook meteen op groen. Zo wel, dan wacht het tot er geen verkeer meer wordt waargenomen bij de andere voorsorteerstrook. Als er andere weggebruikers op andere stroken staan te wachten, sluit de betreffende strook achteraan in de wachtrij. Een grafische weergave van dit model is te vinden op https://algoritmes.gemeentenoorderhaaks.nl/VRI", + "required": false + }, + "publiccode": { + "type": "string", + "title": "Link naar broncode", + "max_length": 500, + "show_always": false, + "help_text": "Een URL naar de codepagina van de ontwikkelaar. Op deze pagina kunt u meer vinden over de code van het algoritme zelf.", + "instructions": "Een URL naar de codepagina van de ontwikkelaar. Op deze pagina is de code van het algoritme te vinden. Indien er geen codebase publiekelijk beschikbaar is, dient dit veld leeg te blijven. Begin een URL met https://", + "example": "https://github.com/haakssoftwarebedrijf.nl/vrisoftware", + "required": false + }, + "monitoring": { + "type": "string", + "title": "Monitoring", + "max_length": 2500, + "show_always": false, + "help_text": "Een overzicht van hoe de inzet van het algoritme wordt gemonitord.", + "instructions": "Een overzicht van hoe de inzet van het algoritme wordt gemonitord, zowel in real time als evaluatie achteraf.", + "example": "Bij monitoring van het algoritme wordt de gemaakte verkeersstroom vergeleken met het live-verkeer op plaatselijke camera's. Dagelijks wordt er met steekproeven gecontroleerd op de camerabeelden of de automatische verkeersregeling zorgt voor een goede doorstroom.", + "required": false + }, + "human_intervention": { + "type": "string", + "title": "Menselijke tussenkomst", + "max_length": 2500, + "show_always": true, + "help_text": "Een omschrijving van hoe uitkomsten van het algoritme door een mens gecontroleerd en bijgesteld (kunnen) worden.", + "instructions": "Een omschrijving van hoe uitkomsten van het algoritme door een mens gecontroleerd en bijgesteld (kunnen) worden. Vul dit veld in op B1-taalniveau.", + "example": "Bij het maken van fouten door het algoritme zou een medewerker van de afdeling handmatig de verkeersregeling aan kunnen passen en stoplichten op groen kunnen zetten. Buiten normale werktijden is er 24/7 toezicht.", + "required": false + }, + "risks": { + "type": "string", + "title": "Risico's", + "max_length": 2500, + "show_always": false, + "help_text": "Een overzicht van de voorziene risico's bij de inzet van het algoritme", + "instructions": "Een overzicht van de voorziene risico's bij de inzet van het algoritme. Denk aan risico's die kunnen ontstaan in de hele keten, van observatiedata tot uitkomst voor een gebruiker.", + "example": "De uitkomsten van het algoritme zijn alleen gebaseerd op sensoren in het wegdek die meten of er een vehikel is gepasseerd. Er is bij binnenkomst van data in het algoritme één voorzien risico: bij een defecte sensor kan het gebeuren dat weggebruikers lang blijven staan omdat ze niet worden als aanwezig worden herkend door het algoritme. Wij gaan dit tegen door de constante monitoring. Zo is de kans bijzonder klein dat dit langdurige nadelen heeft op een individu, en hoeft niemand uren stil te blijven staan. Voor de rest zijn er geen voorziene risico's, omdat bij gebrekkig functioneren van dit algoritme het traditionele systeem ook prima functioneert als plan B.", + "required": false + }, + "performance_standard": { + "type": "string", + "title": "Prestatienormen", + "max_length": 2500, + "show_always": false, + "help_text": "Een omschrijving van de verwachte prestaties van het algoritme en hoe die worden gemeten.", + "instructions": "Een omschrijving van de verwachte prestaties van het algoritme en hoe die worden gemeten.", + "example": "Het algoritme moet in ieder geval even goed presteren als een standaardinstelling van een verkeersinstallatie zonder sensoren. In eerdere pilots zagen we een verbetering van gemiddeld 36% minder wachttijd voor weggebruikers buiten de spits. Wij hanteren een minimum van 15% buiten spitstijden. Tijdens de spits is dit de baseline (0%).", + "required": false + } + } +} \ No newline at end of file diff --git a/backend/app/schemas/misc.py b/backend/app/schemas/misc.py new file mode 100644 index 00000000..e7d4ea27 --- /dev/null +++ b/backend/app/schemas/misc.py @@ -0,0 +1,15 @@ +from pydantic import BaseModel + + +class User(BaseModel): + name: str | None + organizations: list[str] + role: str | None + + +class Message(BaseModel): + detail: str + + +class PreviewUrl(BaseModel): + url: str diff --git a/backend/app/schemas/preditor.py b/backend/app/schemas/preditor.py new file mode 100644 index 00000000..73708172 --- /dev/null +++ b/backend/app/schemas/preditor.py @@ -0,0 +1,6 @@ +from pydantic import BaseModel + + +class Content(BaseModel): + html: str + lang: str diff --git a/backend/app/schemas/util.py b/backend/app/schemas/util.py new file mode 100644 index 00000000..251052c0 --- /dev/null +++ b/backend/app/schemas/util.py @@ -0,0 +1,69 @@ +from pydantic import BaseModel, create_model +from typing import Union +from functools import lru_cache +from sqlalchemy import Integer, Boolean, VARCHAR, DateTime +from datetime import datetime +import os +from app import schemas, models + + +class ExportBase(BaseModel): + class Config: + orm_mode = True + + +def _translate_type(type_class): + if type(type_class) == VARCHAR: + return str + elif type(type_class) == Boolean: + return bool + elif type(type_class) == Integer: + return int + elif type(type_class) == DateTime: + return datetime + else: + raise TypeError + + +@lru_cache(maxsize=2) +def get_algorithm_export_schema(truncated: bool): + columns = models.AlgoritmeVersion.__table__.columns + + always_ignore = [ + "id", + "algoritme_id", + "preview_active", + ] + ignore_on_trunc = [ + "create_dt", + "published", + "released", + ] + fields = {} + for c in columns: + if c.key in always_ignore: + continue + if c.key in ignore_on_trunc and truncated: + continue + fields[c.key] = (_translate_type(c.type), None) + fields["lars"] = (str, ...) + + if not truncated: + fields["owner"] = (str, ...) + fields["leverancier_id"] = (str, None) + + prefix = "truncated__" if truncated else "" + schema = create_model(prefix + "AlgoritmeInDB", **fields, __base__=ExportBase) + return schema + + +def get_all_output_schemas_union(): + file_names = os.listdir(os.path.dirname(schemas.__file__) + "/config") + version_names = [f.replace(".json", "") for f in file_names] + + output_schemas = [] + for v in version_names: + schema = schemas.versions.create_algorithm_schema(v) + output_schemas.append(schema) + schemas_union = Union[*output_schemas] # type: ignore + return schemas_union diff --git a/backend/app/schemas/versions.py b/backend/app/schemas/versions.py new file mode 100644 index 00000000..88b706d1 --- /dev/null +++ b/backend/app/schemas/versions.py @@ -0,0 +1,130 @@ +from pydantic import BaseModel, Field, create_model +from functools import lru_cache +import re +import enum +from datetime import datetime + + +class JsonSchemaProperty(BaseModel): + title: str + type: str + max_length: int | None + show_always: bool + help_text: str + instructions: str + example: str + required: bool + permitted_values: list[str] | None + + +class JsonSchema(BaseModel): + properties: dict[str, JsonSchemaProperty] + + +class AlgorithmBase(BaseModel): + class Config: + orm_mode = True + + +def _get_versioned_name(name: str, version: str): + model_name = version + "__" + name + return model_name + + +def _get_schema_json(version: str): + version_pattern = re.compile("v[0-9]_[0-9]_[0-9][a-z]?") + if not version_pattern.match(version): + raise ValueError + + file_name = f"app/schemas/config/{version}.json" + data = JsonSchema.parse_file(file_name) + return data + + +def _get_type_from_json_schema(properties: JsonSchemaProperty, key: str, version: str): + field_type = properties.type + if field_type == "string": + return str + elif field_type == "enum": + if properties.permitted_values: + # make key from values: Text text -> becomes: text_text + permitted_values_dict = { + "_".join(v.split(" ")).lower(): v for v in properties.permitted_values + } + # make name from key: text_text -> becomes TextText + enum_name = "Enum" + "".join([s.capitalize() for s in key.split("_")]) + + versioned_name = _get_versioned_name(enum_name, version) + dynamic_enum = enum.Enum(versioned_name, permitted_values_dict, type=str) + return dynamic_enum + else: + raise ValueError + + +def _get_prop_dict(field_props: JsonSchemaProperty): + field_dict = { + "title": field_props.title, + "max_length": field_props.max_length, + "show_always": field_props.show_always, + "help_text": field_props.help_text, + "instructions": field_props.instructions, + "example": field_props.example, + "default": (...) if field_props.required else None, + "type": field_props.type, + } + + return field_dict + + +def _build_schema_fields(data: JsonSchema, version: str): + fields = {} + for key in data.properties: + prop_dict = _get_prop_dict(data.properties[key]) + field_props = Field( + **prop_dict, + ) + + field_type = _get_type_from_json_schema(data.properties[key], key, version) + fields[key] = (field_type, field_props) + return fields + + +@lru_cache(maxsize=8) +def create_algorithm_in_schema(version: str): + data = _get_schema_json(version) + + fields = _build_schema_fields(data, version) + + AlgorithmIn = create_model("AlgorithmIn", **fields, __base__=AlgorithmBase) + return AlgorithmIn + + +@lru_cache(maxsize=8) +def create_algorithm_schema(version: str): + schema_version_in = create_algorithm_in_schema(version) + + fields = { + "lars": (str, ...), + "create_dt": (datetime, ...), + "released": (bool, ...), + "published": (bool, ...), + } + + model_name = _get_versioned_name("Algorithm", version) + Algorithm = create_model(model_name, **fields, __base__=schema_version_in) + return Algorithm + + +@lru_cache(maxsize=8) +def create_algorithm_in_loader_schema(version: str): + schema_version_in = create_algorithm_in_schema(version) + + fields = { + "create_dt": (datetime, Field(None)), + "published": (bool, ...), + "algoritme_id": (str, ...), + } + + model_name = _get_versioned_name("AlgorithmInLoader", version) + AlgorithmInLoader = create_model(model_name, **fields, __base__=schema_version_in) + return AlgorithmInLoader diff --git a/backend/app/util/upc.py b/backend/app/util/upc.py new file mode 100644 index 00000000..e927443e --- /dev/null +++ b/backend/app/util/upc.py @@ -0,0 +1,58 @@ +import random + + +def find_new_upc(avoid_upc_list: list[str]) -> str: + upc = "0" + attempt_limiter = 0 + while True: + upc = generate_upc() + if upc not in avoid_upc_list: + break + + attempt_limiter += 1 + if attempt_limiter > 1000: + raise RuntimeError("Unable to generate valid UPC") + return upc + + +def generate_upc() -> str: + """Generates a UPC Code. + + The code is eight numbers. The first seven are generated randomly, the last one is a control number based on the + first seven. + + The control value is calculated as: (even entries)*3 + (odd entries) mod 10. The resulting code does not have any + near neighbours; changing a single number, or swapping two numbers will result in an invalid UPC code. + + This can be used to generate ID's for distinct objects. It then reduces the chance of accidentally accessing another + entry due to typing errors. + """ + rl: list[int] = [random.randint(1, 9) for each in range(0, 7)] + + e: int = rl[0] + rl[2] + rl[4] + rl[6] + o: int = rl[1] + rl[3] + rl[5] + control_value: int = (e * 3 + o) % 10 + rl.append(control_value) + + upc_string: str = "".join(list(map(str, rl))) + return upc_string + + +def validate_upc(code: str) -> bool: + """Validates a UPC code. + + See generate_upc() on how the code is built up. This function checks if the code complies + with the generation logic.""" + try: + int(code) + except (ValueError, TypeError): + return False + + if len(code) != 8: + return False + + r: str = code + e: int = int(r[0]) + int(r[2]) + int(r[4]) + int(r[6]) + o: int = int(r[1]) + int(r[3]) + int(r[5]) + c: int = (e * 3 + o) % 10 + return True if c == int(r[7]) else False diff --git a/backend/docker-compose.yml b/backend/docker-compose.yml index f527835a..bf05c285 100644 --- a/backend/docker-compose.yml +++ b/backend/docker-compose.yml @@ -15,7 +15,6 @@ services: POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} command: -p ${POSTGRES_PORT} - dbgate: image: dbgate/dbgate:alpine container_name: ${DEV_DOCKER_CONTAINER_NAME_PREFIX}_dbgate @@ -35,10 +34,8 @@ services: PORT_CON1: ${POSTGRES_PORT} ENGINE_CON1: postgres@dbgate-plugin-postgres - - volumes: dbgate: name: ${DEV_DOCKER_CONTAINER_NAME_PREFIX}_dbgate postgres: - name: ${DEV_DOCKER_CONTAINER_NAME_PREFIX}_postgres \ No newline at end of file + name: ${DEV_DOCKER_CONTAINER_NAME_PREFIX}_postgres diff --git a/backend/poetry.lock b/backend/poetry.lock index c2273ca4..b7bab33c 100644 --- a/backend/poetry.lock +++ b/backend/poetry.lock @@ -1,14 +1,21 @@ +# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. + [[package]] name = "alembic" -version = "1.8.1" +version = "1.10.4" description = "A database migration tool for SQLAlchemy." category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "alembic-1.10.4-py3-none-any.whl", hash = "sha256:43942c3d4bf2620c466b91c0f4fca136fe51ae972394a0cc8b90810d664e4f5c"}, + {file = "alembic-1.10.4.tar.gz", hash = "sha256:295b54bbb92c4008ab6a7dcd1e227e668416d6f84b98b3c4446a2bc6214a556b"}, +] [package.dependencies] Mako = "*" SQLAlchemy = ">=1.3.0" +typing-extensions = ">=4" [package.extras] tz = ["python-dateutil"] @@ -20,6 +27,10 @@ description = "High level compatibility layer for multiple asynchronous event lo category = "main" optional = false python-versions = ">=3.6.2" +files = [ + {file = "anyio-3.6.2-py3-none-any.whl", hash = "sha256:fbbe32bd270d2a2ef3ed1c5d45041250284e31fc0a4df4a5a6071842051a51e3"}, + {file = "anyio-3.6.2.tar.gz", hash = "sha256:25ea0d673ae30af41a0c442f81cf3b38c7e79fdc7b60335a4c14e05eb0947421"}, +] [package.dependencies] idna = ">=2.8" @@ -37,20 +48,28 @@ description = "Disable App Nap on macOS >= 10.9" category = "dev" optional = false python-versions = "*" +files = [ + {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, + {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, +] [[package]] name = "asttokens" -version = "2.1.0" +version = "2.2.1" description = "Annotate AST trees with source code positions" category = "dev" optional = false python-versions = "*" +files = [ + {file = "asttokens-2.2.1-py2.py3-none-any.whl", hash = "sha256:6b0ac9e93fb0335014d382b8fa9b3afa7df546984258005da0b9e7095b3deb1c"}, + {file = "asttokens-2.2.1.tar.gz", hash = "sha256:4622110b2a6f30b77e1473affaa97e711bc2f07d3f10848420ff1898edbe94f3"}, +] [package.dependencies] six = "*" [package.extras] -test = ["astroid (<=2.5.3)", "pytest"] +test = ["astroid", "pytest"] [[package]] name = "backcall" @@ -59,14 +78,32 @@ description = "Specifications for callback functions passed in to an API" category = "dev" optional = false python-versions = "*" +files = [ + {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, + {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, +] [[package]] name = "black" -version = "22.10.0" +version = "22.12.0" description = "The uncompromising code formatter." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "black-22.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eedd20838bd5d75b80c9f5487dbcb06836a43833a37846cf1d8c1cc01cef59d"}, + {file = "black-22.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:159a46a4947f73387b4d83e87ea006dbb2337eab6c879620a3ba52699b1f4351"}, + {file = "black-22.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d30b212bffeb1e252b31dd269dfae69dd17e06d92b87ad26e23890f3efea366f"}, + {file = "black-22.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:7412e75863aa5c5411886804678b7d083c7c28421210180d67dfd8cf1221e1f4"}, + {file = "black-22.12.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c116eed0efb9ff870ded8b62fe9f28dd61ef6e9ddd28d83d7d264a38417dcee2"}, + {file = "black-22.12.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1f58cbe16dfe8c12b7434e50ff889fa479072096d79f0a7f25e4ab8e94cd8350"}, + {file = "black-22.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77d86c9f3db9b1bf6761244bc0b3572a546f5fe37917a044e02f3166d5aafa7d"}, + {file = "black-22.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:82d9fe8fee3401e02e79767016b4907820a7dc28d70d137eb397b92ef3cc5bfc"}, + {file = "black-22.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:101c69b23df9b44247bd88e1d7e90154336ac4992502d4197bdac35dd7ee3320"}, + {file = "black-22.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:559c7a1ba9a006226f09e4916060982fd27334ae1998e7a38b3f33a37f7a2148"}, + {file = "black-22.12.0-py3-none-any.whl", hash = "sha256:436cc9167dd28040ad90d3b404aec22cedf24a6e4d7de221bec2730ec0c97bcf"}, + {file = "black-22.12.0.tar.gz", hash = "sha256:229351e5a18ca30f447bf724d007f890f97e13af070bb6ad4c0a441cd7596a2f"}, +] [package.dependencies] click = ">=8.0.0" @@ -84,33 +121,177 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "certifi" -version = "2022.9.24" +version = "2023.5.7" description = "Python package for providing Mozilla's CA Bundle." category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, + {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, +] [[package]] name = "cffi" version = "1.15.1" description = "Foreign Function Interface for Python calling C code." -category = "dev" +category = "main" optional = false python-versions = "*" +files = [ + {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, + {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, + {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, + {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, + {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, + {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, + {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, + {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, + {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, + {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, + {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, + {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, + {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, + {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, + {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, + {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, + {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, + {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, + {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, +] [package.dependencies] pycparser = "*" [[package]] name = "charset-normalizer" -version = "2.1.1" +version = "3.1.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "main" optional = false -python-versions = ">=3.6.0" - -[package.extras] -unicode-backport = ["unicodedata2"] +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, + {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, +] [[package]] name = "click" @@ -119,6 +300,10 @@ description = "Composable command line interface toolkit" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, +] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -130,14 +315,167 @@ description = "Cross-platform colored terminal text." category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "comm" +version = "0.1.3" +description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "comm-0.1.3-py3-none-any.whl", hash = "sha256:16613c6211e20223f215fc6d3b266a247b6e2641bf4e0a3ad34cb1aff2aa3f37"}, + {file = "comm-0.1.3.tar.gz", hash = "sha256:a61efa9daffcfbe66fd643ba966f846a624e4e6d6767eda9cf6e993aadaab93e"}, +] + +[package.dependencies] +traitlets = ">=5.3" + +[package.extras] +lint = ["black (>=22.6.0)", "mdformat (>0.7)", "mdformat-gfm (>=0.3.5)", "ruff (>=0.0.156)"] +test = ["pytest"] +typing = ["mypy (>=0.990)"] + +[[package]] +name = "coverage" +version = "6.5.0" +description = "Code coverage measurement for Python" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "coverage-6.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ef8674b0ee8cc11e2d574e3e2998aea5df5ab242e012286824ea3c6970580e53"}, + {file = "coverage-6.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:784f53ebc9f3fd0e2a3f6a78b2be1bd1f5575d7863e10c6e12504f240fd06660"}, + {file = "coverage-6.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4a5be1748d538a710f87542f22c2cad22f80545a847ad91ce45e77417293eb4"}, + {file = "coverage-6.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83516205e254a0cb77d2d7bb3632ee019d93d9f4005de31dca0a8c3667d5bc04"}, + {file = "coverage-6.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af4fffaffc4067232253715065e30c5a7ec6faac36f8fc8d6f64263b15f74db0"}, + {file = "coverage-6.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:97117225cdd992a9c2a5515db1f66b59db634f59d0679ca1fa3fe8da32749cae"}, + {file = "coverage-6.5.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a1170fa54185845505fbfa672f1c1ab175446c887cce8212c44149581cf2d466"}, + {file = "coverage-6.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:11b990d520ea75e7ee8dcab5bc908072aaada194a794db9f6d7d5cfd19661e5a"}, + {file = "coverage-6.5.0-cp310-cp310-win32.whl", hash = "sha256:5dbec3b9095749390c09ab7c89d314727f18800060d8d24e87f01fb9cfb40b32"}, + {file = "coverage-6.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:59f53f1dc5b656cafb1badd0feb428c1e7bc19b867479ff72f7a9dd9b479f10e"}, + {file = "coverage-6.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4a5375e28c5191ac38cca59b38edd33ef4cc914732c916f2929029b4bfb50795"}, + {file = "coverage-6.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4ed2820d919351f4167e52425e096af41bfabacb1857186c1ea32ff9983ed75"}, + {file = "coverage-6.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33a7da4376d5977fbf0a8ed91c4dffaaa8dbf0ddbf4c8eea500a2486d8bc4d7b"}, + {file = "coverage-6.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8fb6cf131ac4070c9c5a3e21de0f7dc5a0fbe8bc77c9456ced896c12fcdad91"}, + {file = "coverage-6.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a6b7d95969b8845250586f269e81e5dfdd8ff828ddeb8567a4a2eaa7313460c4"}, + {file = "coverage-6.5.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1ef221513e6f68b69ee9e159506d583d31aa3567e0ae84eaad9d6ec1107dddaa"}, + {file = "coverage-6.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cca4435eebea7962a52bdb216dec27215d0df64cf27fc1dd538415f5d2b9da6b"}, + {file = "coverage-6.5.0-cp311-cp311-win32.whl", hash = "sha256:98e8a10b7a314f454d9eff4216a9a94d143a7ee65018dd12442e898ee2310578"}, + {file = "coverage-6.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:bc8ef5e043a2af066fa8cbfc6e708d58017024dc4345a1f9757b329a249f041b"}, + {file = "coverage-6.5.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4433b90fae13f86fafff0b326453dd42fc9a639a0d9e4eec4d366436d1a41b6d"}, + {file = "coverage-6.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4f05d88d9a80ad3cac6244d36dd89a3c00abc16371769f1340101d3cb899fc3"}, + {file = "coverage-6.5.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:94e2565443291bd778421856bc975d351738963071e9b8839ca1fc08b42d4bef"}, + {file = "coverage-6.5.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:027018943386e7b942fa832372ebc120155fd970837489896099f5cfa2890f79"}, + {file = "coverage-6.5.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:255758a1e3b61db372ec2736c8e2a1fdfaf563977eedbdf131de003ca5779b7d"}, + {file = "coverage-6.5.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:851cf4ff24062c6aec510a454b2584f6e998cada52d4cb58c5e233d07172e50c"}, + {file = "coverage-6.5.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:12adf310e4aafddc58afdb04d686795f33f4d7a6fa67a7a9d4ce7d6ae24d949f"}, + {file = "coverage-6.5.0-cp37-cp37m-win32.whl", hash = "sha256:b5604380f3415ba69de87a289a2b56687faa4fe04dbee0754bfcae433489316b"}, + {file = "coverage-6.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4a8dbc1f0fbb2ae3de73eb0bdbb914180c7abfbf258e90b311dcd4f585d44bd2"}, + {file = "coverage-6.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d900bb429fdfd7f511f868cedd03a6bbb142f3f9118c09b99ef8dc9bf9643c3c"}, + {file = "coverage-6.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2198ea6fc548de52adc826f62cb18554caedfb1d26548c1b7c88d8f7faa8f6ba"}, + {file = "coverage-6.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c4459b3de97b75e3bd6b7d4b7f0db13f17f504f3d13e2a7c623786289dd670e"}, + {file = "coverage-6.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:20c8ac5386253717e5ccc827caad43ed66fea0efe255727b1053a8154d952398"}, + {file = "coverage-6.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b07130585d54fe8dff3d97b93b0e20290de974dc8177c320aeaf23459219c0b"}, + {file = "coverage-6.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:dbdb91cd8c048c2b09eb17713b0c12a54fbd587d79adcebad543bc0cd9a3410b"}, + {file = "coverage-6.5.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:de3001a203182842a4630e7b8d1a2c7c07ec1b45d3084a83d5d227a3806f530f"}, + {file = "coverage-6.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e07f4a4a9b41583d6eabec04f8b68076ab3cd44c20bd29332c6572dda36f372e"}, + {file = "coverage-6.5.0-cp38-cp38-win32.whl", hash = "sha256:6d4817234349a80dbf03640cec6109cd90cba068330703fa65ddf56b60223a6d"}, + {file = "coverage-6.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:7ccf362abd726b0410bf8911c31fbf97f09f8f1061f8c1cf03dfc4b6372848f6"}, + {file = "coverage-6.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:633713d70ad6bfc49b34ead4060531658dc6dfc9b3eb7d8a716d5873377ab745"}, + {file = "coverage-6.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:95203854f974e07af96358c0b261f1048d8e1083f2de9b1c565e1be4a3a48cfc"}, + {file = "coverage-6.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9023e237f4c02ff739581ef35969c3739445fb059b060ca51771e69101efffe"}, + {file = "coverage-6.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:265de0fa6778d07de30bcf4d9dc471c3dc4314a23a3c6603d356a3c9abc2dfcf"}, + {file = "coverage-6.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f830ed581b45b82451a40faabb89c84e1a998124ee4212d440e9c6cf70083e5"}, + {file = "coverage-6.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7b6be138d61e458e18d8e6ddcddd36dd96215edfe5f1168de0b1b32635839b62"}, + {file = "coverage-6.5.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:42eafe6778551cf006a7c43153af1211c3aaab658d4d66fa5fcc021613d02518"}, + {file = "coverage-6.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:723e8130d4ecc8f56e9a611e73b31219595baa3bb252d539206f7bbbab6ffc1f"}, + {file = "coverage-6.5.0-cp39-cp39-win32.whl", hash = "sha256:d9ecf0829c6a62b9b573c7bb6d4dcd6ba8b6f80be9ba4fc7ed50bf4ac9aecd72"}, + {file = "coverage-6.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:fc2af30ed0d5ae0b1abdb4ebdce598eafd5b35397d4d75deb341a614d333d987"}, + {file = "coverage-6.5.0-pp36.pp37.pp38-none-any.whl", hash = "sha256:1431986dac3923c5945271f169f59c45b8802a114c8f548d611f2015133df77a"}, + {file = "coverage-6.5.0.tar.gz", hash = "sha256:f642e90754ee3e06b0e7e51bce3379590e76b7f76b708e1a71ff043f87025c84"}, +] + +[package.extras] +toml = ["tomli"] + +[[package]] +name = "cryptography" +version = "39.0.2" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "cryptography-39.0.2-cp36-abi3-macosx_10_12_universal2.whl", hash = "sha256:2725672bb53bb92dc7b4150d233cd4b8c59615cd8288d495eaa86db00d4e5c06"}, + {file = "cryptography-39.0.2-cp36-abi3-macosx_10_12_x86_64.whl", hash = "sha256:23df8ca3f24699167daf3e23e51f7ba7334d504af63a94af468f468b975b7dd7"}, + {file = "cryptography-39.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:eb40fe69cfc6f5cdab9a5ebd022131ba21453cf7b8a7fd3631f45bbf52bed612"}, + {file = "cryptography-39.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc0521cce2c1d541634b19f3ac661d7a64f9555135e9d8af3980965be717fd4a"}, + {file = "cryptography-39.0.2-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffd394c7896ed7821a6d13b24657c6a34b6e2650bd84ae063cf11ccffa4f1a97"}, + {file = "cryptography-39.0.2-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:e8a0772016feeb106efd28d4a328e77dc2edae84dfbac06061319fdb669ff828"}, + {file = "cryptography-39.0.2-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:8f35c17bd4faed2bc7797d2a66cbb4f986242ce2e30340ab832e5d99ae60e011"}, + {file = "cryptography-39.0.2-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:b49a88ff802e1993b7f749b1eeb31134f03c8d5c956e3c125c75558955cda536"}, + {file = "cryptography-39.0.2-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:5f8c682e736513db7d04349b4f6693690170f95aac449c56f97415c6980edef5"}, + {file = "cryptography-39.0.2-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:d7d84a512a59f4412ca8549b01f94be4161c94efc598bf09d027d67826beddc0"}, + {file = "cryptography-39.0.2-cp36-abi3-win32.whl", hash = "sha256:c43ac224aabcbf83a947eeb8b17eaf1547bce3767ee2d70093b461f31729a480"}, + {file = "cryptography-39.0.2-cp36-abi3-win_amd64.whl", hash = "sha256:788b3921d763ee35dfdb04248d0e3de11e3ca8eb22e2e48fef880c42e1f3c8f9"}, + {file = "cryptography-39.0.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:d15809e0dbdad486f4ad0979753518f47980020b7a34e9fc56e8be4f60702fac"}, + {file = "cryptography-39.0.2-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:50cadb9b2f961757e712a9737ef33d89b8190c3ea34d0fb6675e00edbe35d074"}, + {file = "cryptography-39.0.2-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:103e8f7155f3ce2ffa0049fe60169878d47a4364b277906386f8de21c9234aa1"}, + {file = "cryptography-39.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:6236a9610c912b129610eb1a274bdc1350b5df834d124fa84729ebeaf7da42c3"}, + {file = "cryptography-39.0.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e944fe07b6f229f4c1a06a7ef906a19652bdd9fd54c761b0ff87e83ae7a30354"}, + {file = "cryptography-39.0.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:35d658536b0a4117c885728d1a7032bdc9a5974722ae298d6c533755a6ee3915"}, + {file = "cryptography-39.0.2-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:30b1d1bfd00f6fc80d11300a29f1d8ab2b8d9febb6ed4a38a76880ec564fae84"}, + {file = "cryptography-39.0.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e029b844c21116564b8b61216befabca4b500e6816fa9f0ba49527653cae2108"}, + {file = "cryptography-39.0.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fa507318e427169ade4e9eccef39e9011cdc19534f55ca2f36ec3f388c1f70f3"}, + {file = "cryptography-39.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:8bc0008ef798231fac03fe7d26e82d601d15bd16f3afaad1c6113771566570f3"}, + {file = "cryptography-39.0.2.tar.gz", hash = "sha256:bc5b871e977c8ee5a1bbc42fa8d19bcc08baf0c51cbf1586b0e87a2694dde42f"}, +] + +[package.dependencies] +cffi = ">=1.12" + +[package.extras] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] +docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] +pep8test = ["black", "check-manifest", "mypy", "ruff", "types-pytz", "types-requests"] +sdist = ["setuptools-rust (>=0.11.4)"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["hypothesis (>=1.11.4,!=3.79.2)", "iso8601", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-shard (>=0.1.2)", "pytest-subtests", "pytest-xdist", "pytz"] +test-randomorder = ["pytest-randomly"] +tox = ["tox"] [[package]] name = "debugpy" -version = "1.6.3" +version = "1.6.7" description = "An implementation of the Debug Adapter Protocol for Python" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "debugpy-1.6.7-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:b3e7ac809b991006ad7f857f016fa92014445085711ef111fdc3f74f66144096"}, + {file = "debugpy-1.6.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3876611d114a18aafef6383695dfc3f1217c98a9168c1aaf1a02b01ec7d8d1e"}, + {file = "debugpy-1.6.7-cp310-cp310-win32.whl", hash = "sha256:33edb4afa85c098c24cc361d72ba7c21bb92f501104514d4ffec1fb36e09c01a"}, + {file = "debugpy-1.6.7-cp310-cp310-win_amd64.whl", hash = "sha256:ed6d5413474e209ba50b1a75b2d9eecf64d41e6e4501977991cdc755dc83ab0f"}, + {file = "debugpy-1.6.7-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:38ed626353e7c63f4b11efad659be04c23de2b0d15efff77b60e4740ea685d07"}, + {file = "debugpy-1.6.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:279d64c408c60431c8ee832dfd9ace7c396984fd7341fa3116aee414e7dcd88d"}, + {file = "debugpy-1.6.7-cp37-cp37m-win32.whl", hash = "sha256:dbe04e7568aa69361a5b4c47b4493d5680bfa3a911d1e105fbea1b1f23f3eb45"}, + {file = "debugpy-1.6.7-cp37-cp37m-win_amd64.whl", hash = "sha256:f90a2d4ad9a035cee7331c06a4cf2245e38bd7c89554fe3b616d90ab8aab89cc"}, + {file = "debugpy-1.6.7-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:5224eabbbeddcf1943d4e2821876f3e5d7d383f27390b82da5d9558fd4eb30a9"}, + {file = "debugpy-1.6.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bae1123dff5bfe548ba1683eb972329ba6d646c3a80e6b4c06cd1b1dd0205e9b"}, + {file = "debugpy-1.6.7-cp38-cp38-win32.whl", hash = "sha256:9cd10cf338e0907fdcf9eac9087faa30f150ef5445af5a545d307055141dd7a4"}, + {file = "debugpy-1.6.7-cp38-cp38-win_amd64.whl", hash = "sha256:aaf6da50377ff4056c8ed470da24632b42e4087bc826845daad7af211e00faad"}, + {file = "debugpy-1.6.7-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:0679b7e1e3523bd7d7869447ec67b59728675aadfc038550a63a362b63029d2c"}, + {file = "debugpy-1.6.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de86029696e1b3b4d0d49076b9eba606c226e33ae312a57a46dca14ff370894d"}, + {file = "debugpy-1.6.7-cp39-cp39-win32.whl", hash = "sha256:d71b31117779d9a90b745720c0eab54ae1da76d5b38c8026c654f4a066b0130a"}, + {file = "debugpy-1.6.7-cp39-cp39-win_amd64.whl", hash = "sha256:c0ff93ae90a03b06d85b2c529eca51ab15457868a377c4cc40a23ab0e4e552a3"}, + {file = "debugpy-1.6.7-py2.py3-none-any.whl", hash = "sha256:53f7a456bc50706a0eaabecf2d3ce44c4d5010e46dfc65b6b81a518b42866267"}, + {file = "debugpy-1.6.7.zip", hash = "sha256:c4c2f0810fa25323abfdfa36cbbbb24e5c3b1a42cb762782de64439c575d67f2"}, +] [[package]] name = "decorator" @@ -146,42 +484,66 @@ description = "Decorators for Humans" category = "dev" optional = false python-versions = ">=3.5" +files = [ + {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, + {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, +] [[package]] name = "dnspython" -version = "2.2.1" +version = "2.3.0" description = "DNS toolkit" category = "main" optional = false -python-versions = ">=3.6,<4.0" +python-versions = ">=3.7,<4.0" +files = [ + {file = "dnspython-2.3.0-py3-none-any.whl", hash = "sha256:89141536394f909066cabd112e3e1a37e4e654db00a25308b0f130bc3152eb46"}, + {file = "dnspython-2.3.0.tar.gz", hash = "sha256:224e32b03eb46be70e12ef6d64e0be123a64e621ab4c0822ff6d450d52a540b9"}, +] [package.extras] curio = ["curio (>=1.2,<2.0)", "sniffio (>=1.1,<2.0)"] -dnssec = ["cryptography (>=2.6,<37.0)"] -doh = ["h2 (>=4.1.0)", "httpx (>=0.21.1)", "requests (>=2.23.0,<3.0.0)", "requests-toolbelt (>=0.9.1,<0.10.0)"] +dnssec = ["cryptography (>=2.6,<40.0)"] +doh = ["h2 (>=4.1.0)", "httpx (>=0.21.1)", "requests (>=2.23.0,<3.0.0)", "requests-toolbelt (>=0.9.1,<0.11.0)"] +doq = ["aioquic (>=0.9.20)"] idna = ["idna (>=2.1,<4.0)"] -trio = ["trio (>=0.14,<0.20)"] +trio = ["trio (>=0.14,<0.23)"] wmi = ["wmi (>=1.5.1,<2.0.0)"] [[package]] -name = "email-validator" -version = "1.3.0" -description = "A robust email address syntax and deliverability validation library." +name = "ecdsa" +version = "0.18.0" +description = "ECDSA cryptographic signature library (pure python)" category = "main" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "ecdsa-0.18.0-py2.py3-none-any.whl", hash = "sha256:80600258e7ed2f16b9aa1d7c295bd70194109ad5a30fdee0eaeefef1d4c559dd"}, + {file = "ecdsa-0.18.0.tar.gz", hash = "sha256:190348041559e21b22a1d65cee485282ca11a6f81d503fddb84d5017e9ed1e49"}, +] [package.dependencies] -dnspython = ">=1.15.0" -idna = ">=2.0.0" +six = ">=1.9.0" + +[package.extras] +gmpy = ["gmpy"] +gmpy2 = ["gmpy2"] [[package]] -name = "entrypoints" -version = "0.4" -description = "Discover and load entry points from installed packages." -category = "dev" +name = "email-validator" +version = "2.0.0.post2" +description = "A robust email address syntax and deliverability validation library." +category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "email_validator-2.0.0.post2-py3-none-any.whl", hash = "sha256:2466ba57cda361fb7309fd3d5a225723c788ca4bbad32a0ebd5373b99730285c"}, + {file = "email_validator-2.0.0.post2.tar.gz", hash = "sha256:1ff6e86044200c56ae23595695c54e9614f4a9551e0e393614f764860b3d7900"}, +] + +[package.dependencies] +dnspython = ">=2.0.0" +idna = ">=2.0.0" [[package]] name = "et-xmlfile" @@ -190,6 +552,10 @@ description = "An implementation of lxml.xmlfile for the standard library" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "et_xmlfile-1.1.0-py3-none-any.whl", hash = "sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada"}, + {file = "et_xmlfile-1.1.0.tar.gz", hash = "sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c"}, +] [[package]] name = "executing" @@ -198,36 +564,44 @@ description = "Get the currently executing AST node of a frame, and other inform category = "dev" optional = false python-versions = "*" +files = [ + {file = "executing-1.2.0-py2.py3-none-any.whl", hash = "sha256:0314a69e37426e3608aada02473b4161d4caf5a4b244d1d0c48072b8fee7bacc"}, + {file = "executing-1.2.0.tar.gz", hash = "sha256:19da64c18d2d851112f09c287f8d3dbbdf725ab0e569077efb6cdcbd3497c107"}, +] [package.extras] tests = ["asttokens", "littleutils", "pytest", "rich"] [[package]] name = "fastapi" -version = "0.85.2" +version = "0.92.0" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "fastapi-0.92.0-py3-none-any.whl", hash = "sha256:ae7b97c778e2f2ec3fb3cb4fb14162129411d99907fb71920f6d69a524340ebf"}, + {file = "fastapi-0.92.0.tar.gz", hash = "sha256:023a0f5bd2c8b2609014d3bba1e14a1d7df96c6abea0a73070621c9862b9a4de"}, +] [package.dependencies] -email-validator = {version = ">=1.1.1,<2.0.0", optional = true, markers = "extra == \"all\""} -itsdangerous = {version = ">=1.1.0,<3.0.0", optional = true, markers = "extra == \"all\""} -jinja2 = {version = ">=2.11.2,<4.0.0", optional = true, markers = "extra == \"all\""} -orjson = {version = ">=3.2.1,<4.0.0", optional = true, markers = "extra == \"all\""} +email-validator = {version = ">=1.1.1", optional = true, markers = "extra == \"all\""} +httpx = {version = ">=0.23.0", optional = true, markers = "extra == \"all\""} +itsdangerous = {version = ">=1.1.0", optional = true, markers = "extra == \"all\""} +jinja2 = {version = ">=2.11.2", optional = true, markers = "extra == \"all\""} +orjson = {version = ">=3.2.1", optional = true, markers = "extra == \"all\""} pydantic = ">=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0" -python-multipart = {version = ">=0.0.5,<0.0.6", optional = true, markers = "extra == \"all\""} -pyyaml = {version = ">=5.3.1,<7.0.0", optional = true, markers = "extra == \"all\""} -requests = {version = ">=2.24.0,<3.0.0", optional = true, markers = "extra == \"all\""} -starlette = "0.20.4" -ujson = {version = ">=4.0.1,<4.0.2 || >4.0.2,<4.1.0 || >4.1.0,<4.2.0 || >4.2.0,<4.3.0 || >4.3.0,<5.0.0 || >5.0.0,<5.1.0 || >5.1.0,<6.0.0", optional = true, markers = "extra == \"all\""} -uvicorn = {version = ">=0.12.0,<0.19.0", extras = ["standard"], optional = true, markers = "extra == \"all\""} +python-multipart = {version = ">=0.0.5", optional = true, markers = "extra == \"all\""} +pyyaml = {version = ">=5.3.1", optional = true, markers = "extra == \"all\""} +starlette = ">=0.25.0,<0.26.0" +ujson = {version = ">=4.0.1,<4.0.2 || >4.0.2,<4.1.0 || >4.1.0,<4.2.0 || >4.2.0,<4.3.0 || >4.3.0,<5.0.0 || >5.0.0,<5.1.0 || >5.1.0", optional = true, markers = "extra == \"all\""} +uvicorn = {version = ">=0.12.0", extras = ["standard"], optional = true, markers = "extra == \"all\""} [package.extras] -all = ["email-validator (>=1.1.1,<2.0.0)", "itsdangerous (>=1.1.0,<3.0.0)", "jinja2 (>=2.11.2,<4.0.0)", "orjson (>=3.2.1,<4.0.0)", "python-multipart (>=0.0.5,<0.0.6)", "pyyaml (>=5.3.1,<7.0.0)", "requests (>=2.24.0,<3.0.0)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0,<6.0.0)", "uvicorn[standard] (>=0.12.0,<0.19.0)"] -dev = ["autoflake (>=1.4.0,<2.0.0)", "flake8 (>=3.8.3,<6.0.0)", "pre-commit (>=2.17.0,<3.0.0)", "uvicorn[standard] (>=0.12.0,<0.19.0)"] -doc = ["mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-markdownextradata-plugin (>=0.1.7,<0.3.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "pyyaml (>=5.3.1,<7.0.0)", "typer[all] (>=0.6.1,<0.7.0)"] -test = ["anyio[trio] (>=3.2.1,<4.0.0)", "black (==22.8.0)", "databases[sqlite] (>=0.3.2,<0.7.0)", "email-validator (>=1.1.1,<2.0.0)", "flake8 (>=3.8.3,<6.0.0)", "flask (>=1.1.2,<3.0.0)", "httpx (>=0.23.0,<0.24.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.982)", "orjson (>=3.2.1,<4.0.0)", "passlib[bcrypt] (>=1.7.2,<2.0.0)", "peewee (>=3.13.3,<4.0.0)", "pytest (>=7.1.3,<8.0.0)", "pytest-cov (>=2.12.0,<5.0.0)", "python-jose[cryptography] (>=3.3.0,<4.0.0)", "python-multipart (>=0.0.5,<0.0.6)", "pyyaml (>=5.3.1,<7.0.0)", "requests (>=2.24.0,<3.0.0)", "sqlalchemy (>=1.3.18,<=1.4.41)", "types-orjson (==3.6.2)", "types-ujson (==5.5.0)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0,<6.0.0)"] +all = ["email-validator (>=1.1.1)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] +dev = ["pre-commit (>=2.17.0,<3.0.0)", "ruff (==0.0.138)", "uvicorn[standard] (>=0.12.0,<0.21.0)"] +doc = ["mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-markdownextradata-plugin (>=0.1.7,<0.3.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "pyyaml (>=5.3.1,<7.0.0)", "typer[all] (>=0.6.1,<0.8.0)"] +test = ["anyio[trio] (>=3.2.1,<4.0.0)", "black (==22.10.0)", "coverage[toml] (>=6.5.0,<8.0)", "databases[sqlite] (>=0.3.2,<0.7.0)", "email-validator (>=1.1.1,<2.0.0)", "flask (>=1.1.2,<3.0.0)", "httpx (>=0.23.0,<0.24.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.982)", "orjson (>=3.2.1,<4.0.0)", "passlib[bcrypt] (>=1.7.2,<2.0.0)", "peewee (>=3.13.3,<4.0.0)", "pytest (>=7.1.3,<8.0.0)", "python-jose[cryptography] (>=3.3.0,<4.0.0)", "python-multipart (>=0.0.5,<0.0.6)", "pyyaml (>=5.3.1,<7.0.0)", "ruff (==0.0.138)", "sqlalchemy (>=1.3.18,<1.4.43)", "types-orjson (==3.6.2)", "types-ujson (==5.6.0.0)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0,<6.0.0)"] [[package]] name = "flake8" @@ -236,23 +610,181 @@ description = "the modular source code checker: pep8 pyflakes and co" category = "dev" optional = false python-versions = ">=3.6.1" +files = [ + {file = "flake8-5.0.4-py2.py3-none-any.whl", hash = "sha256:7a1cf6b73744f5806ab95e526f6f0d8c01c66d7bbe349562d22dfca20610b248"}, + {file = "flake8-5.0.4.tar.gz", hash = "sha256:6fbe320aad8d6b95cec8b8e47bc933004678dc63095be98528b7bdd2a9f510db"}, +] [package.dependencies] mccabe = ">=0.7.0,<0.8.0" pycodestyle = ">=2.9.0,<2.10.0" pyflakes = ">=2.5.0,<2.6.0" +[[package]] +name = "gevent" +version = "22.10.2" +description = "Coroutine-based network library" +category = "main" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5" +files = [ + {file = "gevent-22.10.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:97cd42382421779f5d82ec5007199e8a84aa288114975429e4fd0a98f2290f10"}, + {file = "gevent-22.10.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:1e1286a76f15b5e15f1e898731d50529e249529095a032453f2c101af3fde71c"}, + {file = "gevent-22.10.2-cp27-cp27m-win32.whl", hash = "sha256:59b47e81b399d49a5622f0f503c59f1ce57b7705306ea0196818951dfc2f36c8"}, + {file = "gevent-22.10.2-cp27-cp27m-win_amd64.whl", hash = "sha256:1d543c9407a1e4bca11a8932916988cfb16de00366de5bf7bc9e7a3f61e60b18"}, + {file = "gevent-22.10.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:4e2f008c82dc54ec94f4de12ca6feea60e419babb48ec145456907ae61625aa4"}, + {file = "gevent-22.10.2-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:990d7069f14dc40674e0d5cb43c68fd3bad8337048613b9bb94a0c4180ffc176"}, + {file = "gevent-22.10.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f23d0997149a816a2a9045af29c66f67f405a221745b34cefeac5769ed451db8"}, + {file = "gevent-22.10.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b43d500d7d3c0e03070dee813335bb5315215aa1cf6a04c61093dfdd718640b3"}, + {file = "gevent-22.10.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b68f4c9e20e47ad49fe797f37f91d5bbeace8765ce2707f979a8d4ec197e4d"}, + {file = "gevent-22.10.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1f001cac0ba8da76abfeb392a3057f81fab3d67cc916c7df8ea977a44a2cc989"}, + {file = "gevent-22.10.2-cp310-cp310-win_amd64.whl", hash = "sha256:3b7eae8a0653ba95a224faaddf629a913ace408edb67384d3117acf42d7dcf89"}, + {file = "gevent-22.10.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8f2477e7b0a903a01485c55bacf2089110e5f767014967ba4b287ff390ae2638"}, + {file = "gevent-22.10.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ddaa3e310a8f1a45b5c42cf50b54c31003a3028e7d4e085059090ea0e7a5fddd"}, + {file = "gevent-22.10.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98bc510e80f45486ef5b806a1c305e0e89f0430688c14984b0dbdec03331f48b"}, + {file = "gevent-22.10.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:877abdb3a669576b1d51ce6a49b7260b2a96f6b2424eb93287e779a3219d20ba"}, + {file = "gevent-22.10.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d21ad79cca234cdbfa249e727500b0ddcbc7adfff6614a96e6eaa49faca3e4f2"}, + {file = "gevent-22.10.2-cp311-cp311-win_amd64.whl", hash = "sha256:1e955238f59b2947631c9782a713280dd75884e40e455313b5b6bbc20b92ff73"}, + {file = "gevent-22.10.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:5aa99e4882a9e909b4756ee799c6fa0f79eb0542779fad4cc60efa23ec1b2aa8"}, + {file = "gevent-22.10.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:d82081656a5b9a94d37c718c8646c757e1617e389cdc533ea5e6a6f0b8b78545"}, + {file = "gevent-22.10.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54f4bfd74c178351a4a05c5c7df6f8a0a279ff6f392b57608ce0e83c768207f9"}, + {file = "gevent-22.10.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ff3796692dff50fec2f381b9152438b221335f557c4f9b811f7ded51b7a25a1"}, + {file = "gevent-22.10.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f01c9adbcb605364694b11dcd0542ec468a29ac7aba2fb5665dc6caf17ba4d7e"}, + {file = "gevent-22.10.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:9d85574eb729f981fea9a78998725a06292d90a3ed50ddca74530c3148c0be41"}, + {file = "gevent-22.10.2-cp36-cp36m-win32.whl", hash = "sha256:8c192d2073e558e241f0b592c1e2b34127a4481a5be240cad4796533b88b1a98"}, + {file = "gevent-22.10.2-cp36-cp36m-win_amd64.whl", hash = "sha256:a2237451c721a0f874ef89dbb4af4fdc172b76a964befaa69deb15b8fff10f49"}, + {file = "gevent-22.10.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:53ee7f170ed42c7561fe8aff5d381dc9a4124694e70580d0c02fba6aafc0ea37"}, + {file = "gevent-22.10.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:96c56c280e3c43cfd075efd10b250350ed5ffd3c1514ec99a080b1b92d7c8374"}, + {file = "gevent-22.10.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b6c144e08dfad4106effc043a026e5d0c0eff6ad031904c70bf5090c63f3a6a7"}, + {file = "gevent-22.10.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:018f93de7d5318d2fb440f846839a4464738468c3476d5c9cf7da45bb71c18bd"}, + {file = "gevent-22.10.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7ed2346eb9dc4344f9cb0d7963ce5b74fe16fdd031a2809bb6c2b6eba7ebcd5"}, + {file = "gevent-22.10.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:84c517e33ed604fa06b7d756dc0171169cc12f7fdd68eb7b17708a62eebf4516"}, + {file = "gevent-22.10.2-cp37-cp37m-win32.whl", hash = "sha256:4114f0f439f0b547bb6f1d474fee99ddb46736944ad2207cef3771828f6aa358"}, + {file = "gevent-22.10.2-cp37-cp37m-win_amd64.whl", hash = "sha256:0d581f22a5be6281b11ad6309b38b18f0638cf896931223cbaa5adb904826ef6"}, + {file = "gevent-22.10.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2929377c8ebfb6f4d868d161cd8de2ea6b9f6c7a5fcd4f78bcd537319c16190b"}, + {file = "gevent-22.10.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:efc003b6c1481165af61f0aeac248e0a9ac8d880bb3acbe469b448674b2d5281"}, + {file = "gevent-22.10.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db562a8519838bddad0c439a2b12246bab539dd50e299ea7ff3644274a33b6a5"}, + {file = "gevent-22.10.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1472012493ca1fac103f700d309cb6ef7964dcdb9c788d1768266e77712f5e49"}, + {file = "gevent-22.10.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c04ee32c11e9fcee47c1b431834878dc987a7a2cc4fe126ddcae3bad723ce89"}, + {file = "gevent-22.10.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8729129edef2637a8084258cb9ec4e4d5ca45d97ac77aa7a6ff19ccb530ab731"}, + {file = "gevent-22.10.2-cp38-cp38-win32.whl", hash = "sha256:ae90226074a6089371a95f20288431cd4b3f6b0b096856afd862e4ac9510cddd"}, + {file = "gevent-22.10.2-cp38-cp38-win_amd64.whl", hash = "sha256:494c7f29e94df9a1c3157d67bb7edfa32a46eed786e04d9ee68d39f375e30001"}, + {file = "gevent-22.10.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:58898dbabb5b11e4d0192aae165ad286dc6742c543e1be9d30dc82753547c508"}, + {file = "gevent-22.10.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:4197d423e198265eef39a0dea286ef389da9148e070310f34455ecee8172c391"}, + {file = "gevent-22.10.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da4183f0b9d9a1e25e1758099220d32c51cc2c6340ee0dea3fd236b2b37598e4"}, + {file = "gevent-22.10.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a5488eba6a568b4d23c072113da4fc0feb1b5f5ede7381656dc913e0d82204e2"}, + {file = "gevent-22.10.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:319d8b1699b7b8134de66d656cd739b308ab9c45ace14d60ae44de7775b456c9"}, + {file = "gevent-22.10.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f3329bedbba4d3146ae58c667e0f9ac1e6f1e1e6340c7593976cdc60aa7d1a47"}, + {file = "gevent-22.10.2-cp39-cp39-win32.whl", hash = "sha256:172caa66273315f283e90a315921902cb6549762bdcb0587fd60cb712a9d6263"}, + {file = "gevent-22.10.2-cp39-cp39-win_amd64.whl", hash = "sha256:323b207b281ba0405fea042067fa1a61662e5ac0d574ede4ebbda03efd20c350"}, + {file = "gevent-22.10.2-pp27-pypy_73-win_amd64.whl", hash = "sha256:ed7f16613eebf892a6a744d7a4a8f345bc6f066a0ff3b413e2479f9c0a180193"}, + {file = "gevent-22.10.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:a47a4e77e2bc668856aad92a0b8de7ee10768258d93cd03968e6c7ba2e832f76"}, + {file = "gevent-22.10.2.tar.gz", hash = "sha256:1ca01da176ee37b3527a2702f7d40dbc9ffb8cfc7be5a03bfa4f9eec45e55c46"}, +] + +[package.dependencies] +cffi = {version = ">=1.12.2", markers = "platform_python_implementation == \"CPython\" and sys_platform == \"win32\""} +greenlet = {version = ">=2.0.0", markers = "platform_python_implementation == \"CPython\""} +setuptools = "*" +"zope.event" = "*" +"zope.interface" = "*" + +[package.extras] +dnspython = ["dnspython (>=1.16.0,<2.0)", "idna"] +docs = ["repoze.sphinx.autointerface", "sphinxcontrib-programoutput", "zope.schema"] +monitor = ["psutil (>=5.7.0)"] +recommended = ["backports.socketpair", "cffi (>=1.12.2)", "dnspython (>=1.16.0,<2.0)", "idna", "psutil (>=5.7.0)", "selectors2"] +test = ["backports.socketpair", "cffi (>=1.12.2)", "contextvars (==2.4)", "coverage (>=5.0)", "coveralls (>=1.7.0)", "dnspython (>=1.16.0,<2.0)", "futures", "idna", "mock", "objgraph", "psutil (>=5.7.0)", "requests", "selectors2"] + [[package]] name = "greenlet" -version = "2.0.1" +version = "2.0.2" description = "Lightweight in-process concurrent programming" category = "main" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +files = [ + {file = "greenlet-2.0.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:bdfea8c661e80d3c1c99ad7c3ff74e6e87184895bbaca6ee8cc61209f8b9b85d"}, + {file = "greenlet-2.0.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:9d14b83fab60d5e8abe587d51c75b252bcc21683f24699ada8fb275d7712f5a9"}, + {file = "greenlet-2.0.2-cp27-cp27m-win32.whl", hash = "sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74"}, + {file = "greenlet-2.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343"}, + {file = "greenlet-2.0.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae"}, + {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d75209eed723105f9596807495d58d10b3470fa6732dd6756595e89925ce2470"}, + {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a51c9751078733d88e013587b108f1b7a1fb106d402fb390740f002b6f6551a"}, + {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91"}, + {file = "greenlet-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645"}, + {file = "greenlet-2.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2"}, + {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:eff4eb9b7eb3e4d0cae3d28c283dc16d9bed6b193c2e1ace3ed86ce48ea8df19"}, + {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5454276c07d27a740c5892f4907c86327b632127dd9abec42ee62e12427ff7e3"}, + {file = "greenlet-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:7cafd1208fdbe93b67c7086876f061f660cfddc44f404279c1585bbf3cdc64c5"}, + {file = "greenlet-2.0.2-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:910841381caba4f744a44bf81bfd573c94e10b3045ee00de0cbf436fe50673a6"}, + {file = "greenlet-2.0.2-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:18a7f18b82b52ee85322d7a7874e676f34ab319b9f8cce5de06067384aa8ff43"}, + {file = "greenlet-2.0.2-cp35-cp35m-win32.whl", hash = "sha256:03a8f4f3430c3b3ff8d10a2a86028c660355ab637cee9333d63d66b56f09d52a"}, + {file = "greenlet-2.0.2-cp35-cp35m-win_amd64.whl", hash = "sha256:4b58adb399c4d61d912c4c331984d60eb66565175cdf4a34792cd9600f21b394"}, + {file = "greenlet-2.0.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:703f18f3fda276b9a916f0934d2fb6d989bf0b4fb5a64825260eb9bfd52d78f0"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:32e5b64b148966d9cccc2c8d35a671409e45f195864560829f395a54226408d3"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dd11f291565a81d71dab10b7033395b7a3a5456e637cf997a6f33ebdf06f8db"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0f72c9ddb8cd28532185f54cc1453f2c16fb417a08b53a855c4e6a418edd099"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd021c754b162c0fb55ad5d6b9d960db667faad0fa2ff25bb6e1301b0b6e6a75"}, + {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:3c9b12575734155d0c09d6c3e10dbd81665d5c18e1a7c6597df72fd05990c8cf"}, + {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b9ec052b06a0524f0e35bd8790686a1da006bd911dd1ef7d50b77bfbad74e292"}, + {file = "greenlet-2.0.2-cp36-cp36m-win32.whl", hash = "sha256:dbfcfc0218093a19c252ca8eb9aee3d29cfdcb586df21049b9d777fd32c14fd9"}, + {file = "greenlet-2.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:9f35ec95538f50292f6d8f2c9c9f8a3c6540bbfec21c9e5b4b751e0a7c20864f"}, + {file = "greenlet-2.0.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:d5508f0b173e6aa47273bdc0a0b5ba055b59662ba7c7ee5119528f466585526b"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9c59a2120b55788e800d82dfa99b9e156ff8f2227f07c5e3012a45a399620b7"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2780572ec463d44c1d3ae850239508dbeb9fed38e294c68d19a24d925d9223ca"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:937e9020b514ceedb9c830c55d5c9872abc90f4b5862f89c0887033ae33c6f73"}, + {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:36abbf031e1c0f79dd5d596bfaf8e921c41df2bdf54ee1eed921ce1f52999a86"}, + {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:18e98fb3de7dba1c0a852731c3070cf022d14f0d68b4c87a19cc1016f3bb8b33"}, + {file = "greenlet-2.0.2-cp37-cp37m-win32.whl", hash = "sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7"}, + {file = "greenlet-2.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3"}, + {file = "greenlet-2.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acd2162a36d3de67ee896c43effcd5ee3de247eb00354db411feb025aa319857"}, + {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0bf60faf0bc2468089bdc5edd10555bab6e85152191df713e2ab1fcc86382b5a"}, + {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a"}, + {file = "greenlet-2.0.2-cp38-cp38-win32.whl", hash = "sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249"}, + {file = "greenlet-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40"}, + {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be4ed120b52ae4d974aa40215fcdfde9194d63541c7ded40ee12eb4dda57b76b"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94c817e84245513926588caf1152e3b559ff794d505555211ca041f032abbb6b"}, + {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1a819eef4b0e0b96bb0d98d797bef17dc1b4a10e8d7446be32d1da33e095dbb8"}, + {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7efde645ca1cc441d6dc4b48c0f7101e8d86b54c8530141b09fd31cef5149ec9"}, + {file = "greenlet-2.0.2-cp39-cp39-win32.whl", hash = "sha256:ea9872c80c132f4663822dd2a08d404073a5a9b5ba6155bea72fb2a79d1093b5"}, + {file = "greenlet-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:db1a39669102a1d8d12b57de2bb7e2ec9066a6f2b3da35ae511ff93b01b5d564"}, + {file = "greenlet-2.0.2.tar.gz", hash = "sha256:e7c8dc13af7db097bed64a051d2dd49e9f0af495c26995c00a9ee842690d34c0"}, +] [package.extras] docs = ["Sphinx", "docutils (<0.18)"] -test = ["faulthandler", "objgraph", "psutil"] +test = ["objgraph", "psutil"] + +[[package]] +name = "grequests" +version = "0.6.0" +description = "Requests + Gevent" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "grequests-0.6.0-py3-none-any.whl", hash = "sha256:6eff964416021bb1dee4182a56cc2b551bfa42d37820e6aee6f2efa00d43a061"}, + {file = "grequests-0.6.0.tar.gz", hash = "sha256:7dec890c6668e6755a1ea968565535867956639301268394d24df67b478df666"}, +] + +[package.dependencies] +gevent = "*" +requests = "*" [[package]] name = "h11" @@ -261,6 +793,32 @@ description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "httpcore" +version = "0.17.0" +description = "A minimal low-level HTTP client." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "httpcore-0.17.0-py3-none-any.whl", hash = "sha256:0fdfea45e94f0c9fd96eab9286077f9ff788dd186635ae61b312693e4d943599"}, + {file = "httpcore-0.17.0.tar.gz", hash = "sha256:cc045a3241afbf60ce056202301b4d8b6af08845e3294055eb26b09913ef903c"}, +] + +[package.dependencies] +anyio = ">=3.0,<5.0" +certifi = "*" +h11 = ">=0.13,<0.15" +sniffio = ">=1.0.0,<2.0.0" + +[package.extras] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (>=1.0.0,<2.0.0)"] [[package]] name = "httptools" @@ -269,10 +827,77 @@ description = "A collection of framework independent HTTP protocol utils." category = "main" optional = false python-versions = ">=3.5.0" +files = [ + {file = "httptools-0.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8f470c79061599a126d74385623ff4744c4e0f4a0997a353a44923c0b561ee51"}, + {file = "httptools-0.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e90491a4d77d0cb82e0e7a9cb35d86284c677402e4ce7ba6b448ccc7325c5421"}, + {file = "httptools-0.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1d2357f791b12d86faced7b5736dea9ef4f5ecdc6c3f253e445ee82da579449"}, + {file = "httptools-0.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f90cd6fd97c9a1b7fe9215e60c3bd97336742a0857f00a4cb31547bc22560c2"}, + {file = "httptools-0.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5230a99e724a1bdbbf236a1b58d6e8504b912b0552721c7c6b8570925ee0ccde"}, + {file = "httptools-0.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3a47a34f6015dd52c9eb629c0f5a8a5193e47bf2a12d9a3194d231eaf1bc451a"}, + {file = "httptools-0.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:24bb4bb8ac3882f90aa95403a1cb48465de877e2d5298ad6ddcfdebec060787d"}, + {file = "httptools-0.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e67d4f8734f8054d2c4858570cc4b233bf753f56e85217de4dfb2495904cf02e"}, + {file = "httptools-0.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7e5eefc58d20e4c2da82c78d91b2906f1a947ef42bd668db05f4ab4201a99f49"}, + {file = "httptools-0.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0297822cea9f90a38df29f48e40b42ac3d48a28637368f3ec6d15eebefd182f9"}, + {file = "httptools-0.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:557be7fbf2bfa4a2ec65192c254e151684545ebab45eca5d50477d562c40f986"}, + {file = "httptools-0.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:54465401dbbec9a6a42cf737627fb0f014d50dc7365a6b6cd57753f151a86ff0"}, + {file = "httptools-0.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4d9ebac23d2de960726ce45f49d70eb5466725c0087a078866043dad115f850f"}, + {file = "httptools-0.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:e8a34e4c0ab7b1ca17b8763613783e2458e77938092c18ac919420ab8655c8c1"}, + {file = "httptools-0.5.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f659d7a48401158c59933904040085c200b4be631cb5f23a7d561fbae593ec1f"}, + {file = "httptools-0.5.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef1616b3ba965cd68e6f759eeb5d34fbf596a79e84215eeceebf34ba3f61fdc7"}, + {file = "httptools-0.5.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3625a55886257755cb15194efbf209584754e31d336e09e2ffe0685a76cb4b60"}, + {file = "httptools-0.5.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:72ad589ba5e4a87e1d404cc1cb1b5780bfcb16e2aec957b88ce15fe879cc08ca"}, + {file = "httptools-0.5.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:850fec36c48df5a790aa735417dca8ce7d4b48d59b3ebd6f83e88a8125cde324"}, + {file = "httptools-0.5.0-cp36-cp36m-win_amd64.whl", hash = "sha256:f222e1e9d3f13b68ff8a835574eda02e67277d51631d69d7cf7f8e07df678c86"}, + {file = "httptools-0.5.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3cb8acf8f951363b617a8420768a9f249099b92e703c052f9a51b66342eea89b"}, + {file = "httptools-0.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:550059885dc9c19a072ca6d6735739d879be3b5959ec218ba3e013fd2255a11b"}, + {file = "httptools-0.5.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a04fe458a4597aa559b79c7f48fe3dceabef0f69f562daf5c5e926b153817281"}, + {file = "httptools-0.5.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7d0c1044bce274ec6711f0770fd2d5544fe392591d204c68328e60a46f88843b"}, + {file = "httptools-0.5.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c6eeefd4435055a8ebb6c5cc36111b8591c192c56a95b45fe2af22d9881eee25"}, + {file = "httptools-0.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:5b65be160adcd9de7a7e6413a4966665756e263f0d5ddeffde277ffeee0576a5"}, + {file = "httptools-0.5.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fe9c766a0c35b7e3d6b6939393c8dfdd5da3ac5dec7f971ec9134f284c6c36d6"}, + {file = "httptools-0.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:85b392aba273566c3d5596a0a490978c085b79700814fb22bfd537d381dd230c"}, + {file = "httptools-0.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5e3088f4ed33947e16fd865b8200f9cfae1144f41b64a8cf19b599508e096bc"}, + {file = "httptools-0.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c2a56b6aad7cc8f5551d8e04ff5a319d203f9d870398b94702300de50190f63"}, + {file = "httptools-0.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9b571b281a19762adb3f48a7731f6842f920fa71108aff9be49888320ac3e24d"}, + {file = "httptools-0.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa47ffcf70ba6f7848349b8a6f9b481ee0f7637931d91a9860a1838bfc586901"}, + {file = "httptools-0.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:bede7ee075e54b9a5bde695b4fc8f569f30185891796b2e4e09e2226801d09bd"}, + {file = "httptools-0.5.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:64eba6f168803a7469866a9c9b5263a7463fa8b7a25b35e547492aa7322036b6"}, + {file = "httptools-0.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4b098e4bb1174096a93f48f6193e7d9aa7071506a5877da09a783509ca5fff42"}, + {file = "httptools-0.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9423a2de923820c7e82e18980b937893f4aa8251c43684fa1772e341f6e06887"}, + {file = "httptools-0.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca1b7becf7d9d3ccdbb2f038f665c0f4857e08e1d8481cbcc1a86a0afcfb62b2"}, + {file = "httptools-0.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:50d4613025f15f4b11f1c54bbed4761c0020f7f921b95143ad6d58c151198142"}, + {file = "httptools-0.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8ffce9d81c825ac1deaa13bc9694c0562e2840a48ba21cfc9f3b4c922c16f372"}, + {file = "httptools-0.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:1af91b3650ce518d226466f30bbba5b6376dbd3ddb1b2be8b0658c6799dd450b"}, + {file = "httptools-0.5.0.tar.gz", hash = "sha256:295874861c173f9101960bba332429bb77ed4dcd8cdf5cee9922eb00e4f6bc09"}, +] [package.extras] test = ["Cython (>=0.29.24,<0.30.0)"] +[[package]] +name = "httpx" +version = "0.24.0" +description = "The next generation HTTP client." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "httpx-0.24.0-py3-none-any.whl", hash = "sha256:447556b50c1921c351ea54b4fe79d91b724ed2b027462ab9a329465d147d5a4e"}, + {file = "httpx-0.24.0.tar.gz", hash = "sha256:507d676fc3e26110d41df7d35ebd8b3b8585052450f4097401c9be59d928c63e"}, +] + +[package.dependencies] +certifi = "*" +httpcore = ">=0.15.0,<0.18.0" +idna = "*" +sniffio = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (>=8.0.0,<9.0.0)", "pygments (>=2.0.0,<3.0.0)", "rich (>=10,<14)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (>=1.0.0,<2.0.0)"] + [[package]] name = "idna" version = "3.4" @@ -280,39 +905,68 @@ description = "Internationalized Domain Names in Applications (IDNA)" category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] [[package]] name = "ipykernel" -version = "6.17.1" +version = "6.23.0" description = "IPython Kernel for Jupyter" category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "ipykernel-6.23.0-py3-none-any.whl", hash = "sha256:fc886f1dcdc0ec17f277e4d21fd071c857d381adcb04f3f3735d25325ca323c6"}, + {file = "ipykernel-6.23.0.tar.gz", hash = "sha256:bd6f487d9e2744c84f6e667d46462d7647a4c862e70e08282f05a52b9d4b705f"}, +] [package.dependencies] appnope = {version = "*", markers = "platform_system == \"Darwin\""} -debugpy = ">=1.0" +comm = ">=0.1.1" +debugpy = ">=1.6.5" ipython = ">=7.23.1" jupyter-client = ">=6.1.12" +jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" matplotlib-inline = ">=0.1" nest-asyncio = "*" packaging = "*" psutil = "*" -pyzmq = ">=17" +pyzmq = ">=20" tornado = ">=6.1" -traitlets = ">=5.1.0" +traitlets = ">=5.4.0" [package.extras] -docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinxcontrib-github-alt"] -test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-cov", "pytest-timeout"] +cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] +pyqt5 = ["pyqt5"] +pyside6 = ["pyside6"] +test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov", "pytest-timeout"] [[package]] name = "ipython" -version = "8.6.0" +version = "8.13.2" description = "IPython: Productive Interactive Computing" category = "dev" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" +files = [ + {file = "ipython-8.13.2-py3-none-any.whl", hash = "sha256:ffca270240fbd21b06b2974e14a86494d6d29290184e788275f55e0b55914926"}, + {file = "ipython-8.13.2.tar.gz", hash = "sha256:7dff3fad32b97f6488e02f87b970f309d082f758d7b7fc252e3b19ee0e432dbb"}, +] [package.dependencies] appnope = {version = "*", markers = "sys_platform == \"darwin\""} @@ -323,13 +977,13 @@ jedi = ">=0.16" matplotlib-inline = "*" pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} pickleshare = "*" -prompt-toolkit = ">3.0.1,<3.1.0" +prompt-toolkit = ">=3.0.30,<3.0.37 || >3.0.37,<3.1.0" pygments = ">=2.4.0" stack-data = "*" traitlets = ">=5" [package.extras] -all = ["black", "curio", "docrepr", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.20)", "pandas", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] +all = ["black", "curio", "docrepr", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.21)", "pandas", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] black = ["black"] doc = ["docrepr", "ipykernel", "matplotlib", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] kernel = ["ipykernel"] @@ -339,7 +993,7 @@ notebook = ["ipywidgets", "notebook"] parallel = ["ipyparallel"] qtconsole = ["qtconsole"] test = ["pytest (<7.1)", "pytest-asyncio", "testpath"] -test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.20)", "pandas", "pytest (<7.1)", "pytest-asyncio", "testpath", "trio"] +test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pandas", "pytest (<7.1)", "pytest-asyncio", "testpath", "trio"] [[package]] name = "itsdangerous" @@ -348,21 +1002,30 @@ description = "Safely pass data to untrusted environments and back." category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "itsdangerous-2.1.2-py3-none-any.whl", hash = "sha256:2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44"}, + {file = "itsdangerous-2.1.2.tar.gz", hash = "sha256:5dbbc68b317e5e42f327f9021763545dc3fc3bfe22e6deb96aaf1fc38874156a"}, +] [[package]] name = "jedi" -version = "0.18.1" +version = "0.18.2" description = "An autocompletion tool for Python that can be used for text editors." category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "jedi-0.18.2-py2.py3-none-any.whl", hash = "sha256:203c1fd9d969ab8f2119ec0a3342e0b49910045abe6af0a3ae83a5764d54639e"}, + {file = "jedi-0.18.2.tar.gz", hash = "sha256:bae794c30d07f6d910d32a7048af09b5a39ed740918da923c6b780790ebac612"}, +] [package.dependencies] parso = ">=0.8.0,<0.9.0" [package.extras] +docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] -testing = ["Django (<3.1)", "colorama", "docopt", "pytest (<7.0.0)"] +testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] [[package]] name = "jinja2" @@ -371,6 +1034,10 @@ description = "A very fast and expressive template engine." category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] [package.dependencies] MarkupSafe = ">=2.0" @@ -380,39 +1047,46 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "jupyter-client" -version = "7.4.7" +version = "8.2.0" description = "Jupyter protocol implementation and client libraries" category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "jupyter_client-8.2.0-py3-none-any.whl", hash = "sha256:b18219aa695d39e2ad570533e0d71fb7881d35a873051054a84ee2a17c4b7389"}, + {file = "jupyter_client-8.2.0.tar.gz", hash = "sha256:9fe233834edd0e6c0aa5f05ca2ab4bdea1842bfd2d8a932878212fc5301ddaf0"}, +] [package.dependencies] -entrypoints = "*" -jupyter-core = ">=4.9.2" -nest-asyncio = ">=1.5.4" +jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" python-dateutil = ">=2.8.2" pyzmq = ">=23.0" tornado = ">=6.2" -traitlets = "*" +traitlets = ">=5.3" [package.extras] -doc = ["ipykernel", "myst-parser", "sphinx (>=1.3.6)", "sphinx-rtd-theme", "sphinxcontrib-github-alt"] -test = ["codecov", "coverage", "ipykernel (>=6.12)", "ipython", "mypy", "pre-commit", "pytest", "pytest-asyncio (>=0.18)", "pytest-cov", "pytest-timeout"] +docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] [[package]] name = "jupyter-core" -version = "5.0.0" +version = "5.3.0" description = "Jupyter core package. A base package on which Jupyter projects rely." category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "jupyter_core-5.3.0-py3-none-any.whl", hash = "sha256:d4201af84559bc8c70cead287e1ab94aeef3c512848dde077b7684b54d67730d"}, + {file = "jupyter_core-5.3.0.tar.gz", hash = "sha256:6db75be0c83edbf1b7c9f91ec266a9a24ef945da630f3120e1a0046dc13713fc"}, +] [package.dependencies] -platformdirs = "*" -pywin32 = {version = ">=1.0", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} -traitlets = "*" +platformdirs = ">=2.5" +pywin32 = {version = ">=300", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} +traitlets = ">=5.3" [package.extras] +docs = ["myst-parser", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] [[package]] @@ -422,6 +1096,10 @@ description = "A super-fast templating language that borrows the best ideas from category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "Mako-1.2.4-py3-none-any.whl", hash = "sha256:c97c79c018b9165ac9922ae4f32da095ffd3c4e6872b45eded42926deea46818"}, + {file = "Mako-1.2.4.tar.gz", hash = "sha256:d60a3903dc3bb01a18ad6a89cdbe2e4eadc69c0bc8ef1e3773ba53d44c3f7a34"}, +] [package.dependencies] MarkupSafe = ">=0.9.2" @@ -433,11 +1111,63 @@ testing = ["pytest"] [[package]] name = "markupsafe" -version = "2.1.1" +version = "2.1.2" description = "Safely add untrusted strings to HTML/XML markup." category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:665a36ae6f8f20a4676b53224e33d456a6f5a72657d9c83c2aa00765072f31f7"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:340bea174e9761308703ae988e982005aedf427de816d1afe98147668cc03036"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22152d00bf4a9c7c83960521fc558f55a1adbc0631fbb00a9471e097b19d72e1"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28057e985dace2f478e042eaa15606c7efccb700797660629da387eb289b9323"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca244fa73f50a800cf8c3ebf7fd93149ec37f5cb9596aa8873ae2c1d23498601"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d9d971ec1e79906046aa3ca266de79eac42f1dbf3612a05dc9368125952bd1a1"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7e007132af78ea9df29495dbf7b5824cb71648d7133cf7848a2a5dd00d36f9ff"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7313ce6a199651c4ed9d7e4cfb4aa56fe923b1adf9af3b420ee14e6d9a73df65"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-win32.whl", hash = "sha256:c4a549890a45f57f1ebf99c067a4ad0cb423a05544accaf2b065246827ed9603"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:835fb5e38fd89328e9c81067fd642b3593c33e1e17e2fdbf77f5676abb14a156"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2ec4f2d48ae59bbb9d1f9d7efb9236ab81429a764dedca114f5fdabbc3788013"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:608e7073dfa9e38a85d38474c082d4281f4ce276ac0010224eaba11e929dd53a"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65608c35bfb8a76763f37036547f7adfd09270fbdbf96608be2bead319728fcd"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2bfb563d0211ce16b63c7cb9395d2c682a23187f54c3d79bfec33e6705473c6"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da25303d91526aac3672ee6d49a2f3db2d9502a4a60b55519feb1a4c7714e07d"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9cad97ab29dfc3f0249b483412c85c8ef4766d96cdf9dcf5a1e3caa3f3661cf1"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:085fd3201e7b12809f9e6e9bc1e5c96a368c8523fad5afb02afe3c051ae4afcc"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1bea30e9bf331f3fef67e0a3877b2288593c98a21ccb2cf29b74c581a4eb3af0"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-win32.whl", hash = "sha256:7df70907e00c970c60b9ef2938d894a9381f38e6b9db73c5be35e59d92e06625"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:e55e40ff0cc8cc5c07996915ad367fa47da6b3fc091fdadca7f5403239c5fec3"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a6e40afa7f45939ca356f348c8e23048e02cb109ced1eb8420961b2f40fb373a"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf877ab4ed6e302ec1d04952ca358b381a882fbd9d1b07cccbfd61783561f98a"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63ba06c9941e46fa389d389644e2d8225e0e3e5ebcc4ff1ea8506dce646f8c8a"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f1cd098434e83e656abf198f103a8207a8187c0fc110306691a2e94a78d0abb2"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:55f44b440d491028addb3b88f72207d71eeebfb7b5dbf0643f7c023ae1fba619"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a6f2fcca746e8d5910e18782f976489939d54a91f9411c32051b4aab2bd7c513"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0b462104ba25f1ac006fdab8b6a01ebbfbce9ed37fd37fd4acd70c67c973e460"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-win32.whl", hash = "sha256:7668b52e102d0ed87cb082380a7e2e1e78737ddecdde129acadb0eccc5423859"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6d6607f98fcf17e534162f0709aaad3ab7a96032723d8ac8750ffe17ae5a0666"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a806db027852538d2ad7555b203300173dd1b77ba116de92da9afbc3a3be3eed"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a4abaec6ca3ad8660690236d11bfe28dfd707778e2442b45addd2f086d6ef094"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f03a532d7dee1bed20bc4884194a16160a2de9ffc6354b3878ec9682bb623c54"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cf06cdc1dda95223e9d2d3c58d3b178aa5dacb35ee7e3bbac10e4e1faacb419"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22731d79ed2eb25059ae3df1dfc9cb1546691cc41f4e3130fe6bfbc3ecbbecfa"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f8ffb705ffcf5ddd0e80b65ddf7bed7ee4f5a441ea7d3419e861a12eaf41af58"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8db032bf0ce9022a8e41a22598eefc802314e81b879ae093f36ce9ddf39ab1ba"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2298c859cfc5463f1b64bd55cb3e602528db6fa0f3cfd568d3605c50678f8f03"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-win32.whl", hash = "sha256:50c42830a633fa0cf9e7d27664637532791bfc31c731a87b202d2d8ac40c3ea2"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:bb06feb762bade6bf3c8b844462274db0c76acc95c52abe8dbed28ae3d44a147"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99625a92da8229df6d44335e6fcc558a5037dd0a760e11d84be2260e6f37002f"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8bca7e26c1dd751236cfb0c6c72d4ad61d986e9a41bbf76cb445f69488b2a2bd"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40627dcf047dadb22cd25ea7ecfe9cbf3bbbad0482ee5920b582f3809c97654f"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40dfd3fefbef579ee058f139733ac336312663c6706d1163b82b3003fb1925c4"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:090376d812fb6ac5f171e5938e82e7f2d7adc2b629101cec0db8b267815c85e2"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2e7821bffe00aa6bd07a23913b7f4e01328c3d5cc0b40b36c0bd81d362faeb65"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c0a33bc9f02c2b17c3ea382f91b4db0e6cde90b63b296422a939886a7a80de1c"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b8526c6d437855442cdd3d87eede9c425c4445ea011ca38d937db299382e6fa3"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-win32.whl", hash = "sha256:137678c63c977754abe9086a3ec011e8fd985ab90631145dfb9294ad09c102a7"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:0576fe974b40a400449768941d5d0858cc624e3249dfd1e0c33674e5c7ca7aed"}, + {file = "MarkupSafe-2.1.2.tar.gz", hash = "sha256:abcabc8c2b26036d62d4c746381a6f7cf60aafcc653198ad678306986b09450d"}, +] [[package]] name = "matplotlib-inline" @@ -446,6 +1176,10 @@ description = "Inline Matplotlib backend for Jupyter" category = "dev" optional = false python-versions = ">=3.5" +files = [ + {file = "matplotlib-inline-0.1.6.tar.gz", hash = "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"}, + {file = "matplotlib_inline-0.1.6-py3-none-any.whl", hash = "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311"}, +] [package.dependencies] traitlets = "*" @@ -457,14 +1191,22 @@ description = "McCabe checker, plugin for flake8" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] [[package]] name = "mypy-extensions" -version = "0.4.3" -description = "Experimental type system extensions for programs checked with the mypy typechecker." +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] [[package]] name = "nest-asyncio" @@ -473,55 +1215,174 @@ description = "Patch asyncio to allow nested event loops" category = "dev" optional = false python-versions = ">=3.5" +files = [ + {file = "nest_asyncio-1.5.6-py3-none-any.whl", hash = "sha256:b9a953fb40dceaa587d109609098db21900182b16440652454a146cffb06e8b8"}, + {file = "nest_asyncio-1.5.6.tar.gz", hash = "sha256:d267cc1ff794403f7df692964d1d2a3fa9418ffea2a3f6859a439ff482fef290"}, +] [[package]] name = "numpy" -version = "1.23.5" -description = "NumPy is the fundamental package for array computing with Python." +version = "1.24.3" +description = "Fundamental package for array computing in Python" category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "numpy-1.24.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3c1104d3c036fb81ab923f507536daedc718d0ad5a8707c6061cdfd6d184e570"}, + {file = "numpy-1.24.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:202de8f38fc4a45a3eea4b63e2f376e5f2dc64ef0fa692838e31a808520efaf7"}, + {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8535303847b89aa6b0f00aa1dc62867b5a32923e4d1681a35b5eef2d9591a463"}, + {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d926b52ba1367f9acb76b0df6ed21f0b16a1ad87c6720a1121674e5cf63e2b6"}, + {file = "numpy-1.24.3-cp310-cp310-win32.whl", hash = "sha256:f21c442fdd2805e91799fbe044a7b999b8571bb0ab0f7850d0cb9641a687092b"}, + {file = "numpy-1.24.3-cp310-cp310-win_amd64.whl", hash = "sha256:ab5f23af8c16022663a652d3b25dcdc272ac3f83c3af4c02eb8b824e6b3ab9d7"}, + {file = "numpy-1.24.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9a7721ec204d3a237225db3e194c25268faf92e19338a35f3a224469cb6039a3"}, + {file = "numpy-1.24.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d6cc757de514c00b24ae8cf5c876af2a7c3df189028d68c0cb4eaa9cd5afc2bf"}, + {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76e3f4e85fc5d4fd311f6e9b794d0c00e7002ec122be271f2019d63376f1d385"}, + {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1d3c026f57ceaad42f8231305d4653d5f05dc6332a730ae5c0bea3513de0950"}, + {file = "numpy-1.24.3-cp311-cp311-win32.whl", hash = "sha256:c91c4afd8abc3908e00a44b2672718905b8611503f7ff87390cc0ac3423fb096"}, + {file = "numpy-1.24.3-cp311-cp311-win_amd64.whl", hash = "sha256:5342cf6aad47943286afa6f1609cad9b4266a05e7f2ec408e2cf7aea7ff69d80"}, + {file = "numpy-1.24.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7776ea65423ca6a15255ba1872d82d207bd1e09f6d0894ee4a64678dd2204078"}, + {file = "numpy-1.24.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ae8d0be48d1b6ed82588934aaaa179875e7dc4f3d84da18d7eae6eb3f06c242c"}, + {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecde0f8adef7dfdec993fd54b0f78183051b6580f606111a6d789cd14c61ea0c"}, + {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4749e053a29364d3452c034827102ee100986903263e89884922ef01a0a6fd2f"}, + {file = "numpy-1.24.3-cp38-cp38-win32.whl", hash = "sha256:d933fabd8f6a319e8530d0de4fcc2e6a61917e0b0c271fded460032db42a0fe4"}, + {file = "numpy-1.24.3-cp38-cp38-win_amd64.whl", hash = "sha256:56e48aec79ae238f6e4395886b5eaed058abb7231fb3361ddd7bfdf4eed54289"}, + {file = "numpy-1.24.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4719d5aefb5189f50887773699eaf94e7d1e02bf36c1a9d353d9f46703758ca4"}, + {file = "numpy-1.24.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ec87a7084caa559c36e0a2309e4ecb1baa03b687201d0a847c8b0ed476a7187"}, + {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea8282b9bcfe2b5e7d491d0bf7f3e2da29700cec05b49e64d6246923329f2b02"}, + {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210461d87fb02a84ef243cac5e814aad2b7f4be953b32cb53327bb49fd77fbb4"}, + {file = "numpy-1.24.3-cp39-cp39-win32.whl", hash = "sha256:784c6da1a07818491b0ffd63c6bbe5a33deaa0e25a20e1b3ea20cf0e43f8046c"}, + {file = "numpy-1.24.3-cp39-cp39-win_amd64.whl", hash = "sha256:d5036197ecae68d7f491fcdb4df90082b0d4960ca6599ba2659957aafced7c17"}, + {file = "numpy-1.24.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:352ee00c7f8387b44d19f4cada524586f07379c0d49270f87233983bc5087ca0"}, + {file = "numpy-1.24.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7d6acc2e7524c9955e5c903160aa4ea083736fde7e91276b0e5d98e6332812"}, + {file = "numpy-1.24.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:35400e6a8d102fd07c71ed7dcadd9eb62ee9a6e84ec159bd48c28235bbb0f8e4"}, + {file = "numpy-1.24.3.tar.gz", hash = "sha256:ab344f1bf21f140adab8e47fdbc7c35a477dc01408791f8ba00d018dd0bc5155"}, +] [[package]] name = "openpyxl" -version = "3.0.10" +version = "3.1.2" description = "A Python library to read/write Excel 2010 xlsx/xlsm files" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "openpyxl-3.1.2-py2.py3-none-any.whl", hash = "sha256:f91456ead12ab3c6c2e9491cf33ba6d08357d802192379bb482f1033ade496f5"}, + {file = "openpyxl-3.1.2.tar.gz", hash = "sha256:a6f5977418eff3b2d5500d54d9db50c8277a368436f4e4f8ddb1be3422870184"}, +] [package.dependencies] et-xmlfile = "*" [[package]] name = "orjson" -version = "3.8.2" +version = "3.8.12" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "orjson-3.8.12-cp310-cp310-macosx_11_0_x86_64.macosx_11_0_arm64.macosx_11_0_universal2.whl", hash = "sha256:c84046e890e13a119404a83f2e09e622509ed4692846ff94c4ca03654fbc7fb5"}, + {file = "orjson-3.8.12-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29706dd8189835bcf1781faed286e99ae54fd6165437d364dfdbf0276bf39b19"}, + {file = "orjson-3.8.12-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f4e22b0aa70c963ac01fcd620de15be21a5027711b0e5d4b96debcdeea43e3ae"}, + {file = "orjson-3.8.12-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6d1acf52d3a4b9384af09a5c2658c3a7a472a4d62a0ad1fe2c8fab8ef460c9b4"}, + {file = "orjson-3.8.12-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a72b50719bdd6bb0acfca3d4d1c841aa4b191f3ff37268e7aba04e5d6be44ccd"}, + {file = "orjson-3.8.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83e8c740a718fa6d511a82e463adc7ab17631c6eea81a716b723e127a9c51d57"}, + {file = "orjson-3.8.12-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ebb03e4c7648f7bb299872002a6120082da018f41ba7a9ebf4ceae8d765443d2"}, + {file = "orjson-3.8.12-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:44f7bb4c995652106276442de1147c9993716d1e2d79b7fd435afa154ff236b9"}, + {file = "orjson-3.8.12-cp310-none-win_amd64.whl", hash = "sha256:06e528f9a84fbb4000fd0eee573b5db543ee70ae586fdbc53e740b0ac981701c"}, + {file = "orjson-3.8.12-cp311-cp311-macosx_11_0_x86_64.macosx_11_0_arm64.macosx_11_0_universal2.whl", hash = "sha256:9a6c1594d5a9ff56e5babc4a87ac372af38d37adef9e06744e9f158431e33f43"}, + {file = "orjson-3.8.12-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6390ce0bce24c107fc275736aa8a4f768ef7eb5df935d7dca0cc99815eb5d99"}, + {file = "orjson-3.8.12-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:efb3a10030462a22c731682434df5c137a67632a8339f821cd501920b169007e"}, + {file = "orjson-3.8.12-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7e405d54c84c30d9b1c918c290bcf4ef484a45c69d5583a95db81ffffba40b44"}, + {file = "orjson-3.8.12-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd6fbd1413559572e81b5ac64c45388147c3ba85cc3df2eaa11002945e0dbd1f"}, + {file = "orjson-3.8.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f480ae7b84369b1860d8867f0baf8d885fede400fda390ce088bfa8edf97ffdc"}, + {file = "orjson-3.8.12-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:355055e0977c43b0e5325b9312b7208c696fe20cd54eed1d6fc80b0a4d6721f5"}, + {file = "orjson-3.8.12-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d937503e4dfba5edc8d5e0426d3cc97ed55716e93212b2e12a198664487b9965"}, + {file = "orjson-3.8.12-cp311-none-win_amd64.whl", hash = "sha256:eb16e0195febd24b44f4db1ab3be85ecf6038f92fd511370cebc004b3d422294"}, + {file = "orjson-3.8.12-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:dc27a8ec13f28e92dc1ea89bf1232d77e7d3ebfd5c1ccf4f3729a70561cb63bd"}, + {file = "orjson-3.8.12-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77710774faed337ac4ad919dadc5f3b655b0cd40518e5386e6f1f116de9c6c25"}, + {file = "orjson-3.8.12-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7e549468867991f6f9cfbd9c5bbc977330173bd8f6ceb79973bbd4634e13e1b9"}, + {file = "orjson-3.8.12-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:96fb1eb82b578eb6c0e53e3cf950839fe98ea210626f87c8204bd4fc2cc6ba02"}, + {file = "orjson-3.8.12-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d153b228b6e24f8bccf732a51e01e8e938eef59efed9030c5c257778fbe0804"}, + {file = "orjson-3.8.12-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:becbd5af6d035a7ec2ee3239d4700929d52d8517806b97dd04efcc37289403f7"}, + {file = "orjson-3.8.12-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7d63f524048825e05950db3b6998c756d5377a5e8c469b2e3bdb9f3217523d74"}, + {file = "orjson-3.8.12-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ec4f0130d9a27cb400423e09e0f9e46480e9e977f05fdcf663a7a2c68735513e"}, + {file = "orjson-3.8.12-cp37-none-win_amd64.whl", hash = "sha256:6f1b01f641f5e87168b819ac1cbd81aa6278e7572c326f3d27e92dea442a2c0d"}, + {file = "orjson-3.8.12-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:062e67108c218fdb9475edd5272b1629c05b56c66416fa915de5656adde30e73"}, + {file = "orjson-3.8.12-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ba645c92801417933fa74448622ba614a275ea82df05e888095c7742d913bb4"}, + {file = "orjson-3.8.12-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7d50d9b1ae409ea15534365fec0ce8a5a5f7dc94aa790aacfb8cfec87ab51aa4"}, + {file = "orjson-3.8.12-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f00038bf5d07439d13c0c2c5cd6ad48eb86df7dbd7a484013ce6a113c421b14"}, + {file = "orjson-3.8.12-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:397670665f94cf5cff779054781d80395084ba97191d82f7b3a86f0a20e6102b"}, + {file = "orjson-3.8.12-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f568205519bb0197ca91915c5da6058cfbb59993e557b02dfc3b2718b34770a"}, + {file = "orjson-3.8.12-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4fd240e736ce52cd757d74142d9933fd35a3184396be887c435f0574e0388654"}, + {file = "orjson-3.8.12-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6cae2ff288a80e81ce30313e735c5436495ab58cf8d4fbe84900e616d0ee7a78"}, + {file = "orjson-3.8.12-cp38-none-win_amd64.whl", hash = "sha256:710c40c214b753392e46f9275fd795e9630dd737a5ab4ac6e4ee1a02fe83cc0d"}, + {file = "orjson-3.8.12-cp39-cp39-macosx_11_0_x86_64.macosx_11_0_arm64.macosx_11_0_universal2.whl", hash = "sha256:aff761de5ed5543a0a51e9f703668624749aa2239de5d7d37d9c9693daeaf5dc"}, + {file = "orjson-3.8.12-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:135f29cf936283a0cd1b8bce86540ca181108f2a4d4483eedad6b8026865d2a9"}, + {file = "orjson-3.8.12-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:62f999798f2fa55e567d483864ebfc30120fb055c2696a255979439323a5b15c"}, + {file = "orjson-3.8.12-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fa58ca064c640fa9d823f98fbbc8e71940ecb78cea3ac2507da1cbf49d60b51"}, + {file = "orjson-3.8.12-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8682f752c19f6a7d9fc727fd98588b4c8b0dce791b5794bb814c7379ccd64a79"}, + {file = "orjson-3.8.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de3d096dde3e46d01841abc1982b906694ab3c92f338d37a2e6184739dc8a958"}, + {file = "orjson-3.8.12-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:834b50df79f1fe89bbaced3a1c1d8c8c92cc99e84cdcd374d8da4974b3560d2a"}, + {file = "orjson-3.8.12-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2ad149ed76dce2bbdfbadd61c35959305e77141badf364a158beb4ef3d88ec37"}, + {file = "orjson-3.8.12-cp39-none-win_amd64.whl", hash = "sha256:82d65e478a21f98107b4eb8390104746bb3024c27084b57edab7d427385f1f70"}, + {file = "orjson-3.8.12.tar.gz", hash = "sha256:9f0f042cf002a474a6aea006dd9f8d7a5497e35e5fb190ec78eb4d232ec19955"}, +] [[package]] name = "packaging" -version = "21.3" +version = "23.1" description = "Core utilities for Python packages" -category = "dev" +category = "main" optional = false -python-versions = ">=3.6" - -[package.dependencies] -pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" +python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] [[package]] name = "pandas" -version = "1.5.1" +version = "1.5.3" description = "Powerful data structures for data analysis, time series, and statistics" category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "pandas-1.5.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3749077d86e3a2f0ed51367f30bf5b82e131cc0f14260c4d3e499186fccc4406"}, + {file = "pandas-1.5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:972d8a45395f2a2d26733eb8d0f629b2f90bebe8e8eddbb8829b180c09639572"}, + {file = "pandas-1.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:50869a35cbb0f2e0cd5ec04b191e7b12ed688874bd05dd777c19b28cbea90996"}, + {file = "pandas-1.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3ac844a0fe00bfaeb2c9b51ab1424e5c8744f89860b138434a363b1f620f354"}, + {file = "pandas-1.5.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a0a56cef15fd1586726dace5616db75ebcfec9179a3a55e78f72c5639fa2a23"}, + {file = "pandas-1.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:478ff646ca42b20376e4ed3fa2e8d7341e8a63105586efe54fa2508ee087f328"}, + {file = "pandas-1.5.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6973549c01ca91ec96199e940495219c887ea815b2083722821f1d7abfa2b4dc"}, + {file = "pandas-1.5.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c39a8da13cede5adcd3be1182883aea1c925476f4e84b2807a46e2775306305d"}, + {file = "pandas-1.5.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f76d097d12c82a535fda9dfe5e8dd4127952b45fea9b0276cb30cca5ea313fbc"}, + {file = "pandas-1.5.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e474390e60ed609cec869b0da796ad94f420bb057d86784191eefc62b65819ae"}, + {file = "pandas-1.5.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f2b952406a1588ad4cad5b3f55f520e82e902388a6d5a4a91baa8d38d23c7f6"}, + {file = "pandas-1.5.3-cp311-cp311-win_amd64.whl", hash = "sha256:bc4c368f42b551bf72fac35c5128963a171b40dce866fb066540eeaf46faa003"}, + {file = "pandas-1.5.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:14e45300521902689a81f3f41386dc86f19b8ba8dd5ac5a3c7010ef8d2932813"}, + {file = "pandas-1.5.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9842b6f4b8479e41968eced654487258ed81df7d1c9b7b870ceea24ed9459b31"}, + {file = "pandas-1.5.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:26d9c71772c7afb9d5046e6e9cf42d83dd147b5cf5bcb9d97252077118543792"}, + {file = "pandas-1.5.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fbcb19d6fceb9e946b3e23258757c7b225ba450990d9ed63ccceeb8cae609f7"}, + {file = "pandas-1.5.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:565fa34a5434d38e9d250af3c12ff931abaf88050551d9fbcdfafca50d62babf"}, + {file = "pandas-1.5.3-cp38-cp38-win32.whl", hash = "sha256:87bd9c03da1ac870a6d2c8902a0e1fd4267ca00f13bc494c9e5a9020920e1d51"}, + {file = "pandas-1.5.3-cp38-cp38-win_amd64.whl", hash = "sha256:41179ce559943d83a9b4bbacb736b04c928b095b5f25dd2b7389eda08f46f373"}, + {file = "pandas-1.5.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c74a62747864ed568f5a82a49a23a8d7fe171d0c69038b38cedf0976831296fa"}, + {file = "pandas-1.5.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c4c00e0b0597c8e4f59e8d461f797e5d70b4d025880516a8261b2817c47759ee"}, + {file = "pandas-1.5.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a50d9a4336a9621cab7b8eb3fb11adb82de58f9b91d84c2cd526576b881a0c5a"}, + {file = "pandas-1.5.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd05f7783b3274aa206a1af06f0ceed3f9b412cf665b7247eacd83be41cf7bf0"}, + {file = "pandas-1.5.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f69c4029613de47816b1bb30ff5ac778686688751a5e9c99ad8c7031f6508e5"}, + {file = "pandas-1.5.3-cp39-cp39-win32.whl", hash = "sha256:7cec0bee9f294e5de5bbfc14d0573f65526071029d036b753ee6507d2a21480a"}, + {file = "pandas-1.5.3-cp39-cp39-win_amd64.whl", hash = "sha256:dfd681c5dc216037e0b0a2c821f5ed99ba9f03ebcf119c7dac0e9a7b960b9ec9"}, + {file = "pandas-1.5.3.tar.gz", hash = "sha256:74a3fd7e5a7ec052f183273dc7b0acd3a863edf7520f5d3a1765c04ffdb3b0b1"}, +] [package.dependencies] -numpy = {version = ">=1.21.0", markers = "python_version >= \"3.10\""} +numpy = [ + {version = ">=1.21.0", markers = "python_version >= \"3.10\""}, + {version = ">=1.23.2", markers = "python_version >= \"3.11\""}, +] python-dateutil = ">=2.8.1" pytz = ">=2020.1" @@ -535,18 +1396,44 @@ description = "A Python Parser" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, + {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, +] [package.extras] qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] testing = ["docopt", "pytest (<6.0.0)"] +[[package]] +name = "passlib" +version = "1.7.4" +description = "comprehensive password hashing framework supporting over 30 schemes" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "passlib-1.7.4-py2.py3-none-any.whl", hash = "sha256:aa6bca462b8d8bda89c70b382f0c298a20b5560af6cbfa2dce410c0a2fb669f1"}, + {file = "passlib-1.7.4.tar.gz", hash = "sha256:defd50f72b65c5402ab2c573830a6978e5f202ad0d984793c8dde2c4152ebe04"}, +] + +[package.extras] +argon2 = ["argon2-cffi (>=18.2.0)"] +bcrypt = ["bcrypt (>=3.1.0)"] +build-docs = ["cloud-sptheme (>=1.10.1)", "sphinx (>=1.6)", "sphinxcontrib-fulltoc (>=1.2.0)"] +totp = ["cryptography"] + [[package]] name = "pathspec" -version = "0.10.2" +version = "0.11.1" description = "Utility library for gitignore style pattern matching of file paths." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "pathspec-0.11.1-py3-none-any.whl", hash = "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293"}, + {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"}, +] [[package]] name = "pexpect" @@ -555,6 +1442,10 @@ description = "Pexpect allows easy control of interactive console applications." category = "dev" optional = false python-versions = "*" +files = [ + {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, + {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, +] [package.dependencies] ptyprocess = ">=0.5" @@ -566,48 +1457,156 @@ description = "Tiny 'shelve'-like database with concurrency support" category = "dev" optional = false python-versions = "*" +files = [ + {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, + {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, +] [[package]] name = "platformdirs" -version = "2.5.4" +version = "3.5.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "platformdirs-3.5.0-py3-none-any.whl", hash = "sha256:47692bc24c1958e8b0f13dd727307cff1db103fca36399f457da8e05f222fdc4"}, + {file = "platformdirs-3.5.0.tar.gz", hash = "sha256:7954a68d0ba23558d753f73437c55f89027cf8f5108c19844d4b82e5af396335"}, +] + +[package.extras] +docs = ["furo (>=2023.3.27)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] + +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] [package.extras] -docs = ["furo (>=2022.9.29)", "proselint (>=0.13)", "sphinx (>=5.3)", "sphinx-autodoc-typehints (>=1.19.4)"] -test = ["appdirs (==1.4.4)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] [[package]] name = "prompt-toolkit" -version = "3.0.33" +version = "3.0.38" description = "Library for building powerful interactive command lines in Python" category = "dev" optional = false -python-versions = ">=3.6.2" +python-versions = ">=3.7.0" +files = [ + {file = "prompt_toolkit-3.0.38-py3-none-any.whl", hash = "sha256:45ea77a2f7c60418850331366c81cf6b5b9cf4c7fd34616f733c5427e6abbb1f"}, + {file = "prompt_toolkit-3.0.38.tar.gz", hash = "sha256:23ac5d50538a9a38c8bde05fecb47d0b403ecd0662857a86f886f798563d5b9b"}, +] [package.dependencies] wcwidth = "*" [[package]] name = "psutil" -version = "5.9.4" +version = "5.9.5" description = "Cross-platform lib for process and system monitoring in Python." category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "psutil-5.9.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:be8929ce4313f9f8146caad4272f6abb8bf99fc6cf59344a3167ecd74f4f203f"}, + {file = "psutil-5.9.5-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ab8ed1a1d77c95453db1ae00a3f9c50227ebd955437bcf2a574ba8adbf6a74d5"}, + {file = "psutil-5.9.5-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:4aef137f3345082a3d3232187aeb4ac4ef959ba3d7c10c33dd73763fbc063da4"}, + {file = "psutil-5.9.5-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ea8518d152174e1249c4f2a1c89e3e6065941df2fa13a1ab45327716a23c2b48"}, + {file = "psutil-5.9.5-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:acf2aef9391710afded549ff602b5887d7a2349831ae4c26be7c807c0a39fac4"}, + {file = "psutil-5.9.5-cp27-none-win32.whl", hash = "sha256:5b9b8cb93f507e8dbaf22af6a2fd0ccbe8244bf30b1baad6b3954e935157ae3f"}, + {file = "psutil-5.9.5-cp27-none-win_amd64.whl", hash = "sha256:8c5f7c5a052d1d567db4ddd231a9d27a74e8e4a9c3f44b1032762bd7b9fdcd42"}, + {file = "psutil-5.9.5-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:3c6f686f4225553615612f6d9bc21f1c0e305f75d7d8454f9b46e901778e7217"}, + {file = "psutil-5.9.5-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7a7dd9997128a0d928ed4fb2c2d57e5102bb6089027939f3b722f3a210f9a8da"}, + {file = "psutil-5.9.5-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89518112647f1276b03ca97b65cc7f64ca587b1eb0278383017c2a0dcc26cbe4"}, + {file = "psutil-5.9.5-cp36-abi3-win32.whl", hash = "sha256:104a5cc0e31baa2bcf67900be36acde157756b9c44017b86b2c049f11957887d"}, + {file = "psutil-5.9.5-cp36-abi3-win_amd64.whl", hash = "sha256:b258c0c1c9d145a1d5ceffab1134441c4c5113b2417fafff7315a917a026c3c9"}, + {file = "psutil-5.9.5-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:c607bb3b57dc779d55e1554846352b4e358c10fff3abf3514a7a6601beebdb30"}, + {file = "psutil-5.9.5.tar.gz", hash = "sha256:5410638e4df39c54d957fc51ce03048acd8e6d60abc0f5107af51e5fb566eb3c"}, +] [package.extras] test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] [[package]] name = "psycopg2-binary" -version = "2.9.5" +version = "2.9.6" description = "psycopg2 - Python-PostgreSQL Database Adapter" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "psycopg2-binary-2.9.6.tar.gz", hash = "sha256:1f64dcfb8f6e0c014c7f55e51c9759f024f70ea572fbdef123f85318c297947c"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d26e0342183c762de3276cca7a530d574d4e25121ca7d6e4a98e4f05cb8e4df7"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c48d8f2db17f27d41fb0e2ecd703ea41984ee19362cbce52c097963b3a1b4365"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffe9dc0a884a8848075e576c1de0290d85a533a9f6e9c4e564f19adf8f6e54a7"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a76e027f87753f9bd1ab5f7c9cb8c7628d1077ef927f5e2446477153a602f2c"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6460c7a99fc939b849431f1e73e013d54aa54293f30f1109019c56a0b2b2ec2f"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae102a98c547ee2288637af07393dd33f440c25e5cd79556b04e3fca13325e5f"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9972aad21f965599ed0106f65334230ce826e5ae69fda7cbd688d24fa922415e"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7a40c00dbe17c0af5bdd55aafd6ff6679f94a9be9513a4c7e071baf3d7d22a70"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:cacbdc5839bdff804dfebc058fe25684cae322987f7a38b0168bc1b2df703fb1"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7f0438fa20fb6c7e202863e0d5ab02c246d35efb1d164e052f2f3bfe2b152bd0"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-win32.whl", hash = "sha256:b6c8288bb8a84b47e07013bb4850f50538aa913d487579e1921724631d02ea1b"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-win_amd64.whl", hash = "sha256:61b047a0537bbc3afae10f134dc6393823882eb263088c271331602b672e52e9"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:964b4dfb7c1c1965ac4c1978b0f755cc4bd698e8aa2b7667c575fb5f04ebe06b"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:afe64e9b8ea66866a771996f6ff14447e8082ea26e675a295ad3bdbffdd72afb"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15e2ee79e7cf29582ef770de7dab3d286431b01c3bb598f8e05e09601b890081"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfa74c903a3c1f0d9b1c7e7b53ed2d929a4910e272add6700c38f365a6002820"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b83456c2d4979e08ff56180a76429263ea254c3f6552cd14ada95cff1dec9bb8"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0645376d399bfd64da57148694d78e1f431b1e1ee1054872a5713125681cf1be"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e99e34c82309dd78959ba3c1590975b5d3c862d6f279f843d47d26ff89d7d7e1"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4ea29fc3ad9d91162c52b578f211ff1c931d8a38e1f58e684c45aa470adf19e2"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:4ac30da8b4f57187dbf449294d23b808f8f53cad6b1fc3623fa8a6c11d176dd0"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e78e6e2a00c223e164c417628572a90093c031ed724492c763721c2e0bc2a8df"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-win32.whl", hash = "sha256:1876843d8e31c89c399e31b97d4b9725a3575bb9c2af92038464231ec40f9edb"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-win_amd64.whl", hash = "sha256:b4b24f75d16a89cc6b4cdff0eb6a910a966ecd476d1e73f7ce5985ff1328e9a6"}, + {file = "psycopg2_binary-2.9.6-cp36-cp36m-win32.whl", hash = "sha256:498807b927ca2510baea1b05cc91d7da4718a0f53cb766c154c417a39f1820a0"}, + {file = "psycopg2_binary-2.9.6-cp36-cp36m-win_amd64.whl", hash = "sha256:0d236c2825fa656a2d98bbb0e52370a2e852e5a0ec45fc4f402977313329174d"}, + {file = "psycopg2_binary-2.9.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:34b9ccdf210cbbb1303c7c4db2905fa0319391bd5904d32689e6dd5c963d2ea8"}, + {file = "psycopg2_binary-2.9.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84d2222e61f313c4848ff05353653bf5f5cf6ce34df540e4274516880d9c3763"}, + {file = "psycopg2_binary-2.9.6-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30637a20623e2a2eacc420059be11527f4458ef54352d870b8181a4c3020ae6b"}, + {file = "psycopg2_binary-2.9.6-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8122cfc7cae0da9a3077216528b8bb3629c43b25053284cc868744bfe71eb141"}, + {file = "psycopg2_binary-2.9.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38601cbbfe600362c43714482f43b7c110b20cb0f8172422c616b09b85a750c5"}, + {file = "psycopg2_binary-2.9.6-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c7e62ab8b332147a7593a385d4f368874d5fe4ad4e341770d4983442d89603e3"}, + {file = "psycopg2_binary-2.9.6-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2ab652e729ff4ad76d400df2624d223d6e265ef81bb8aa17fbd63607878ecbee"}, + {file = "psycopg2_binary-2.9.6-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:c83a74b68270028dc8ee74d38ecfaf9c90eed23c8959fca95bd703d25b82c88e"}, + {file = "psycopg2_binary-2.9.6-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d4e6036decf4b72d6425d5b29bbd3e8f0ff1059cda7ac7b96d6ac5ed34ffbacd"}, + {file = "psycopg2_binary-2.9.6-cp37-cp37m-win32.whl", hash = "sha256:a8c28fd40a4226b4a84bdf2d2b5b37d2c7bd49486b5adcc200e8c7ec991dfa7e"}, + {file = "psycopg2_binary-2.9.6-cp37-cp37m-win_amd64.whl", hash = "sha256:51537e3d299be0db9137b321dfb6a5022caaab275775680e0c3d281feefaca6b"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cf4499e0a83b7b7edcb8dabecbd8501d0d3a5ef66457200f77bde3d210d5debb"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7e13a5a2c01151f1208d5207e42f33ba86d561b7a89fca67c700b9486a06d0e2"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e0f754d27fddcfd74006455b6e04e6705d6c31a612ec69ddc040a5468e44b4e"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d57c3fd55d9058645d26ae37d76e61156a27722097229d32a9e73ed54819982a"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71f14375d6f73b62800530b581aed3ada394039877818b2d5f7fc77e3bb6894d"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:441cc2f8869a4f0f4bb408475e5ae0ee1f3b55b33f350406150277f7f35384fc"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:65bee1e49fa6f9cf327ce0e01c4c10f39165ee76d35c846ade7cb0ec6683e303"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:af335bac6b666cc6aea16f11d486c3b794029d9df029967f9938a4bed59b6a19"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:cfec476887aa231b8548ece2e06d28edc87c1397ebd83922299af2e051cf2827"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:65c07febd1936d63bfde78948b76cd4c2a411572a44ac50719ead41947d0f26b"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-win32.whl", hash = "sha256:4dfb4be774c4436a4526d0c554af0cc2e02082c38303852a36f6456ece7b3503"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-win_amd64.whl", hash = "sha256:02c6e3cf3439e213e4ee930308dc122d6fb4d4bea9aef4a12535fbd605d1a2fe"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e9182eb20f41417ea1dd8e8f7888c4d7c6e805f8a7c98c1081778a3da2bee3e4"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8a6979cf527e2603d349a91060f428bcb135aea2be3201dff794813256c274f1"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8338a271cb71d8da40b023a35d9c1e919eba6cbd8fa20a54b748a332c355d896"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3ed340d2b858d6e6fb5083f87c09996506af483227735de6964a6100b4e6a54"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f81e65376e52f03422e1fb475c9514185669943798ed019ac50410fb4c4df232"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfb13af3c5dd3a9588000910178de17010ebcccd37b4f9794b00595e3a8ddad3"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4c727b597c6444a16e9119386b59388f8a424223302d0c06c676ec8b4bc1f963"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:4d67fbdaf177da06374473ef6f7ed8cc0a9dc640b01abfe9e8a2ccb1b1402c1f"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0892ef645c2fabb0c75ec32d79f4252542d0caec1d5d949630e7d242ca4681a3"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:02c0f3757a4300cf379eb49f543fb7ac527fb00144d39246ee40e1df684ab514"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-win32.whl", hash = "sha256:c3dba7dab16709a33a847e5cd756767271697041fbe3fe97c215b1fc1f5c9848"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-win_amd64.whl", hash = "sha256:f6a88f384335bb27812293fdb11ac6aee2ca3f51d3c7820fe03de0a304ab6249"}, +] [[package]] name = "ptyprocess" @@ -616,6 +1615,10 @@ description = "Run a subprocess in a pseudo terminal" category = "dev" optional = false python-versions = "*" +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] [[package]] name = "pure-eval" @@ -624,17 +1627,25 @@ description = "Safely evaluate AST nodes without side effects" category = "dev" optional = false python-versions = "*" +files = [ + {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, + {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, +] [package.extras] tests = ["pytest"] [[package]] -name = "py" -version = "1.11.0" -description = "library with cross-python path, ini-parsing, io, code, log facilities" -category = "dev" +name = "pyasn1" +version = "0.5.0" +description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" +category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "pyasn1-0.5.0-py2.py3-none-any.whl", hash = "sha256:87a2121042a1ac9358cabcaf1d07680ff97ee6404333bacca15f76aa8ad01a57"}, + {file = "pyasn1-0.5.0.tar.gz", hash = "sha256:97b7290ca68e62a832558ec3976f15cbf911bf5d7c7039d8b861c2a0ece69fde"}, +] [[package]] name = "pycodestyle" @@ -643,25 +1654,71 @@ description = "Python style guide checker" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "pycodestyle-2.9.1-py2.py3-none-any.whl", hash = "sha256:d1735fc58b418fd7c5f658d28d943854f8a849b01a5d0a1e6f3f3fdd0166804b"}, + {file = "pycodestyle-2.9.1.tar.gz", hash = "sha256:2c9607871d58c76354b697b42f5d57e1ada7d261c261efac224b664affdc5785"}, +] [[package]] name = "pycparser" version = "2.21" description = "C parser in Python" -category = "dev" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] [[package]] name = "pydantic" -version = "1.10.2" +version = "1.10.7" description = "Data validation and settings management using python type hints" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "pydantic-1.10.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e79e999e539872e903767c417c897e729e015872040e56b96e67968c3b918b2d"}, + {file = "pydantic-1.10.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:01aea3a42c13f2602b7ecbbea484a98169fb568ebd9e247593ea05f01b884b2e"}, + {file = "pydantic-1.10.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:516f1ed9bc2406a0467dd777afc636c7091d71f214d5e413d64fef45174cfc7a"}, + {file = "pydantic-1.10.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae150a63564929c675d7f2303008d88426a0add46efd76c3fc797cd71cb1b46f"}, + {file = "pydantic-1.10.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ecbbc51391248116c0a055899e6c3e7ffbb11fb5e2a4cd6f2d0b93272118a209"}, + {file = "pydantic-1.10.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f4a2b50e2b03d5776e7f21af73e2070e1b5c0d0df255a827e7c632962f8315af"}, + {file = "pydantic-1.10.7-cp310-cp310-win_amd64.whl", hash = "sha256:a7cd2251439988b413cb0a985c4ed82b6c6aac382dbaff53ae03c4b23a70e80a"}, + {file = "pydantic-1.10.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:68792151e174a4aa9e9fc1b4e653e65a354a2fa0fed169f7b3d09902ad2cb6f1"}, + {file = "pydantic-1.10.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe2507b8ef209da71b6fb5f4e597b50c5a34b78d7e857c4f8f3115effaef5fe"}, + {file = "pydantic-1.10.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10a86d8c8db68086f1e30a530f7d5f83eb0685e632e411dbbcf2d5c0150e8dcd"}, + {file = "pydantic-1.10.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d75ae19d2a3dbb146b6f324031c24f8a3f52ff5d6a9f22f0683694b3afcb16fb"}, + {file = "pydantic-1.10.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:464855a7ff7f2cc2cf537ecc421291b9132aa9c79aef44e917ad711b4a93163b"}, + {file = "pydantic-1.10.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:193924c563fae6ddcb71d3f06fa153866423ac1b793a47936656e806b64e24ca"}, + {file = "pydantic-1.10.7-cp311-cp311-win_amd64.whl", hash = "sha256:b4a849d10f211389502059c33332e91327bc154acc1845f375a99eca3afa802d"}, + {file = "pydantic-1.10.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cc1dde4e50a5fc1336ee0581c1612215bc64ed6d28d2c7c6f25d2fe3e7c3e918"}, + {file = "pydantic-1.10.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0cfe895a504c060e5d36b287ee696e2fdad02d89e0d895f83037245218a87fe"}, + {file = "pydantic-1.10.7-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:670bb4683ad1e48b0ecb06f0cfe2178dcf74ff27921cdf1606e527d2617a81ee"}, + {file = "pydantic-1.10.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:950ce33857841f9a337ce07ddf46bc84e1c4946d2a3bba18f8280297157a3fd1"}, + {file = "pydantic-1.10.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c15582f9055fbc1bfe50266a19771bbbef33dd28c45e78afbe1996fd70966c2a"}, + {file = "pydantic-1.10.7-cp37-cp37m-win_amd64.whl", hash = "sha256:82dffb306dd20bd5268fd6379bc4bfe75242a9c2b79fec58e1041fbbdb1f7914"}, + {file = "pydantic-1.10.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c7f51861d73e8b9ddcb9916ae7ac39fb52761d9ea0df41128e81e2ba42886cd"}, + {file = "pydantic-1.10.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6434b49c0b03a51021ade5c4daa7d70c98f7a79e95b551201fff682fc1661245"}, + {file = "pydantic-1.10.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64d34ab766fa056df49013bb6e79921a0265204c071984e75a09cbceacbbdd5d"}, + {file = "pydantic-1.10.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:701daea9ffe9d26f97b52f1d157e0d4121644f0fcf80b443248434958fd03dc3"}, + {file = "pydantic-1.10.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf135c46099ff3f919d2150a948ce94b9ce545598ef2c6c7bf55dca98a304b52"}, + {file = "pydantic-1.10.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0f85904f73161817b80781cc150f8b906d521fa11e3cdabae19a581c3606209"}, + {file = "pydantic-1.10.7-cp38-cp38-win_amd64.whl", hash = "sha256:9f6f0fd68d73257ad6685419478c5aece46432f4bdd8d32c7345f1986496171e"}, + {file = "pydantic-1.10.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c230c0d8a322276d6e7b88c3f7ce885f9ed16e0910354510e0bae84d54991143"}, + {file = "pydantic-1.10.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:976cae77ba6a49d80f461fd8bba183ff7ba79f44aa5cfa82f1346b5626542f8e"}, + {file = "pydantic-1.10.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d45fc99d64af9aaf7e308054a0067fdcd87ffe974f2442312372dfa66e1001d"}, + {file = "pydantic-1.10.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d2a5ebb48958754d386195fe9e9c5106f11275867051bf017a8059410e9abf1f"}, + {file = "pydantic-1.10.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:abfb7d4a7cd5cc4e1d1887c43503a7c5dd608eadf8bc615413fc498d3e4645cd"}, + {file = "pydantic-1.10.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:80b1fab4deb08a8292d15e43a6edccdffa5377a36a4597bb545b93e79c5ff0a5"}, + {file = "pydantic-1.10.7-cp39-cp39-win_amd64.whl", hash = "sha256:d71e69699498b020ea198468e2480a2f1e7433e32a3a99760058c6520e2bea7e"}, + {file = "pydantic-1.10.7-py3-none-any.whl", hash = "sha256:0cd181f1d0b1d00e2b705f1bf1ac7799a2d938cce3376b8007df62b29be3c2c6"}, + {file = "pydantic-1.10.7.tar.gz", hash = "sha256:cfc83c0678b6ba51b0532bea66860617c4cd4251ecf76e9846fa5a9f3454e97e"}, +] [package.dependencies] -typing-extensions = ">=4.1.0" +typing-extensions = ">=4.2.0" [package.extras] dotenv = ["python-dotenv (>=0.10.4)"] @@ -674,28 +1731,67 @@ description = "passive checker of Python programs" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "pyflakes-2.5.0-py2.py3-none-any.whl", hash = "sha256:4579f67d887f804e67edb544428f264b7b24f435b263c4614f384135cea553d2"}, + {file = "pyflakes-2.5.0.tar.gz", hash = "sha256:491feb020dca48ccc562a8c0cbe8df07ee13078df59813b83959cbdada312ea3"}, +] [[package]] name = "pygments" -version = "2.13.0" +version = "2.15.1" description = "Pygments is a syntax highlighting package written in Python." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, + {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, +] [package.extras] plugins = ["importlib-metadata"] [[package]] -name = "pyparsing" -version = "3.0.9" -description = "pyparsing module - Classes and methods to define and execute parsing grammars" -category = "dev" +name = "pyjwt" +version = "2.6.0" +description = "JSON Web Token implementation in Python" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "PyJWT-2.6.0-py3-none-any.whl", hash = "sha256:d83c3d892a77bbb74d3e1a2cfa90afaadb60945205d1095d9221f04466f64c14"}, + {file = "PyJWT-2.6.0.tar.gz", hash = "sha256:69285c7e31fc44f68a1feb309e948e0df53259d579295e6cfe2b1792329f05fd"}, +] + +[package.dependencies] +cryptography = {version = ">=3.4.0", optional = true, markers = "extra == \"crypto\""} + +[package.extras] +crypto = ["cryptography (>=3.4.0)"] +dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] +docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] +tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] + +[[package]] +name = "pytest" +version = "7.3.1" +description = "pytest: simple powerful testing with Python" +category = "main" optional = false -python-versions = ">=3.6.8" +python-versions = ">=3.7" +files = [ + {file = "pytest-7.3.1-py3-none-any.whl", hash = "sha256:3799fa815351fea3a5e96ac7e503a96fa51cc9942c3753cda7651b93c1cfa362"}, + {file = "pytest-7.3.1.tar.gz", hash = "sha256:434afafd78b1d78ed0addf160ad2b77a30d35d4bdf8af234fe621919d9ed15e3"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" [package.extras] -diagrams = ["jinja2", "railroad-diagrams"] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] [[package]] name = "python-dateutil" @@ -704,31 +1800,86 @@ description = "Extensions to the standard Python datetime module" category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] [package.dependencies] six = ">=1.5" [[package]] name = "python-dotenv" -version = "0.21.0" +version = "0.21.1" description = "Read key-value pairs from a .env file and set them as environment variables" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "python-dotenv-0.21.1.tar.gz", hash = "sha256:1c93de8f636cde3ce377292818d0e440b6e45a82f215c3744979151fa8151c49"}, + {file = "python_dotenv-0.21.1-py3-none-any.whl", hash = "sha256:41e12e0318bebc859fcc4d97d4db8d20ad21721a6aa5047dd59f090391cb549a"}, +] [package.extras] cli = ["click (>=5.0)"] [[package]] -name = "python-multipart" -version = "0.0.5" -description = "A streaming multipart parser for Python" +name = "python-jose" +version = "3.3.0" +description = "JOSE implementation in Python" category = "main" optional = false python-versions = "*" +files = [ + {file = "python-jose-3.3.0.tar.gz", hash = "sha256:55779b5e6ad599c6336191246e95eb2293a9ddebd555f796a65f838f07e5d78a"}, + {file = "python_jose-3.3.0-py2.py3-none-any.whl", hash = "sha256:9b1376b023f8b298536eedd47ae1089bcdb848f1535ab30555cd92002d78923a"}, +] + +[package.dependencies] +ecdsa = "!=0.15" +pyasn1 = "*" +rsa = "*" + +[package.extras] +cryptography = ["cryptography (>=3.4.0)"] +pycrypto = ["pyasn1", "pycrypto (>=2.6.0,<2.7.0)"] +pycryptodome = ["pyasn1", "pycryptodome (>=3.3.1,<4.0.0)"] + +[[package]] +name = "python-keycloak" +version = "2.9.0" +description = "python-keycloak is a Python package providing access to the Keycloak API." +category = "main" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "python_keycloak-2.9.0-py3-none-any.whl", hash = "sha256:f2b42fc27b474ac791900eee38049ba9342613118f599e8214e85cfd58d4329e"}, + {file = "python_keycloak-2.9.0.tar.gz", hash = "sha256:a270939000a4431a1f94ccf833ca3884d015635491cfb557405bc78e80a12b28"}, +] [package.dependencies] -six = ">=1.4.0" +python-jose = ">=3.3.0,<4.0.0" +requests = ">=2.20.0,<3.0.0" +requests-toolbelt = ">=0.9.1,<0.10.0" +urllib3 = ">=1.26.0,<2.0.0" + +[package.extras] +docs = ["Sphinx (>=5.3.0,<6.0.0)", "alabaster (>=0.7.12,<0.8.0)", "commonmark (>=0.9.1,<0.10.0)", "m2r2 (>=0.3.2,<0.4.0)", "mock (>=4.0.3,<5.0.0)", "readthedocs-sphinx-ext (>=2.1.9,<3.0.0)", "recommonmark (>=0.7.1,<0.8.0)", "sphinx-autoapi (>=2.0.0,<3.0.0)", "sphinx-rtd-theme (>=1.0.0,<2.0.0)"] + +[[package]] +name = "python-multipart" +version = "0.0.6" +description = "A streaming multipart parser for Python" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "python_multipart-0.0.6-py3-none-any.whl", hash = "sha256:ee698bab5ef148b0a760751c261902cd096e57e10558e11aca17646b74ee1c18"}, + {file = "python_multipart-0.0.6.tar.gz", hash = "sha256:e9925a80bb668529f1b67c7fdb0a5dacdd7cbfc6fb0bff3ea443fe22bdd62132"}, +] + +[package.extras] +dev = ["atomicwrites (==1.2.1)", "attrs (==19.2.0)", "coverage (==6.5.0)", "hatch", "invoke (==1.7.3)", "more-itertools (==4.3.0)", "pbr (==4.3.0)", "pluggy (==1.0.0)", "py (==1.11.0)", "pytest (==7.2.0)", "pytest-cov (==4.0.0)", "pytest-timeout (==2.1.0)", "pyyaml (==5.1)"] [[package]] name = "python-slugify" @@ -737,6 +1888,10 @@ description = "A Python slugify application that also handles Unicode" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "python-slugify-7.0.0.tar.gz", hash = "sha256:7a0f21a39fa6c1c4bf2e5984c9b9ae944483fd10b54804cb0e23a3ccd4954f0b"}, + {file = "python_slugify-7.0.0-py2.py3-none-any.whl", hash = "sha256:003aee64f9fd955d111549f96c4b58a3f40b9319383c70fad6277a4974bbf570"}, +] [package.dependencies] text-unidecode = ">=1.3" @@ -746,19 +1901,39 @@ unidecode = ["Unidecode (>=1.1.1)"] [[package]] name = "pytz" -version = "2022.6" +version = "2023.3" description = "World timezone definitions, modern and historical" category = "main" optional = false python-versions = "*" +files = [ + {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"}, + {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"}, +] [[package]] name = "pywin32" -version = "305" +version = "306" description = "Python for Window Extensions" category = "dev" optional = false python-versions = "*" +files = [ + {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, + {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, + {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, + {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, + {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, + {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, + {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, + {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, + {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"}, + {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"}, + {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"}, + {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"}, + {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, + {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, +] [[package]] name = "pyyaml" @@ -767,37 +1942,208 @@ description = "YAML parser and emitter for Python" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, + {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, + {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, + {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, + {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, + {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, + {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, + {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, + {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, + {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, + {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, + {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, + {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, + {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, + {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, + {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, + {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, + {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, +] [[package]] name = "pyzmq" -version = "24.0.1" +version = "25.0.2" description = "Python bindings for 0MQ" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "pyzmq-25.0.2-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:ac178e666c097c8d3deb5097b58cd1316092fc43e8ef5b5fdb259b51da7e7315"}, + {file = "pyzmq-25.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:659e62e1cbb063151c52f5b01a38e1df6b54feccfa3e2509d44c35ca6d7962ee"}, + {file = "pyzmq-25.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8280ada89010735a12b968ec3ea9a468ac2e04fddcc1cede59cb7f5178783b9c"}, + {file = "pyzmq-25.0.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9b5eeb5278a8a636bb0abdd9ff5076bcbb836cd2302565df53ff1fa7d106d54"}, + {file = "pyzmq-25.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a2e5fe42dfe6b73ca120b97ac9f34bfa8414feb15e00e37415dbd51cf227ef6"}, + {file = "pyzmq-25.0.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:827bf60e749e78acb408a6c5af6688efbc9993e44ecc792b036ec2f4b4acf485"}, + {file = "pyzmq-25.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7b504ae43d37e282301da586529e2ded8b36d4ee2cd5e6db4386724ddeaa6bbc"}, + {file = "pyzmq-25.0.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cb1f69a0a2a2b1aae8412979dd6293cc6bcddd4439bf07e4758d864ddb112354"}, + {file = "pyzmq-25.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2b9c9cc965cdf28381e36da525dcb89fc1571d9c54800fdcd73e3f73a2fc29bd"}, + {file = "pyzmq-25.0.2-cp310-cp310-win32.whl", hash = "sha256:24abbfdbb75ac5039205e72d6c75f10fc39d925f2df8ff21ebc74179488ebfca"}, + {file = "pyzmq-25.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6a821a506822fac55d2df2085a52530f68ab15ceed12d63539adc32bd4410f6e"}, + {file = "pyzmq-25.0.2-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:9af0bb0277e92f41af35e991c242c9c71920169d6aa53ade7e444f338f4c8128"}, + {file = "pyzmq-25.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:54a96cf77684a3a537b76acfa7237b1e79a8f8d14e7f00e0171a94b346c5293e"}, + {file = "pyzmq-25.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88649b19ede1cab03b96b66c364cbbf17c953615cdbc844f7f6e5f14c5e5261c"}, + {file = "pyzmq-25.0.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:715cff7644a80a7795953c11b067a75f16eb9fc695a5a53316891ebee7f3c9d5"}, + {file = "pyzmq-25.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:312b3f0f066b4f1d17383aae509bacf833ccaf591184a1f3c7a1661c085063ae"}, + {file = "pyzmq-25.0.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d488c5c8630f7e782e800869f82744c3aca4aca62c63232e5d8c490d3d66956a"}, + {file = "pyzmq-25.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:38d9f78d69bcdeec0c11e0feb3bc70f36f9b8c44fc06e5d06d91dc0a21b453c7"}, + {file = "pyzmq-25.0.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3059a6a534c910e1d5d068df42f60d434f79e6cc6285aa469b384fa921f78cf8"}, + {file = "pyzmq-25.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6526d097b75192f228c09d48420854d53dfbc7abbb41b0e26f363ccb26fbc177"}, + {file = "pyzmq-25.0.2-cp311-cp311-win32.whl", hash = "sha256:5c5fbb229e40a89a2fe73d0c1181916f31e30f253cb2d6d91bea7927c2e18413"}, + {file = "pyzmq-25.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:ed15e3a2c3c2398e6ae5ce86d6a31b452dfd6ad4cd5d312596b30929c4b6e182"}, + {file = "pyzmq-25.0.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:032f5c8483c85bf9c9ca0593a11c7c749d734ce68d435e38c3f72e759b98b3c9"}, + {file = "pyzmq-25.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:374b55516393bfd4d7a7daa6c3b36d6dd6a31ff9d2adad0838cd6a203125e714"}, + {file = "pyzmq-25.0.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:08bfcc21b5997a9be4fefa405341320d8e7f19b4d684fb9c0580255c5bd6d695"}, + {file = "pyzmq-25.0.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1a843d26a8da1b752c74bc019c7b20e6791ee813cd6877449e6a1415589d22ff"}, + {file = "pyzmq-25.0.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:b48616a09d7df9dbae2f45a0256eee7b794b903ddc6d8657a9948669b345f220"}, + {file = "pyzmq-25.0.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:d4427b4a136e3b7f85516c76dd2e0756c22eec4026afb76ca1397152b0ca8145"}, + {file = "pyzmq-25.0.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:26b0358e8933990502f4513c991c9935b6c06af01787a36d133b7c39b1df37fa"}, + {file = "pyzmq-25.0.2-cp36-cp36m-win32.whl", hash = "sha256:c8fedc3ccd62c6b77dfe6f43802057a803a411ee96f14e946f4a76ec4ed0e117"}, + {file = "pyzmq-25.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:2da6813b7995b6b1d1307329c73d3e3be2fd2d78e19acfc4eff2e27262732388"}, + {file = "pyzmq-25.0.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a35960c8b2f63e4ef67fd6731851030df68e4b617a6715dd11b4b10312d19fef"}, + {file = "pyzmq-25.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eef2a0b880ab40aca5a878933376cb6c1ec483fba72f7f34e015c0f675c90b20"}, + {file = "pyzmq-25.0.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:85762712b74c7bd18e340c3639d1bf2f23735a998d63f46bb6584d904b5e401d"}, + {file = "pyzmq-25.0.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:64812f29d6eee565e129ca14b0c785744bfff679a4727137484101b34602d1a7"}, + {file = "pyzmq-25.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:510d8e55b3a7cd13f8d3e9121edf0a8730b87d925d25298bace29a7e7bc82810"}, + {file = "pyzmq-25.0.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b164cc3c8acb3d102e311f2eb6f3c305865ecb377e56adc015cb51f721f1dda6"}, + {file = "pyzmq-25.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:28fdb9224a258134784a9cf009b59265a9dde79582fb750d4e88a6bcbc6fa3dc"}, + {file = "pyzmq-25.0.2-cp37-cp37m-win32.whl", hash = "sha256:dd771a440effa1c36d3523bc6ba4e54ff5d2e54b4adcc1e060d8f3ca3721d228"}, + {file = "pyzmq-25.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:9bdc40efb679b9dcc39c06d25629e55581e4c4f7870a5e88db4f1c51ce25e20d"}, + {file = "pyzmq-25.0.2-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:1f82906a2d8e4ee310f30487b165e7cc8ed09c009e4502da67178b03083c4ce0"}, + {file = "pyzmq-25.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:21ec0bf4831988af43c8d66ba3ccd81af2c5e793e1bf6790eb2d50e27b3c570a"}, + {file = "pyzmq-25.0.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:abbce982a17c88d2312ec2cf7673985d444f1beaac6e8189424e0a0e0448dbb3"}, + {file = "pyzmq-25.0.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9e1d2f2d86fc75ed7f8845a992c5f6f1ab5db99747fb0d78b5e4046d041164d2"}, + {file = "pyzmq-25.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2e92ff20ad5d13266bc999a29ed29a3b5b101c21fdf4b2cf420c09db9fb690e"}, + {file = "pyzmq-25.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:edbbf06cc2719889470a8d2bf5072bb00f423e12de0eb9ffec946c2c9748e149"}, + {file = "pyzmq-25.0.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:77942243ff4d14d90c11b2afd8ee6c039b45a0be4e53fb6fa7f5e4fd0b59da39"}, + {file = "pyzmq-25.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ab046e9cb902d1f62c9cc0eca055b1d11108bdc271caf7c2171487298f229b56"}, + {file = "pyzmq-25.0.2-cp38-cp38-win32.whl", hash = "sha256:ad761cfbe477236802a7ab2c080d268c95e784fe30cafa7e055aacd1ca877eb0"}, + {file = "pyzmq-25.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:8560756318ec7c4c49d2c341012167e704b5a46d9034905853c3d1ade4f55bee"}, + {file = "pyzmq-25.0.2-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:ab2c056ac503f25a63f6c8c6771373e2a711b98b304614151dfb552d3d6c81f6"}, + {file = "pyzmq-25.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cca8524b61c0eaaa3505382dc9b9a3bc8165f1d6c010fdd1452c224225a26689"}, + {file = "pyzmq-25.0.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cfb9f7eae02d3ac42fbedad30006b7407c984a0eb4189a1322241a20944d61e5"}, + {file = "pyzmq-25.0.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5eaeae038c68748082137d6896d5c4db7927e9349237ded08ee1bbd94f7361c9"}, + {file = "pyzmq-25.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a31992a8f8d51663ebf79df0df6a04ffb905063083d682d4380ab8d2c67257c"}, + {file = "pyzmq-25.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6a979e59d2184a0c8f2ede4b0810cbdd86b64d99d9cc8a023929e40dce7c86cc"}, + {file = "pyzmq-25.0.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1f124cb73f1aa6654d31b183810febc8505fd0c597afa127c4f40076be4574e0"}, + {file = "pyzmq-25.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:65c19a63b4a83ae45d62178b70223adeee5f12f3032726b897431b6553aa25af"}, + {file = "pyzmq-25.0.2-cp39-cp39-win32.whl", hash = "sha256:83d822e8687621bed87404afc1c03d83fa2ce39733d54c2fd52d8829edb8a7ff"}, + {file = "pyzmq-25.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:24683285cc6b7bf18ad37d75b9db0e0fefe58404e7001f1d82bf9e721806daa7"}, + {file = "pyzmq-25.0.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4a4b4261eb8f9ed71f63b9eb0198dd7c934aa3b3972dac586d0ef502ba9ab08b"}, + {file = "pyzmq-25.0.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:62ec8d979f56c0053a92b2b6a10ff54b9ec8a4f187db2b6ec31ee3dd6d3ca6e2"}, + {file = "pyzmq-25.0.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:affec1470351178e892121b3414c8ef7803269f207bf9bef85f9a6dd11cde264"}, + {file = "pyzmq-25.0.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffc71111433bd6ec8607a37b9211f4ef42e3d3b271c6d76c813669834764b248"}, + {file = "pyzmq-25.0.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:6fadc60970714d86eff27821f8fb01f8328dd36bebd496b0564a500fe4a9e354"}, + {file = "pyzmq-25.0.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:269968f2a76c0513490aeb3ba0dc3c77b7c7a11daa894f9d1da88d4a0db09835"}, + {file = "pyzmq-25.0.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f7c8b8368e84381ae7c57f1f5283b029c888504aaf4949c32e6e6fb256ec9bf0"}, + {file = "pyzmq-25.0.2-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:25e6873a70ad5aa31e4a7c41e5e8c709296edef4a92313e1cd5fc87bbd1874e2"}, + {file = "pyzmq-25.0.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b733076ff46e7db5504c5e7284f04a9852c63214c74688bdb6135808531755a3"}, + {file = "pyzmq-25.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:a6f6ae12478fdc26a6d5fdb21f806b08fa5403cd02fd312e4cb5f72df078f96f"}, + {file = "pyzmq-25.0.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:67da1c213fbd208906ab3470cfff1ee0048838365135a9bddc7b40b11e6d6c89"}, + {file = "pyzmq-25.0.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:531e36d9fcd66f18de27434a25b51d137eb546931033f392e85674c7a7cea853"}, + {file = "pyzmq-25.0.2-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34a6fddd159ff38aa9497b2e342a559f142ab365576284bc8f77cb3ead1f79c5"}, + {file = "pyzmq-25.0.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b491998ef886662c1f3d49ea2198055a9a536ddf7430b051b21054f2a5831800"}, + {file = "pyzmq-25.0.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:5d496815074e3e3d183fe2c7fcea2109ad67b74084c254481f87b64e04e9a471"}, + {file = "pyzmq-25.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:56a94ab1d12af982b55ca96c6853db6ac85505e820d9458ac76364c1998972f4"}, + {file = "pyzmq-25.0.2.tar.gz", hash = "sha256:6b8c1bbb70e868dc88801aa532cae6bd4e3b5233784692b786f17ad2962e5149"}, +] [package.dependencies] cffi = {version = "*", markers = "implementation_name == \"pypy\""} -py = {version = "*", markers = "implementation_name == \"pypy\""} [[package]] name = "requests" -version = "2.28.1" +version = "2.30.0" description = "Python HTTP for Humans." category = "main" optional = false -python-versions = ">=3.7, <4" +python-versions = ">=3.7" +files = [ + {file = "requests-2.30.0-py3-none-any.whl", hash = "sha256:10e94cc4f3121ee6da529d358cdaeaff2f1c409cd377dbc72b825852f2f7e294"}, + {file = "requests-2.30.0.tar.gz", hash = "sha256:239d7d4458afcb28a692cdd298d87542235f4ca8d36d03a15bfc128a6559a2f4"}, +] [package.dependencies] certifi = ">=2017.4.17" -charset-normalizer = ">=2,<3" +charset-normalizer = ">=2,<4" idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<1.27" +urllib3 = ">=1.21.1,<3" [package.extras] socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] +[[package]] +name = "requests-toolbelt" +version = "0.9.1" +description = "A utility belt for advanced users of python-requests" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "requests-toolbelt-0.9.1.tar.gz", hash = "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0"}, + {file = "requests_toolbelt-0.9.1-py2.py3-none-any.whl", hash = "sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f"}, +] + +[package.dependencies] +requests = ">=2.0.1,<3.0.0" + +[[package]] +name = "rsa" +version = "4.9" +description = "Pure-Python RSA implementation" +category = "main" +optional = false +python-versions = ">=3.6,<4" +files = [ + {file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"}, + {file = "rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"}, +] + +[package.dependencies] +pyasn1 = ">=0.1.3" + +[[package]] +name = "setuptools" +version = "67.7.2" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "setuptools-67.7.2-py3-none-any.whl", hash = "sha256:23aaf86b85ca52ceb801d32703f12d77517b2556af839621c641fca11287952b"}, + {file = "setuptools-67.7.2.tar.gz", hash = "sha256:f104fa03692a2602fa0fec6c6a9e63b6c8a968de13e17c026957dd1f53d80990"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + [[package]] name = "six" version = "1.16.0" @@ -805,6 +2151,10 @@ description = "Python 2 and 3 compatibility utilities" category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] [[package]] name = "sniffio" @@ -813,21 +2163,68 @@ description = "Sniff out which async library your code is running under" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, + {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, +] [[package]] name = "sqlalchemy" -version = "1.4.44" +version = "1.4.48" description = "Database Abstraction Library" category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "SQLAlchemy-1.4.48-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:4bac3aa3c3d8bc7408097e6fe8bf983caa6e9491c5d2e2488cfcfd8106f13b6a"}, + {file = "SQLAlchemy-1.4.48-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:dbcae0e528d755f4522cad5842f0942e54b578d79f21a692c44d91352ea6d64e"}, + {file = "SQLAlchemy-1.4.48-cp27-cp27m-win32.whl", hash = "sha256:cbbe8b8bffb199b225d2fe3804421b7b43a0d49983f81dc654d0431d2f855543"}, + {file = "SQLAlchemy-1.4.48-cp27-cp27m-win_amd64.whl", hash = "sha256:627e04a5d54bd50628fc8734d5fc6df2a1aa5962f219c44aad50b00a6cdcf965"}, + {file = "SQLAlchemy-1.4.48-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9af1db7a287ef86e0f5cd990b38da6bd9328de739d17e8864f1817710da2d217"}, + {file = "SQLAlchemy-1.4.48-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:ce7915eecc9c14a93b73f4e1c9d779ca43e955b43ddf1e21df154184f39748e5"}, + {file = "SQLAlchemy-1.4.48-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5381ddd09a99638f429f4cbe1b71b025bed318f6a7b23e11d65f3eed5e181c33"}, + {file = "SQLAlchemy-1.4.48-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:87609f6d4e81a941a17e61a4c19fee57f795e96f834c4f0a30cee725fc3f81d9"}, + {file = "SQLAlchemy-1.4.48-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb0808ad34167f394fea21bd4587fc62f3bd81bba232a1e7fbdfa17e6cfa7cd7"}, + {file = "SQLAlchemy-1.4.48-cp310-cp310-win32.whl", hash = "sha256:d53cd8bc582da5c1c8c86b6acc4ef42e20985c57d0ebc906445989df566c5603"}, + {file = "SQLAlchemy-1.4.48-cp310-cp310-win_amd64.whl", hash = "sha256:4355e5915844afdc5cf22ec29fba1010166e35dd94a21305f49020022167556b"}, + {file = "SQLAlchemy-1.4.48-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:066c2b0413e8cb980e6d46bf9d35ca83be81c20af688fedaef01450b06e4aa5e"}, + {file = "SQLAlchemy-1.4.48-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c99bf13e07140601d111a7c6f1fc1519914dd4e5228315bbda255e08412f61a4"}, + {file = "SQLAlchemy-1.4.48-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ee26276f12614d47cc07bc85490a70f559cba965fb178b1c45d46ffa8d73fda"}, + {file = "SQLAlchemy-1.4.48-cp311-cp311-win32.whl", hash = "sha256:49c312bcff4728bffc6fb5e5318b8020ed5c8b958a06800f91859fe9633ca20e"}, + {file = "SQLAlchemy-1.4.48-cp311-cp311-win_amd64.whl", hash = "sha256:cef2e2abc06eab187a533ec3e1067a71d7bbec69e582401afdf6d8cad4ba3515"}, + {file = "SQLAlchemy-1.4.48-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:3509159e050bd6d24189ec7af373359f07aed690db91909c131e5068176c5a5d"}, + {file = "SQLAlchemy-1.4.48-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fc2ab4d9f6d9218a5caa4121bdcf1125303482a1cdcfcdbd8567be8518969c0"}, + {file = "SQLAlchemy-1.4.48-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e1ddbbcef9bcedaa370c03771ebec7e39e3944782bef49e69430383c376a250b"}, + {file = "SQLAlchemy-1.4.48-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f82d8efea1ca92b24f51d3aea1a82897ed2409868a0af04247c8c1e4fef5890"}, + {file = "SQLAlchemy-1.4.48-cp36-cp36m-win32.whl", hash = "sha256:e3e98d4907805b07743b583a99ecc58bf8807ecb6985576d82d5e8ae103b5272"}, + {file = "SQLAlchemy-1.4.48-cp36-cp36m-win_amd64.whl", hash = "sha256:25887b4f716e085a1c5162f130b852f84e18d2633942c8ca40dfb8519367c14f"}, + {file = "SQLAlchemy-1.4.48-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:0817c181271b0ce5df1aa20949f0a9e2426830fed5ecdcc8db449618f12c2730"}, + {file = "SQLAlchemy-1.4.48-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe1dd2562313dd9fe1778ed56739ad5d9aae10f9f43d9f4cf81d65b0c85168bb"}, + {file = "SQLAlchemy-1.4.48-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:68413aead943883b341b2b77acd7a7fe2377c34d82e64d1840860247cec7ff7c"}, + {file = "SQLAlchemy-1.4.48-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fbde5642104ac6e95f96e8ad6d18d9382aa20672008cf26068fe36f3004491df"}, + {file = "SQLAlchemy-1.4.48-cp37-cp37m-win32.whl", hash = "sha256:11c6b1de720f816c22d6ad3bbfa2f026f89c7b78a5c4ffafb220e0183956a92a"}, + {file = "SQLAlchemy-1.4.48-cp37-cp37m-win_amd64.whl", hash = "sha256:eb5464ee8d4bb6549d368b578e9529d3c43265007193597ddca71c1bae6174e6"}, + {file = "SQLAlchemy-1.4.48-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:92e6133cf337c42bfee03ca08c62ba0f2d9695618c8abc14a564f47503157be9"}, + {file = "SQLAlchemy-1.4.48-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44d29a3fc6d9c45962476b470a81983dd8add6ad26fdbfae6d463b509d5adcda"}, + {file = "SQLAlchemy-1.4.48-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:005e942b451cad5285015481ae4e557ff4154dde327840ba91b9ac379be3b6ce"}, + {file = "SQLAlchemy-1.4.48-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c8cfe951ed074ba5e708ed29c45397a95c4143255b0d022c7c8331a75ae61f3"}, + {file = "SQLAlchemy-1.4.48-cp38-cp38-win32.whl", hash = "sha256:2b9af65cc58726129d8414fc1a1a650dcdd594ba12e9c97909f1f57d48e393d3"}, + {file = "SQLAlchemy-1.4.48-cp38-cp38-win_amd64.whl", hash = "sha256:2b562e9d1e59be7833edf28b0968f156683d57cabd2137d8121806f38a9d58f4"}, + {file = "SQLAlchemy-1.4.48-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:a1fc046756cf2a37d7277c93278566ddf8be135c6a58397b4c940abf837011f4"}, + {file = "SQLAlchemy-1.4.48-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d9b55252d2ca42a09bcd10a697fa041e696def9dfab0b78c0aaea1485551a08"}, + {file = "SQLAlchemy-1.4.48-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6dab89874e72a9ab5462997846d4c760cdb957958be27b03b49cf0de5e5c327c"}, + {file = "SQLAlchemy-1.4.48-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1fd8b5ee5a3acc4371f820934b36f8109ce604ee73cc668c724abb054cebcb6e"}, + {file = "SQLAlchemy-1.4.48-cp39-cp39-win32.whl", hash = "sha256:eee09350fd538e29cfe3a496ec6f148504d2da40dbf52adefb0d2f8e4d38ccc4"}, + {file = "SQLAlchemy-1.4.48-cp39-cp39-win_amd64.whl", hash = "sha256:7ad2b0f6520ed5038e795cc2852eb5c1f20fa6831d73301ced4aafbe3a10e1f6"}, + {file = "SQLAlchemy-1.4.48.tar.gz", hash = "sha256:b47bc287096d989a0838ce96f7d8e966914a24da877ed41a7531d44b55cdb8df"}, +] [package.dependencies] -greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} +greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and platform_machine == \"aarch64\" or python_version >= \"3\" and platform_machine == \"ppc64le\" or python_version >= \"3\" and platform_machine == \"x86_64\" or python_version >= \"3\" and platform_machine == \"amd64\" or python_version >= \"3\" and platform_machine == \"AMD64\" or python_version >= \"3\" and platform_machine == \"win32\" or python_version >= \"3\" and platform_machine == \"WIN32\""} [package.extras] aiomysql = ["aiomysql", "greenlet (!=0.4.17)"] -aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing-extensions (!=3.10.0.1)"] asyncio = ["greenlet (!=0.4.17)"] asyncmy = ["asyncmy (>=0.2.3,!=0.2.4)", "greenlet (!=0.4.17)"] mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2)"] @@ -837,22 +2234,26 @@ mssql-pyodbc = ["pyodbc"] mypy = ["mypy (>=0.910)", "sqlalchemy2-stubs"] mysql = ["mysqlclient (>=1.4.0)", "mysqlclient (>=1.4.0,<2)"] mysql-connector = ["mysql-connector-python"] -oracle = ["cx_oracle (>=7)", "cx_oracle (>=7,<8)"] +oracle = ["cx-oracle (>=7)", "cx-oracle (>=7,<8)"] postgresql = ["psycopg2 (>=2.7)"] postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] postgresql-pg8000 = ["pg8000 (>=1.16.6,!=1.29.0)"] postgresql-psycopg2binary = ["psycopg2-binary"] postgresql-psycopg2cffi = ["psycopg2cffi"] pymysql = ["pymysql", "pymysql (<1)"] -sqlcipher = ["sqlcipher3_binary"] +sqlcipher = ["sqlcipher3-binary"] [[package]] name = "stack-data" -version = "0.6.1" +version = "0.6.2" description = "Extract data from python stack frames and tracebacks for informative displays" category = "dev" optional = false python-versions = "*" +files = [ + {file = "stack_data-0.6.2-py3-none-any.whl", hash = "sha256:cbb2a53eb64e5785878201a97ed7c7b94883f48b87bfb0bbe8b623c74679e4a8"}, + {file = "stack_data-0.6.2.tar.gz", hash = "sha256:32d2dd0376772d01b6cb9fc996f3c8b57a357089dec328ed4b6553d037eaf815"}, +] [package.dependencies] asttokens = ">=2.1.0" @@ -864,17 +2265,21 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] [[package]] name = "starlette" -version = "0.20.4" +version = "0.25.0" description = "The little ASGI library that shines." category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "starlette-0.25.0-py3-none-any.whl", hash = "sha256:774f1df1983fd594b9b6fb3ded39c2aa1979d10ac45caac0f4255cbe2acb8628"}, + {file = "starlette-0.25.0.tar.gz", hash = "sha256:854c71e73736c429c2bdb07801f2c76c9cba497e7c3cf4988fde5e95fe4cdb3c"}, +] [package.dependencies] anyio = ">=3.4.0,<5" [package.extras] -full = ["itsdangerous", "jinja2", "python-multipart", "pyyaml", "requests"] +full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyaml"] [[package]] name = "text-unidecode" @@ -883,6 +2288,10 @@ description = "The most basic Text::Unidecode port" category = "main" optional = false python-versions = "*" +files = [ + {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, + {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, +] [[package]] name = "tokenize-rt" @@ -891,50 +2300,146 @@ description = "A wrapper around the stdlib `tokenize` which roundtrips." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "tokenize_rt-5.0.0-py2.py3-none-any.whl", hash = "sha256:c67772c662c6b3dc65edf66808577968fb10badfc2042e3027196bed4daf9e5a"}, + {file = "tokenize_rt-5.0.0.tar.gz", hash = "sha256:3160bc0c3e8491312d0485171dea861fc160a240f5f5766b72a1165408d10740"}, +] [[package]] name = "tornado" -version = "6.2" +version = "6.3.1" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." category = "dev" optional = false -python-versions = ">= 3.7" +python-versions = ">= 3.8" +files = [ + {file = "tornado-6.3.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:db181eb3df8738613ff0a26f49e1b394aade05034b01200a63e9662f347d4415"}, + {file = "tornado-6.3.1-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b4e7b956f9b5e6f9feb643ea04f07e7c6b49301e03e0023eedb01fa8cf52f579"}, + {file = "tornado-6.3.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9661aa8bc0e9d83d757cd95b6f6d1ece8ca9fd1ccdd34db2de381e25bf818233"}, + {file = "tornado-6.3.1-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:81c17e0cc396908a5e25dc8e9c5e4936e6dfd544c9290be48bd054c79bcad51e"}, + {file = "tornado-6.3.1-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a27a1cfa9997923f80bdd962b3aab048ac486ad8cfb2f237964f8ab7f7eb824b"}, + {file = "tornado-6.3.1-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:d7117f3c7ba5d05813b17a1f04efc8e108a1b811ccfddd9134cc68553c414864"}, + {file = "tornado-6.3.1-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:ffdce65a281fd708da5a9def3bfb8f364766847fa7ed806821a69094c9629e8a"}, + {file = "tornado-6.3.1-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:90f569a35a8ec19bde53aa596952071f445da678ec8596af763b9b9ce07605e6"}, + {file = "tornado-6.3.1-cp38-abi3-win32.whl", hash = "sha256:3455133b9ff262fd0a75630af0a8ee13564f25fb4fd3d9ce239b8a7d3d027bf8"}, + {file = "tornado-6.3.1-cp38-abi3-win_amd64.whl", hash = "sha256:1285f0691143f7ab97150831455d4db17a267b59649f7bd9700282cba3d5e771"}, + {file = "tornado-6.3.1.tar.gz", hash = "sha256:5e2f49ad371595957c50e42dd7e5c14d64a6843a3cf27352b69c706d1b5918af"}, +] [[package]] name = "traitlets" -version = "5.5.0" -description = "" +version = "5.9.0" +description = "Traitlets Python configuration system" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "traitlets-5.9.0-py3-none-any.whl", hash = "sha256:9e6ec080259b9a5940c797d58b613b5e31441c2257b87c2e795c5228ae80d2d8"}, + {file = "traitlets-5.9.0.tar.gz", hash = "sha256:f6cde21a9c68cf756af02035f72d5a723bf607e862e7be33ece505abf4a3bad9"}, +] [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["pre-commit", "pytest"] +test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"] [[package]] name = "typing-extensions" -version = "4.4.0" +version = "4.5.0" description = "Backported and Experimental Type Hints for Python 3.7+" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "typing_extensions-4.5.0-py3-none-any.whl", hash = "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4"}, + {file = "typing_extensions-4.5.0.tar.gz", hash = "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb"}, +] [[package]] name = "ujson" -version = "5.5.0" +version = "5.7.0" description = "Ultra fast JSON encoder and decoder for Python" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "ujson-5.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5eba5e69e4361ac3a311cf44fa71bc619361b6e0626768a494771aacd1c2f09b"}, + {file = "ujson-5.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aae4d9e1b4c7b61780f0a006c897a4a1904f862fdab1abb3ea8f45bd11aa58f3"}, + {file = "ujson-5.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2e43ccdba1cb5c6d3448eadf6fc0dae7be6c77e357a3abc968d1b44e265866d"}, + {file = "ujson-5.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54384ce4920a6d35fa9ea8e580bc6d359e3eb961fa7e43f46c78e3ed162d56ff"}, + {file = "ujson-5.7.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24ad1aa7fc4e4caa41d3d343512ce68e41411fb92adf7f434a4d4b3749dc8f58"}, + {file = "ujson-5.7.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:afff311e9f065a8f03c3753db7011bae7beb73a66189c7ea5fcb0456b7041ea4"}, + {file = "ujson-5.7.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6e80f0d03e7e8646fc3d79ed2d875cebd4c83846e129737fdc4c2532dbd43d9e"}, + {file = "ujson-5.7.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:137831d8a0db302fb6828ee21c67ad63ac537bddc4376e1aab1c8573756ee21c"}, + {file = "ujson-5.7.0-cp310-cp310-win32.whl", hash = "sha256:7df3fd35ebc14dafeea031038a99232b32f53fa4c3ecddb8bed132a43eefb8ad"}, + {file = "ujson-5.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:af4639f684f425177d09ae409c07602c4096a6287027469157bfb6f83e01448b"}, + {file = "ujson-5.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9b0f2680ce8a70f77f5d70aaf3f013d53e6af6d7058727a35d8ceb4a71cdd4e9"}, + {file = "ujson-5.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:67a19fd8e7d8cc58a169bea99fed5666023adf707a536d8f7b0a3c51dd498abf"}, + {file = "ujson-5.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6abb8e6d8f1ae72f0ed18287245f5b6d40094e2656d1eab6d99d666361514074"}, + {file = "ujson-5.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8cd622c069368d5074bd93817b31bdb02f8d818e57c29e206f10a1f9c6337dd"}, + {file = "ujson-5.7.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:14f9082669f90e18e64792b3fd0bf19f2b15e7fe467534a35ea4b53f3bf4b755"}, + {file = "ujson-5.7.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d7ff6ebb43bc81b057724e89550b13c9a30eda0f29c2f506f8b009895438f5a6"}, + {file = "ujson-5.7.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f7f241488879d91a136b299e0c4ce091996c684a53775e63bb442d1a8e9ae22a"}, + {file = "ujson-5.7.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5593263a7fcfb934107444bcfba9dde8145b282de0ee9f61e285e59a916dda0f"}, + {file = "ujson-5.7.0-cp311-cp311-win32.whl", hash = "sha256:26c2b32b489c393106e9cb68d0a02e1a7b9d05a07429d875c46b94ee8405bdb7"}, + {file = "ujson-5.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:ed24406454bb5a31df18f0a423ae14beb27b28cdfa34f6268e7ebddf23da807e"}, + {file = "ujson-5.7.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:18679484e3bf9926342b1c43a3bd640f93a9eeeba19ef3d21993af7b0c44785d"}, + {file = "ujson-5.7.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ee295761e1c6c30400641f0a20d381633d7622633cdf83a194f3c876a0e4b7e"}, + {file = "ujson-5.7.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b738282e12a05f400b291966630a98d622da0938caa4bc93cf65adb5f4281c60"}, + {file = "ujson-5.7.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00343501dbaa5172e78ef0e37f9ebd08040110e11c12420ff7c1f9f0332d939e"}, + {file = "ujson-5.7.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c0d1f7c3908357ee100aa64c4d1cf91edf99c40ac0069422a4fd5fd23b263263"}, + {file = "ujson-5.7.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a5d2f44331cf04689eafac7a6596c71d6657967c07ac700b0ae1c921178645da"}, + {file = "ujson-5.7.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:16b2254a77b310f118717715259a196662baa6b1f63b1a642d12ab1ff998c3d7"}, + {file = "ujson-5.7.0-cp37-cp37m-win32.whl", hash = "sha256:6faf46fa100b2b89e4db47206cf8a1ffb41542cdd34dde615b2fc2288954f194"}, + {file = "ujson-5.7.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ff0004c3f5a9a6574689a553d1b7819d1a496b4f005a7451f339dc2d9f4cf98c"}, + {file = "ujson-5.7.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:75204a1dd7ec6158c8db85a2f14a68d2143503f4bafb9a00b63fe09d35762a5e"}, + {file = "ujson-5.7.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7312731c7826e6c99cdd3ac503cd9acd300598e7a80bcf41f604fee5f49f566c"}, + {file = "ujson-5.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b9dc5a90e2149643df7f23634fe202fed5ebc787a2a1be95cf23632b4d90651"}, + {file = "ujson-5.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6a6961fc48821d84b1198a09516e396d56551e910d489692126e90bf4887d29"}, + {file = "ujson-5.7.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b01a9af52a0d5c46b2c68e3f258fdef2eacaa0ce6ae3e9eb97983f5b1166edb6"}, + {file = "ujson-5.7.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b7316d3edeba8a403686cdcad4af737b8415493101e7462a70ff73dd0609eafc"}, + {file = "ujson-5.7.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4ee997799a23227e2319a3f8817ce0b058923dbd31904761b788dc8f53bd3e30"}, + {file = "ujson-5.7.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:dda9aa4c33435147262cd2ea87c6b7a1ca83ba9b3933ff7df34e69fee9fced0c"}, + {file = "ujson-5.7.0-cp38-cp38-win32.whl", hash = "sha256:bea8d30e362180aafecabbdcbe0e1f0b32c9fa9e39c38e4af037b9d3ca36f50c"}, + {file = "ujson-5.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:c96e3b872bf883090ddf32cc41957edf819c5336ab0007d0cf3854e61841726d"}, + {file = "ujson-5.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6411aea4c94a8e93c2baac096fbf697af35ba2b2ed410b8b360b3c0957a952d3"}, + {file = "ujson-5.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3d3b3499c55911f70d4e074c626acdb79a56f54262c3c83325ffb210fb03e44d"}, + {file = "ujson-5.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:341f891d45dd3814d31764626c55d7ab3fd21af61fbc99d070e9c10c1190680b"}, + {file = "ujson-5.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f242eec917bafdc3f73a1021617db85f9958df80f267db69c76d766058f7b19"}, + {file = "ujson-5.7.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3af9f9f22a67a8c9466a32115d9073c72a33ae627b11de6f592df0ee09b98b6"}, + {file = "ujson-5.7.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4a3d794afbf134df3056a813e5c8a935208cddeae975bd4bc0ef7e89c52f0ce0"}, + {file = "ujson-5.7.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:800bf998e78dae655008dd10b22ca8dc93bdcfcc82f620d754a411592da4bbf2"}, + {file = "ujson-5.7.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b5ac3d5c5825e30b438ea92845380e812a476d6c2a1872b76026f2e9d8060fc2"}, + {file = "ujson-5.7.0-cp39-cp39-win32.whl", hash = "sha256:cd90027e6d93e8982f7d0d23acf88c896d18deff1903dd96140613389b25c0dd"}, + {file = "ujson-5.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:523ee146cdb2122bbd827f4dcc2a8e66607b3f665186bce9e4f78c9710b6d8ab"}, + {file = "ujson-5.7.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e87cec407ec004cf1b04c0ed7219a68c12860123dfb8902ef880d3d87a71c172"}, + {file = "ujson-5.7.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bab10165db6a7994e67001733f7f2caf3400b3e11538409d8756bc9b1c64f7e8"}, + {file = "ujson-5.7.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b522be14a28e6ac1cf818599aeff1004a28b42df4ed4d7bc819887b9dac915fc"}, + {file = "ujson-5.7.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7592f40175c723c032cdbe9fe5165b3b5903604f774ab0849363386e99e1f253"}, + {file = "ujson-5.7.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ed22f9665327a981f288a4f758a432824dc0314e4195a0eaeb0da56a477da94d"}, + {file = "ujson-5.7.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:adf445a49d9a97a5a4c9bb1d652a1528de09dd1c48b29f79f3d66cea9f826bf6"}, + {file = "ujson-5.7.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64772a53f3c4b6122ed930ae145184ebaed38534c60f3d859d8c3f00911eb122"}, + {file = "ujson-5.7.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35209cb2c13fcb9d76d249286105b4897b75a5e7f0efb0c0f4b90f222ce48910"}, + {file = "ujson-5.7.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:90712dfc775b2c7a07d4d8e059dd58636bd6ff1776d79857776152e693bddea6"}, + {file = "ujson-5.7.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:0e4e8981c6e7e9e637e637ad8ffe948a09e5434bc5f52ecbb82b4b4cfc092bfb"}, + {file = "ujson-5.7.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:581c945b811a3d67c27566539bfcb9705ea09cb27c4be0002f7a553c8886b817"}, + {file = "ujson-5.7.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d36a807a24c7d44f71686685ae6fbc8793d784bca1adf4c89f5f780b835b6243"}, + {file = "ujson-5.7.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b4257307e3662aa65e2644a277ca68783c5d51190ed9c49efebdd3cbfd5fa44"}, + {file = "ujson-5.7.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea7423d8a2f9e160c5e011119741682414c5b8dce4ae56590a966316a07a4618"}, + {file = "ujson-5.7.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4c592eb91a5968058a561d358d0fef59099ed152cfb3e1cd14eee51a7a93879e"}, + {file = "ujson-5.7.0.tar.gz", hash = "sha256:e788e5d5dcae8f6118ac9b45d0b891a0d55f7ac480eddcb7f07263f2bcf37b23"}, +] [[package]] name = "urllib3" -version = "1.26.12" +version = "1.26.15" description = "HTTP library with thread-safe connection pooling, file post, and more." category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, <4" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "urllib3-1.26.15-py2.py3-none-any.whl", hash = "sha256:aa751d169e23c7479ce47a0cb0da579e3ede798f994f5816a74e4f4500dcea42"}, + {file = "urllib3-1.26.15.tar.gz", hash = "sha256:8a388717b9476f934a21484e8c8e61875ab60644d29b9b39e11e4b9dc1c6b305"}, +] [package.extras] brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] @@ -943,25 +2448,29 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "uvicorn" -version = "0.18.3" +version = "0.22.0" description = "The lightning-fast ASGI server." category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "uvicorn-0.22.0-py3-none-any.whl", hash = "sha256:e9434d3bbf05f310e762147f769c9f21235ee118ba2d2bf1155a7196448bd996"}, + {file = "uvicorn-0.22.0.tar.gz", hash = "sha256:79277ae03db57ce7d9aa0567830bbb51d7a612f54d6e1e3e92da3ef24c2c8ed8"}, +] [package.dependencies] click = ">=7.0" colorama = {version = ">=0.4", optional = true, markers = "sys_platform == \"win32\" and extra == \"standard\""} h11 = ">=0.8" -httptools = {version = ">=0.4.0", optional = true, markers = "extra == \"standard\""} +httptools = {version = ">=0.5.0", optional = true, markers = "extra == \"standard\""} python-dotenv = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} pyyaml = {version = ">=5.1", optional = true, markers = "extra == \"standard\""} uvloop = {version = ">=0.14.0,<0.15.0 || >0.15.0,<0.15.1 || >0.15.1", optional = true, markers = "sys_platform != \"win32\" and sys_platform != \"cygwin\" and platform_python_implementation != \"PyPy\" and extra == \"standard\""} watchfiles = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} -websockets = {version = ">=10.0", optional = true, markers = "extra == \"standard\""} +websockets = {version = ">=10.4", optional = true, markers = "extra == \"standard\""} [package.extras] -standard = ["colorama (>=0.4)", "httptools (>=0.4.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.0)"] +standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] [[package]] name = "uvloop" @@ -970,1047 +2479,7 @@ description = "Fast implementation of asyncio event loop on top of libuv" category = "main" optional = false python-versions = ">=3.7" - -[package.extras] -dev = ["Cython (>=0.29.32,<0.30.0)", "Sphinx (>=4.1.2,<4.2.0)", "aiohttp", "flake8 (>=3.9.2,<3.10.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=22.0.0,<22.1.0)", "pycodestyle (>=2.7.0,<2.8.0)", "pytest (>=3.6.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] -docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] -test = ["Cython (>=0.29.32,<0.30.0)", "aiohttp", "flake8 (>=3.9.2,<3.10.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=22.0.0,<22.1.0)", "pycodestyle (>=2.7.0,<2.8.0)"] - -[[package]] -name = "watchfiles" -version = "0.18.1" -description = "Simple, modern and high performance file watching and code reload in python." -category = "main" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -anyio = ">=3.0.0" - -[[package]] -name = "wcwidth" -version = "0.2.5" -description = "Measures the displayed width of unicode strings in a terminal" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "websockets" -version = "10.4" -description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" -category = "main" -optional = false -python-versions = ">=3.7" - -[metadata] -lock-version = "1.1" -python-versions = "^3.11" -content-hash = "9d35694fa276fc3f8c0e4758f00c8f1176a84e9efe8cfde401f121b9f4c72384" - -[metadata.files] -alembic = [ - {file = "alembic-1.8.1-py3-none-any.whl", hash = "sha256:0a024d7f2de88d738d7395ff866997314c837be6104e90c5724350313dee4da4"}, - {file = "alembic-1.8.1.tar.gz", hash = "sha256:cd0b5e45b14b706426b833f06369b9a6d5ee03f826ec3238723ce8caaf6e5ffa"}, -] -anyio = [ - {file = "anyio-3.6.2-py3-none-any.whl", hash = "sha256:fbbe32bd270d2a2ef3ed1c5d45041250284e31fc0a4df4a5a6071842051a51e3"}, - {file = "anyio-3.6.2.tar.gz", hash = "sha256:25ea0d673ae30af41a0c442f81cf3b38c7e79fdc7b60335a4c14e05eb0947421"}, -] -appnope = [ - {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, - {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, -] -asttokens = [ - {file = "asttokens-2.1.0-py2.py3-none-any.whl", hash = "sha256:1b28ed85e254b724439afc783d4bee767f780b936c3fe8b3275332f42cf5f561"}, - {file = "asttokens-2.1.0.tar.gz", hash = "sha256:4aa76401a151c8cc572d906aad7aea2a841780834a19d780f4321c0fe1b54635"}, -] -backcall = [ - {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, - {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, -] -black = [ - {file = "black-22.10.0-1fixedarch-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:5cc42ca67989e9c3cf859e84c2bf014f6633db63d1cbdf8fdb666dcd9e77e3fa"}, - {file = "black-22.10.0-1fixedarch-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:5d8f74030e67087b219b032aa33a919fae8806d49c867846bfacde57f43972ef"}, - {file = "black-22.10.0-1fixedarch-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:197df8509263b0b8614e1df1756b1dd41be6738eed2ba9e9769f3880c2b9d7b6"}, - {file = "black-22.10.0-1fixedarch-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:2644b5d63633702bc2c5f3754b1b475378fbbfb481f62319388235d0cd104c2d"}, - {file = "black-22.10.0-1fixedarch-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:e41a86c6c650bcecc6633ee3180d80a025db041a8e2398dcc059b3afa8382cd4"}, - {file = "black-22.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2039230db3c6c639bd84efe3292ec7b06e9214a2992cd9beb293d639c6402edb"}, - {file = "black-22.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14ff67aec0a47c424bc99b71005202045dc09270da44a27848d534600ac64fc7"}, - {file = "black-22.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:819dc789f4498ecc91438a7de64427c73b45035e2e3680c92e18795a839ebb66"}, - {file = "black-22.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5b9b29da4f564ba8787c119f37d174f2b69cdfdf9015b7d8c5c16121ddc054ae"}, - {file = "black-22.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b49776299fece66bffaafe357d929ca9451450f5466e997a7285ab0fe28e3b"}, - {file = "black-22.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:21199526696b8f09c3997e2b4db8d0b108d801a348414264d2eb8eb2532e540d"}, - {file = "black-22.10.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e464456d24e23d11fced2bc8c47ef66d471f845c7b7a42f3bd77bf3d1789650"}, - {file = "black-22.10.0-cp37-cp37m-win_amd64.whl", hash = "sha256:9311e99228ae10023300ecac05be5a296f60d2fd10fff31cf5c1fa4ca4b1988d"}, - {file = "black-22.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fba8a281e570adafb79f7755ac8721b6cf1bbf691186a287e990c7929c7692ff"}, - {file = "black-22.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:915ace4ff03fdfff953962fa672d44be269deb2eaf88499a0f8805221bc68c87"}, - {file = "black-22.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:444ebfb4e441254e87bad00c661fe32df9969b2bf224373a448d8aca2132b395"}, - {file = "black-22.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:974308c58d057a651d182208a484ce80a26dac0caef2895836a92dd6ebd725e0"}, - {file = "black-22.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72ef3925f30e12a184889aac03d77d031056860ccae8a1e519f6cbb742736383"}, - {file = "black-22.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:432247333090c8c5366e69627ccb363bc58514ae3e63f7fc75c54b1ea80fa7de"}, - {file = "black-22.10.0-py3-none-any.whl", hash = "sha256:c957b2b4ea88587b46cf49d1dc17681c1e672864fd7af32fc1e9664d572b3458"}, - {file = "black-22.10.0.tar.gz", hash = "sha256:f513588da599943e0cde4e32cc9879e825d58720d6557062d1098c5ad80080e1"}, -] -certifi = [ - {file = "certifi-2022.9.24-py3-none-any.whl", hash = "sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382"}, - {file = "certifi-2022.9.24.tar.gz", hash = "sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14"}, -] -cffi = [ - {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, - {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, - {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, - {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, - {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, - {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, - {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, - {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, - {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, - {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, - {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, - {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, - {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, - {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, - {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, - {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, - {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, - {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, - {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, -] -charset-normalizer = [ - {file = "charset-normalizer-2.1.1.tar.gz", hash = "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845"}, - {file = "charset_normalizer-2.1.1-py3-none-any.whl", hash = "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"}, -] -click = [ - {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, - {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, -] -colorama = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] -debugpy = [ - {file = "debugpy-1.6.3-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:c4b2bd5c245eeb49824bf7e539f95fb17f9a756186e51c3e513e32999d8846f3"}, - {file = "debugpy-1.6.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b8deaeb779699350deeed835322730a3efec170b88927debc9ba07a1a38e2585"}, - {file = "debugpy-1.6.3-cp310-cp310-win32.whl", hash = "sha256:fc233a0160f3b117b20216f1169e7211b83235e3cd6749bcdd8dbb72177030c7"}, - {file = "debugpy-1.6.3-cp310-cp310-win_amd64.whl", hash = "sha256:dda8652520eae3945833e061cbe2993ad94a0b545aebd62e4e6b80ee616c76b2"}, - {file = "debugpy-1.6.3-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:d5c814596a170a0a58fa6fad74947e30bfd7e192a5d2d7bd6a12156c2899e13a"}, - {file = "debugpy-1.6.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c4cd6f37e3c168080d61d698390dfe2cd9e74ebf80b448069822a15dadcda57d"}, - {file = "debugpy-1.6.3-cp37-cp37m-win32.whl", hash = "sha256:3c9f985944a30cfc9ae4306ac6a27b9c31dba72ca943214dad4a0ab3840f6161"}, - {file = "debugpy-1.6.3-cp37-cp37m-win_amd64.whl", hash = "sha256:5ad571a36cec137ae6ed951d0ff75b5e092e9af6683da084753231150cbc5b25"}, - {file = "debugpy-1.6.3-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:adcfea5ea06d55d505375995e150c06445e2b20cd12885bcae566148c076636b"}, - {file = "debugpy-1.6.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:daadab4403427abd090eccb38d8901afd8b393e01fd243048fab3f1d7132abb4"}, - {file = "debugpy-1.6.3-cp38-cp38-win32.whl", hash = "sha256:6efc30325b68e451118b795eff6fe8488253ca3958251d5158106d9c87581bc6"}, - {file = "debugpy-1.6.3-cp38-cp38-win_amd64.whl", hash = "sha256:86d784b72c5411c833af1cd45b83d80c252b77c3bfdb43db17c441d772f4c734"}, - {file = "debugpy-1.6.3-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:4e255982552b0edfe3a6264438dbd62d404baa6556a81a88f9420d3ed79b06ae"}, - {file = "debugpy-1.6.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cca23cb6161ac89698d629d892520327dd1be9321c0960e610bbcb807232b45d"}, - {file = "debugpy-1.6.3-cp39-cp39-win32.whl", hash = "sha256:7c302095a81be0d5c19f6529b600bac971440db3e226dce85347cc27e6a61908"}, - {file = "debugpy-1.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:34d2cdd3a7c87302ba5322b86e79c32c2115be396f3f09ca13306d8a04fe0f16"}, - {file = "debugpy-1.6.3-py2.py3-none-any.whl", hash = "sha256:84c39940a0cac410bf6aa4db00ba174f973eef521fbe9dd058e26bcabad89c4f"}, - {file = "debugpy-1.6.3.zip", hash = "sha256:e8922090514a890eec99cfb991bab872dd2e353ebb793164d5f01c362b9a40bf"}, -] -decorator = [ - {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, - {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, -] -dnspython = [ - {file = "dnspython-2.2.1-py3-none-any.whl", hash = "sha256:a851e51367fb93e9e1361732c1d60dab63eff98712e503ea7d92e6eccb109b4f"}, - {file = "dnspython-2.2.1.tar.gz", hash = "sha256:0f7569a4a6ff151958b64304071d370daa3243d15941a7beedf0c9fe5105603e"}, -] -email-validator = [ - {file = "email_validator-1.3.0-py2.py3-none-any.whl", hash = "sha256:816073f2a7cffef786b29928f58ec16cdac42710a53bb18aa94317e3e145ec5c"}, - {file = "email_validator-1.3.0.tar.gz", hash = "sha256:553a66f8be2ec2dea641ae1d3f29017ab89e9d603d4a25cdaac39eefa283d769"}, -] -entrypoints = [ - {file = "entrypoints-0.4-py3-none-any.whl", hash = "sha256:f174b5ff827504fd3cd97cc3f8649f3693f51538c7e4bdf3ef002c8429d42f9f"}, - {file = "entrypoints-0.4.tar.gz", hash = "sha256:b706eddaa9218a19ebcd67b56818f05bb27589b1ca9e8d797b74affad4ccacd4"}, -] -et-xmlfile = [ - {file = "et_xmlfile-1.1.0-py3-none-any.whl", hash = "sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada"}, - {file = "et_xmlfile-1.1.0.tar.gz", hash = "sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c"}, -] -executing = [ - {file = "executing-1.2.0-py2.py3-none-any.whl", hash = "sha256:0314a69e37426e3608aada02473b4161d4caf5a4b244d1d0c48072b8fee7bacc"}, - {file = "executing-1.2.0.tar.gz", hash = "sha256:19da64c18d2d851112f09c287f8d3dbbdf725ab0e569077efb6cdcbd3497c107"}, -] -fastapi = [ - {file = "fastapi-0.85.2-py3-none-any.whl", hash = "sha256:6292db0edd4a11f0d938d6033ccec5f706e9d476958bf33b119e8ddb4e524bde"}, - {file = "fastapi-0.85.2.tar.gz", hash = "sha256:3e10ea0992c700e0b17b6de8c2092d7b9cd763ce92c49ee8d4be10fee3b2f367"}, -] -flake8 = [ - {file = "flake8-5.0.4-py2.py3-none-any.whl", hash = "sha256:7a1cf6b73744f5806ab95e526f6f0d8c01c66d7bbe349562d22dfca20610b248"}, - {file = "flake8-5.0.4.tar.gz", hash = "sha256:6fbe320aad8d6b95cec8b8e47bc933004678dc63095be98528b7bdd2a9f510db"}, -] -greenlet = [ - {file = "greenlet-2.0.1-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:9ed358312e63bf683b9ef22c8e442ef6c5c02973f0c2a939ec1d7b50c974015c"}, - {file = "greenlet-2.0.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:4f09b0010e55bec3239278f642a8a506b91034f03a4fb28289a7d448a67f1515"}, - {file = "greenlet-2.0.1-cp27-cp27m-win32.whl", hash = "sha256:1407fe45246632d0ffb7a3f4a520ba4e6051fc2cbd61ba1f806900c27f47706a"}, - {file = "greenlet-2.0.1-cp27-cp27m-win_amd64.whl", hash = "sha256:3001d00eba6bbf084ae60ec7f4bb8ed375748f53aeaefaf2a37d9f0370558524"}, - {file = "greenlet-2.0.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d566b82e92ff2e09dd6342df7e0eb4ff6275a3f08db284888dcd98134dbd4243"}, - {file = "greenlet-2.0.1-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:0722c9be0797f544a3ed212569ca3fe3d9d1a1b13942d10dd6f0e8601e484d26"}, - {file = "greenlet-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d37990425b4687ade27810e3b1a1c37825d242ebc275066cfee8cb6b8829ccd"}, - {file = "greenlet-2.0.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be35822f35f99dcc48152c9839d0171a06186f2d71ef76dc57fa556cc9bf6b45"}, - {file = "greenlet-2.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c140e7eb5ce47249668056edf3b7e9900c6a2e22fb0eaf0513f18a1b2c14e1da"}, - {file = "greenlet-2.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d21681f09e297a5adaa73060737e3aa1279a13ecdcfcc6ef66c292cb25125b2d"}, - {file = "greenlet-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fb412b7db83fe56847df9c47b6fe3f13911b06339c2aa02dcc09dce8bbf582cd"}, - {file = "greenlet-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:c6a08799e9e88052221adca55741bf106ec7ea0710bca635c208b751f0d5b617"}, - {file = "greenlet-2.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9e112e03d37987d7b90c1e98ba5e1b59e1645226d78d73282f45b326f7bddcb9"}, - {file = "greenlet-2.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56961cfca7da2fdd178f95ca407fa330c64f33289e1804b592a77d5593d9bd94"}, - {file = "greenlet-2.0.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:13ba6e8e326e2116c954074c994da14954982ba2795aebb881c07ac5d093a58a"}, - {file = "greenlet-2.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bf633a50cc93ed17e494015897361010fc08700d92676c87931d3ea464123ce"}, - {file = "greenlet-2.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9f2c221eecb7ead00b8e3ddb913c67f75cba078fd1d326053225a3f59d850d72"}, - {file = "greenlet-2.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:13ebf93c343dd8bd010cd98e617cb4c1c1f352a0cf2524c82d3814154116aa82"}, - {file = "greenlet-2.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:6f61d71bbc9b4a3de768371b210d906726535d6ca43506737682caa754b956cd"}, - {file = "greenlet-2.0.1-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:2d0bac0385d2b43a7bd1d651621a4e0f1380abc63d6fb1012213a401cbd5bf8f"}, - {file = "greenlet-2.0.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:f6327b6907b4cb72f650a5b7b1be23a2aab395017aa6f1adb13069d66360eb3f"}, - {file = "greenlet-2.0.1-cp35-cp35m-win32.whl", hash = "sha256:81b0ea3715bf6a848d6f7149d25bf018fd24554a4be01fcbbe3fdc78e890b955"}, - {file = "greenlet-2.0.1-cp35-cp35m-win_amd64.whl", hash = "sha256:38255a3f1e8942573b067510f9611fc9e38196077b0c8eb7a8c795e105f9ce77"}, - {file = "greenlet-2.0.1-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:04957dc96669be041e0c260964cfef4c77287f07c40452e61abe19d647505581"}, - {file = "greenlet-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:4aeaebcd91d9fee9aa768c1b39cb12214b30bf36d2b7370505a9f2165fedd8d9"}, - {file = "greenlet-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:974a39bdb8c90a85982cdb78a103a32e0b1be986d411303064b28a80611f6e51"}, - {file = "greenlet-2.0.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8dca09dedf1bd8684767bc736cc20c97c29bc0c04c413e3276e0962cd7aeb148"}, - {file = "greenlet-2.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4c0757db9bd08470ff8277791795e70d0bf035a011a528ee9a5ce9454b6cba2"}, - {file = "greenlet-2.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:5067920de254f1a2dee8d3d9d7e4e03718e8fd2d2d9db962c8c9fa781ae82a39"}, - {file = "greenlet-2.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:5a8e05057fab2a365c81abc696cb753da7549d20266e8511eb6c9d9f72fe3e92"}, - {file = "greenlet-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:3d75b8d013086b08e801fbbb896f7d5c9e6ccd44f13a9241d2bf7c0df9eda928"}, - {file = "greenlet-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:097e3dae69321e9100202fc62977f687454cd0ea147d0fd5a766e57450c569fd"}, - {file = "greenlet-2.0.1-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:cb242fc2cda5a307a7698c93173d3627a2a90d00507bccf5bc228851e8304963"}, - {file = "greenlet-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:72b00a8e7c25dcea5946692a2485b1a0c0661ed93ecfedfa9b6687bd89a24ef5"}, - {file = "greenlet-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5b0ff9878333823226d270417f24f4d06f235cb3e54d1103b71ea537a6a86ce"}, - {file = "greenlet-2.0.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be9e0fb2ada7e5124f5282d6381903183ecc73ea019568d6d63d33f25b2a9000"}, - {file = "greenlet-2.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b493db84d124805865adc587532ebad30efa68f79ad68f11b336e0a51ec86c2"}, - {file = "greenlet-2.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0459d94f73265744fee4c2d5ec44c6f34aa8a31017e6e9de770f7bcf29710be9"}, - {file = "greenlet-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a20d33124935d27b80e6fdacbd34205732660e0a1d35d8b10b3328179a2b51a1"}, - {file = "greenlet-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:ea688d11707d30e212e0110a1aac7f7f3f542a259235d396f88be68b649e47d1"}, - {file = "greenlet-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:afe07421c969e259e9403c3bb658968702bc3b78ec0b6fde3ae1e73440529c23"}, - {file = "greenlet-2.0.1-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:cd4ccc364cf75d1422e66e247e52a93da6a9b73cefa8cad696f3cbbb75af179d"}, - {file = "greenlet-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:4c8b1c43e75c42a6cafcc71defa9e01ead39ae80bd733a2608b297412beede68"}, - {file = "greenlet-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:659f167f419a4609bc0516fb18ea69ed39dbb25594934bd2dd4d0401660e8a1e"}, - {file = "greenlet-2.0.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:356e4519d4dfa766d50ecc498544b44c0249b6de66426041d7f8b751de4d6b48"}, - {file = "greenlet-2.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:811e1d37d60b47cb8126e0a929b58c046251f28117cb16fcd371eed61f66b764"}, - {file = "greenlet-2.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d38ffd0e81ba8ef347d2be0772e899c289b59ff150ebbbbe05dc61b1246eb4e0"}, - {file = "greenlet-2.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0109af1138afbfb8ae647e31a2b1ab030f58b21dd8528c27beaeb0093b7938a9"}, - {file = "greenlet-2.0.1-cp38-cp38-win32.whl", hash = "sha256:88c8d517e78acdf7df8a2134a3c4b964415b575d2840a2746ddb1cc6175f8608"}, - {file = "greenlet-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:d6ee1aa7ab36475035eb48c01efae87d37936a8173fc4d7b10bb02c2d75dd8f6"}, - {file = "greenlet-2.0.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:b1992ba9d4780d9af9726bbcef6a1db12d9ab1ccc35e5773685a24b7fb2758eb"}, - {file = "greenlet-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:b5e83e4de81dcc9425598d9469a624826a0b1211380ac444c7c791d4a2137c19"}, - {file = "greenlet-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:505138d4fa69462447a562a7c2ef723c6025ba12ac04478bc1ce2fcc279a2db5"}, - {file = "greenlet-2.0.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cce1e90dd302f45716a7715517c6aa0468af0bf38e814ad4eab58e88fc09f7f7"}, - {file = "greenlet-2.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e9744c657d896c7b580455e739899e492a4a452e2dd4d2b3e459f6b244a638d"}, - {file = "greenlet-2.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:662e8f7cad915ba75d8017b3e601afc01ef20deeeabf281bd00369de196d7726"}, - {file = "greenlet-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:41b825d65f31e394b523c84db84f9383a2f7eefc13d987f308f4663794d2687e"}, - {file = "greenlet-2.0.1-cp39-cp39-win32.whl", hash = "sha256:db38f80540083ea33bdab614a9d28bcec4b54daa5aff1668d7827a9fc769ae0a"}, - {file = "greenlet-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:b23d2a46d53210b498e5b701a1913697671988f4bf8e10f935433f6e7c332fb6"}, - {file = "greenlet-2.0.1.tar.gz", hash = "sha256:42e602564460da0e8ee67cb6d7236363ee5e131aa15943b6670e44e5c2ed0f67"}, -] -h11 = [ - {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, - {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, -] -httptools = [ - {file = "httptools-0.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8f470c79061599a126d74385623ff4744c4e0f4a0997a353a44923c0b561ee51"}, - {file = "httptools-0.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e90491a4d77d0cb82e0e7a9cb35d86284c677402e4ce7ba6b448ccc7325c5421"}, - {file = "httptools-0.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1d2357f791b12d86faced7b5736dea9ef4f5ecdc6c3f253e445ee82da579449"}, - {file = "httptools-0.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f90cd6fd97c9a1b7fe9215e60c3bd97336742a0857f00a4cb31547bc22560c2"}, - {file = "httptools-0.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5230a99e724a1bdbbf236a1b58d6e8504b912b0552721c7c6b8570925ee0ccde"}, - {file = "httptools-0.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3a47a34f6015dd52c9eb629c0f5a8a5193e47bf2a12d9a3194d231eaf1bc451a"}, - {file = "httptools-0.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:24bb4bb8ac3882f90aa95403a1cb48465de877e2d5298ad6ddcfdebec060787d"}, - {file = "httptools-0.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e67d4f8734f8054d2c4858570cc4b233bf753f56e85217de4dfb2495904cf02e"}, - {file = "httptools-0.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7e5eefc58d20e4c2da82c78d91b2906f1a947ef42bd668db05f4ab4201a99f49"}, - {file = "httptools-0.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0297822cea9f90a38df29f48e40b42ac3d48a28637368f3ec6d15eebefd182f9"}, - {file = "httptools-0.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:557be7fbf2bfa4a2ec65192c254e151684545ebab45eca5d50477d562c40f986"}, - {file = "httptools-0.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:54465401dbbec9a6a42cf737627fb0f014d50dc7365a6b6cd57753f151a86ff0"}, - {file = "httptools-0.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4d9ebac23d2de960726ce45f49d70eb5466725c0087a078866043dad115f850f"}, - {file = "httptools-0.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:e8a34e4c0ab7b1ca17b8763613783e2458e77938092c18ac919420ab8655c8c1"}, - {file = "httptools-0.5.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f659d7a48401158c59933904040085c200b4be631cb5f23a7d561fbae593ec1f"}, - {file = "httptools-0.5.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef1616b3ba965cd68e6f759eeb5d34fbf596a79e84215eeceebf34ba3f61fdc7"}, - {file = "httptools-0.5.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3625a55886257755cb15194efbf209584754e31d336e09e2ffe0685a76cb4b60"}, - {file = "httptools-0.5.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:72ad589ba5e4a87e1d404cc1cb1b5780bfcb16e2aec957b88ce15fe879cc08ca"}, - {file = "httptools-0.5.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:850fec36c48df5a790aa735417dca8ce7d4b48d59b3ebd6f83e88a8125cde324"}, - {file = "httptools-0.5.0-cp36-cp36m-win_amd64.whl", hash = "sha256:f222e1e9d3f13b68ff8a835574eda02e67277d51631d69d7cf7f8e07df678c86"}, - {file = "httptools-0.5.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3cb8acf8f951363b617a8420768a9f249099b92e703c052f9a51b66342eea89b"}, - {file = "httptools-0.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:550059885dc9c19a072ca6d6735739d879be3b5959ec218ba3e013fd2255a11b"}, - {file = "httptools-0.5.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a04fe458a4597aa559b79c7f48fe3dceabef0f69f562daf5c5e926b153817281"}, - {file = "httptools-0.5.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7d0c1044bce274ec6711f0770fd2d5544fe392591d204c68328e60a46f88843b"}, - {file = "httptools-0.5.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c6eeefd4435055a8ebb6c5cc36111b8591c192c56a95b45fe2af22d9881eee25"}, - {file = "httptools-0.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:5b65be160adcd9de7a7e6413a4966665756e263f0d5ddeffde277ffeee0576a5"}, - {file = "httptools-0.5.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fe9c766a0c35b7e3d6b6939393c8dfdd5da3ac5dec7f971ec9134f284c6c36d6"}, - {file = "httptools-0.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:85b392aba273566c3d5596a0a490978c085b79700814fb22bfd537d381dd230c"}, - {file = "httptools-0.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5e3088f4ed33947e16fd865b8200f9cfae1144f41b64a8cf19b599508e096bc"}, - {file = "httptools-0.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c2a56b6aad7cc8f5551d8e04ff5a319d203f9d870398b94702300de50190f63"}, - {file = "httptools-0.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9b571b281a19762adb3f48a7731f6842f920fa71108aff9be49888320ac3e24d"}, - {file = "httptools-0.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa47ffcf70ba6f7848349b8a6f9b481ee0f7637931d91a9860a1838bfc586901"}, - {file = "httptools-0.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:bede7ee075e54b9a5bde695b4fc8f569f30185891796b2e4e09e2226801d09bd"}, - {file = "httptools-0.5.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:64eba6f168803a7469866a9c9b5263a7463fa8b7a25b35e547492aa7322036b6"}, - {file = "httptools-0.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4b098e4bb1174096a93f48f6193e7d9aa7071506a5877da09a783509ca5fff42"}, - {file = "httptools-0.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9423a2de923820c7e82e18980b937893f4aa8251c43684fa1772e341f6e06887"}, - {file = "httptools-0.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca1b7becf7d9d3ccdbb2f038f665c0f4857e08e1d8481cbcc1a86a0afcfb62b2"}, - {file = "httptools-0.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:50d4613025f15f4b11f1c54bbed4761c0020f7f921b95143ad6d58c151198142"}, - {file = "httptools-0.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8ffce9d81c825ac1deaa13bc9694c0562e2840a48ba21cfc9f3b4c922c16f372"}, - {file = "httptools-0.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:1af91b3650ce518d226466f30bbba5b6376dbd3ddb1b2be8b0658c6799dd450b"}, - {file = "httptools-0.5.0.tar.gz", hash = "sha256:295874861c173f9101960bba332429bb77ed4dcd8cdf5cee9922eb00e4f6bc09"}, -] -idna = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, -] -ipykernel = [ - {file = "ipykernel-6.17.1-py3-none-any.whl", hash = "sha256:3a9a1b2ad6dbbd5879855aabb4557f08e63fa2208bffed897f03070e2bb436f6"}, - {file = "ipykernel-6.17.1.tar.gz", hash = "sha256:e178c1788399f93a459c241fe07c3b810771c607b1fb064a99d2c5d40c90c5d4"}, -] -ipython = [ - {file = "ipython-8.6.0-py3-none-any.whl", hash = "sha256:91ef03016bcf72dd17190f863476e7c799c6126ec7e8be97719d1bc9a78a59a4"}, - {file = "ipython-8.6.0.tar.gz", hash = "sha256:7c959e3dedbf7ed81f9b9d8833df252c430610e2a4a6464ec13cd20975ce20a5"}, -] -itsdangerous = [ - {file = "itsdangerous-2.1.2-py3-none-any.whl", hash = "sha256:2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44"}, - {file = "itsdangerous-2.1.2.tar.gz", hash = "sha256:5dbbc68b317e5e42f327f9021763545dc3fc3bfe22e6deb96aaf1fc38874156a"}, -] -jedi = [ - {file = "jedi-0.18.1-py2.py3-none-any.whl", hash = "sha256:637c9635fcf47945ceb91cd7f320234a7be540ded6f3e99a50cb6febdfd1ba8d"}, - {file = "jedi-0.18.1.tar.gz", hash = "sha256:74137626a64a99c8eb6ae5832d99b3bdd7d29a3850fe2aa80a4126b2a7d949ab"}, -] -jinja2 = [ - {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, - {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, -] -jupyter-client = [ - {file = "jupyter_client-7.4.7-py3-none-any.whl", hash = "sha256:df56ae23b8e1da1b66f89dee1368e948b24a7f780fa822c5735187589fc4c157"}, - {file = "jupyter_client-7.4.7.tar.gz", hash = "sha256:330f6b627e0b4bf2f54a3a0dd9e4a22d2b649c8518168afedce2c96a1ceb2860"}, -] -jupyter-core = [ - {file = "jupyter_core-5.0.0-py3-none-any.whl", hash = "sha256:6da1fae48190da8551e1b5dbbb19d51d00b079d59a073c7030407ecaf96dbb1e"}, - {file = "jupyter_core-5.0.0.tar.gz", hash = "sha256:4ed68b7c606197c7e344a24b7195eef57898157075a69655a886074b6beb7043"}, -] -mako = [ - {file = "Mako-1.2.4-py3-none-any.whl", hash = "sha256:c97c79c018b9165ac9922ae4f32da095ffd3c4e6872b45eded42926deea46818"}, - {file = "Mako-1.2.4.tar.gz", hash = "sha256:d60a3903dc3bb01a18ad6a89cdbe2e4eadc69c0bc8ef1e3773ba53d44c3f7a34"}, -] -markupsafe = [ - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, - {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, -] -matplotlib-inline = [ - {file = "matplotlib-inline-0.1.6.tar.gz", hash = "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"}, - {file = "matplotlib_inline-0.1.6-py3-none-any.whl", hash = "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311"}, -] -mccabe = [ - {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, - {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, -] -mypy-extensions = [ - {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, - {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, -] -nest-asyncio = [ - {file = "nest_asyncio-1.5.6-py3-none-any.whl", hash = "sha256:b9a953fb40dceaa587d109609098db21900182b16440652454a146cffb06e8b8"}, - {file = "nest_asyncio-1.5.6.tar.gz", hash = "sha256:d267cc1ff794403f7df692964d1d2a3fa9418ffea2a3f6859a439ff482fef290"}, -] -numpy = [ - {file = "numpy-1.23.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9c88793f78fca17da0145455f0d7826bcb9f37da4764af27ac945488116efe63"}, - {file = "numpy-1.23.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e9f4c4e51567b616be64e05d517c79a8a22f3606499941d97bb76f2ca59f982d"}, - {file = "numpy-1.23.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7903ba8ab592b82014713c491f6c5d3a1cde5b4a3bf116404e08f5b52f6daf43"}, - {file = "numpy-1.23.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e05b1c973a9f858c74367553e236f287e749465f773328c8ef31abe18f691e1"}, - {file = "numpy-1.23.5-cp310-cp310-win32.whl", hash = "sha256:522e26bbf6377e4d76403826ed689c295b0b238f46c28a7251ab94716da0b280"}, - {file = "numpy-1.23.5-cp310-cp310-win_amd64.whl", hash = "sha256:dbee87b469018961d1ad79b1a5d50c0ae850000b639bcb1b694e9981083243b6"}, - {file = "numpy-1.23.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ce571367b6dfe60af04e04a1834ca2dc5f46004ac1cc756fb95319f64c095a96"}, - {file = "numpy-1.23.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56e454c7833e94ec9769fa0f86e6ff8e42ee38ce0ce1fa4cbb747ea7e06d56aa"}, - {file = "numpy-1.23.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5039f55555e1eab31124a5768898c9e22c25a65c1e0037f4d7c495a45778c9f2"}, - {file = "numpy-1.23.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58f545efd1108e647604a1b5aa809591ccd2540f468a880bedb97247e72db387"}, - {file = "numpy-1.23.5-cp311-cp311-win32.whl", hash = "sha256:b2a9ab7c279c91974f756c84c365a669a887efa287365a8e2c418f8b3ba73fb0"}, - {file = "numpy-1.23.5-cp311-cp311-win_amd64.whl", hash = "sha256:0cbe9848fad08baf71de1a39e12d1b6310f1d5b2d0ea4de051058e6e1076852d"}, - {file = "numpy-1.23.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f063b69b090c9d918f9df0a12116029e274daf0181df392839661c4c7ec9018a"}, - {file = "numpy-1.23.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0aaee12d8883552fadfc41e96b4c82ee7d794949e2a7c3b3a7201e968c7ecab9"}, - {file = "numpy-1.23.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92c8c1e89a1f5028a4c6d9e3ccbe311b6ba53694811269b992c0b224269e2398"}, - {file = "numpy-1.23.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d208a0f8729f3fb790ed18a003f3a57895b989b40ea4dce4717e9cf4af62c6bb"}, - {file = "numpy-1.23.5-cp38-cp38-win32.whl", hash = "sha256:06005a2ef6014e9956c09ba07654f9837d9e26696a0470e42beedadb78c11b07"}, - {file = "numpy-1.23.5-cp38-cp38-win_amd64.whl", hash = "sha256:ca51fcfcc5f9354c45f400059e88bc09215fb71a48d3768fb80e357f3b457e1e"}, - {file = "numpy-1.23.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8969bfd28e85c81f3f94eb4a66bc2cf1dbdc5c18efc320af34bffc54d6b1e38f"}, - {file = "numpy-1.23.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a7ac231a08bb37f852849bbb387a20a57574a97cfc7b6cabb488a4fc8be176de"}, - {file = "numpy-1.23.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf837dc63ba5c06dc8797c398db1e223a466c7ece27a1f7b5232ba3466aafe3d"}, - {file = "numpy-1.23.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33161613d2269025873025b33e879825ec7b1d831317e68f4f2f0f84ed14c719"}, - {file = "numpy-1.23.5-cp39-cp39-win32.whl", hash = "sha256:af1da88f6bc3d2338ebbf0e22fe487821ea4d8e89053e25fa59d1d79786e7481"}, - {file = "numpy-1.23.5-cp39-cp39-win_amd64.whl", hash = "sha256:09b7847f7e83ca37c6e627682f145856de331049013853f344f37b0c9690e3df"}, - {file = "numpy-1.23.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:abdde9f795cf292fb9651ed48185503a2ff29be87770c3b8e2a14b0cd7aa16f8"}, - {file = "numpy-1.23.5-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9a909a8bae284d46bbfdefbdd4a262ba19d3bc9921b1e76126b1d21c3c34135"}, - {file = "numpy-1.23.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:01dd17cbb340bf0fc23981e52e1d18a9d4050792e8fb8363cecbf066a84b827d"}, - {file = "numpy-1.23.5.tar.gz", hash = "sha256:1b1766d6f397c18153d40015ddfc79ddb715cabadc04d2d228d4e5a8bc4ded1a"}, -] -openpyxl = [ - {file = "openpyxl-3.0.10-py2.py3-none-any.whl", hash = "sha256:0ab6d25d01799f97a9464630abacbb34aafecdcaa0ef3cba6d6b3499867d0355"}, - {file = "openpyxl-3.0.10.tar.gz", hash = "sha256:e47805627aebcf860edb4edf7987b1309c1b3632f3750538ed962bbcc3bd7449"}, -] -orjson = [ - {file = "orjson-3.8.2-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:43e69b360c2851b45c7dbab3b95f7fa8469df73fab325a683f7389c4db63aa71"}, - {file = "orjson-3.8.2-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:64c5da5c9679ef3d85e9bbcbb62f4ccdc1f1975780caa20f2ec1e37b4da6bd36"}, - {file = "orjson-3.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c632a2157fa9ec098d655287e9e44809615af99837c49f53d96bfbca453c5bd"}, - {file = "orjson-3.8.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f63da6309c282a2b58d4a846f0717f6440356b4872838b9871dc843ed1fe2b38"}, - {file = "orjson-3.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c9be25c313ba2d5478829d949165445c3bd36c62e07092b4ba8dbe5426574d1"}, - {file = "orjson-3.8.2-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:4bcce53e9e088f82633f784f79551fcd7637943ab56c51654aaf9d4c1d5cfa54"}, - {file = "orjson-3.8.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:33edb5379c6e6337f9383c85fe4080ce3aa1057cc2ce29345b7239461f50cbd6"}, - {file = "orjson-3.8.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:da35d347115758bbc8bfaf39bb213c42000f2a54e3f504c84374041d20835cd6"}, - {file = "orjson-3.8.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d755d94a90a941b91b4d39a6b02e289d8ba358af2d1a911edf266be7942609dc"}, - {file = "orjson-3.8.2-cp310-none-win_amd64.whl", hash = "sha256:7ea96923e26390b2142602ebb030e2a4db9351134696e0b219e5106bddf9b48e"}, - {file = "orjson-3.8.2-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:a0d89de876e6f1cef917a2338378a60a98584e1c2e1c67781e20b6ed1c512478"}, - {file = "orjson-3.8.2-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:8d47e7592fe938aec898eb22ea4946298c018133df084bc78442ff18e2c6347c"}, - {file = "orjson-3.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3d9f1043f618d0c64228aab9711e5bd822253c50b6c56223951e32b51f81d62"}, - {file = "orjson-3.8.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed10600e8b08f1e87b656ad38ab316191ce94f2c9adec57035680c0dc9e93c81"}, - {file = "orjson-3.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99c49e49a04bf61fee7aaea6d92ac2b1fcf6507aea894bbdf3fbb25fe792168c"}, - {file = "orjson-3.8.2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:1463674f8efe6984902473d7b5ce3edf444c1fcd09dc8aa4779638a28fb9ca01"}, - {file = "orjson-3.8.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:c1ef75f1d021d817e5c60a42da0b4b7e3123b1b37415260b8415666ddacc7cd7"}, - {file = "orjson-3.8.2-cp311-none-win_amd64.whl", hash = "sha256:b6007e1ac8564b13b2521720929e8bb3ccd3293d9fdf38f28728dcc06db6248f"}, - {file = "orjson-3.8.2-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:a02c13ae523221576b001071354380e277346722cc6b7fdaacb0fd6db5154b3e"}, - {file = "orjson-3.8.2-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:fa2e565cf8ffdb37ce1887bd1592709ada7f701e61aa4b1e710be94b0aecbab4"}, - {file = "orjson-3.8.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1d8864288f7c5fccc07b43394f83b721ddc999f25dccfb5d0651671a76023f5"}, - {file = "orjson-3.8.2-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1874c05d0bb994601fa2d51605cb910d09343c6ebd36e84a573293523fab772a"}, - {file = "orjson-3.8.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:349387ed6989e5db22e08c9af8d7ca14240803edc50de451d48d41a0e7be30f6"}, - {file = "orjson-3.8.2-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:4e42b19619d6e97e201053b865ca4e62a48da71165f4081508ada8e1b91c6a30"}, - {file = "orjson-3.8.2-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:bc112c17e607c59d1501e72afb44226fa53d947d364aed053f0c82d153e29616"}, - {file = "orjson-3.8.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6fda669211f2ed1fc2c8130187ec90c96b4f77b6a250004e666d2ef8ed524e5f"}, - {file = "orjson-3.8.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:aebd4e80fea0f20578fd0452908b9206a6a0d5ae9f5c99b6e665bbcd989e56cd"}, - {file = "orjson-3.8.2-cp37-none-win_amd64.whl", hash = "sha256:9f3cd0394eb6d265beb2a1572b5663bc910883ddbb5cdfbcb660f5a0444e7fd8"}, - {file = "orjson-3.8.2-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:74e7d54d11b3da42558d69a23bf92c2c48fabf69b38432d5eee2c5b09cd4c433"}, - {file = "orjson-3.8.2-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:8cbadc9be748a823f9c743c7631b1ee95d3925a9c0b21de4e862a1d57daa10ec"}, - {file = "orjson-3.8.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a07d5a8c69a2947d9554a00302734fe3d8516415c8b280963c92bc1033477890"}, - {file = "orjson-3.8.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6b364ea01d1b71b9f97bf97af9eb79ebee892df302e127a9e2e4f8eaa74d6b98"}, - {file = "orjson-3.8.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b98a8c825a59db94fbe8e0cce48618624c5a6fb1436467322d90667c08a0bf80"}, - {file = "orjson-3.8.2-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:ab63103f60b516c0fce9b62cb4773f689a82ab56e19ef2387b5a3182f80c0d78"}, - {file = "orjson-3.8.2-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:73ab3f4288389381ae33ab99f914423b69570c88d626d686764634d5e0eeb909"}, - {file = "orjson-3.8.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2ab3fd8728e12c36e20c6d9d70c9e15033374682ce5acb6ed6a08a80dacd254d"}, - {file = "orjson-3.8.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cde11822cf71a7f0daaa84223249b2696a2b6cda7fa587e9fd762dff1a8848e4"}, - {file = "orjson-3.8.2-cp38-none-win_amd64.whl", hash = "sha256:b14765ea5aabfeab1a194abfaa0be62c9fee6480a75ac8c6974b4eeede3340b4"}, - {file = "orjson-3.8.2-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:6068a27d59d989d4f2864c2fc3440eb7126a0cfdfaf8a4ad136b0ffd932026ae"}, - {file = "orjson-3.8.2-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:6bf36fa759a1b941fc552ad76b2d7fb10c1d2a20c056be291ea45eb6ae1da09b"}, - {file = "orjson-3.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f436132e62e647880ca6988974c8e3165a091cb75cbed6c6fd93e931630c22fa"}, - {file = "orjson-3.8.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3ecd8936259a5920b52a99faf62d4efeb9f5e25a0aacf0cce1e9fa7c37af154f"}, - {file = "orjson-3.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c13114b345cda33644f64e92fe5d8737828766cf02fbbc7d28271a95ea546832"}, - {file = "orjson-3.8.2-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:6e43cdc3ddf96bdb751b748b1984b701125abacca8fc2226b808d203916e8cba"}, - {file = "orjson-3.8.2-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:ee39071da2026b11e4352d6fc3608a7b27ee14bc699fd240f4e604770bc7a255"}, - {file = "orjson-3.8.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1c3833976ebbeb3b5b6298cb22e23bf18453f6b80802103b7d08f7dd8a61611d"}, - {file = "orjson-3.8.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b9a34519d3d70935e1cd3797fbed8fbb6f61025182bea0140ca84d95b6f8fbe5"}, - {file = "orjson-3.8.2-cp39-none-win_amd64.whl", hash = "sha256:2734086d9a3dd9591c4be7d05aff9beccc086796d3f243685e56b7973ebac5bc"}, - {file = "orjson-3.8.2.tar.gz", hash = "sha256:a2fb95a45031ccf278e44341027b3035ab99caa32aa173279b1f0a06324f434b"}, -] -packaging = [ - {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, - {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, -] -pandas = [ - {file = "pandas-1.5.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0a78e05ec09731c5b3bd7a9805927ea631fe6f6cb06f0e7c63191a9a778d52b4"}, - {file = "pandas-1.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5b0c970e2215572197b42f1cff58a908d734503ea54b326412c70d4692256391"}, - {file = "pandas-1.5.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f340331a3f411910adfb4bbe46c2ed5872d9e473a783d7f14ecf49bc0869c594"}, - {file = "pandas-1.5.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8c709f4700573deb2036d240d140934df7e852520f4a584b2a8d5443b71f54d"}, - {file = "pandas-1.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32e3d9f65606b3f6e76555bfd1d0b68d94aff0929d82010b791b6254bf5a4b96"}, - {file = "pandas-1.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:a52419d9ba5906db516109660b114faf791136c94c1a636ed6b29cbfff9187ee"}, - {file = "pandas-1.5.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:66a1ad667b56e679e06ba73bb88c7309b3f48a4c279bd3afea29f65a766e9036"}, - {file = "pandas-1.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:36aa1f8f680d7584e9b572c3203b20d22d697c31b71189322f16811d4ecfecd3"}, - {file = "pandas-1.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bcf1a82b770b8f8c1e495b19a20d8296f875a796c4fe6e91da5ef107f18c5ecb"}, - {file = "pandas-1.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c25e5c16ee5c0feb6cf9d982b869eec94a22ddfda9aa2fbed00842cbb697624"}, - {file = "pandas-1.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:932d2d7d3cab44cfa275601c982f30c2d874722ef6396bb539e41e4dc4618ed4"}, - {file = "pandas-1.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:eb7e8cf2cf11a2580088009b43de84cabbf6f5dae94ceb489f28dba01a17cb77"}, - {file = "pandas-1.5.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:cb2a9cf1150302d69bb99861c5cddc9c25aceacb0a4ef5299785d0f5389a3209"}, - {file = "pandas-1.5.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:81f0674fa50b38b6793cd84fae5d67f58f74c2d974d2cb4e476d26eee33343d0"}, - {file = "pandas-1.5.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:17da7035d9e6f9ea9cdc3a513161f8739b8f8489d31dc932bc5a29a27243f93d"}, - {file = "pandas-1.5.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:669c8605dba6c798c1863157aefde959c1796671ffb342b80fcb80a4c0bc4c26"}, - {file = "pandas-1.5.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:683779e5728ac9138406c59a11e09cd98c7d2c12f0a5fc2b9c5eecdbb4a00075"}, - {file = "pandas-1.5.1-cp38-cp38-win32.whl", hash = "sha256:ddf46b940ef815af4e542697eaf071f0531449407a7607dd731bf23d156e20a7"}, - {file = "pandas-1.5.1-cp38-cp38-win_amd64.whl", hash = "sha256:db45b94885000981522fb92349e6b76f5aee0924cc5315881239c7859883117d"}, - {file = "pandas-1.5.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:927e59c694e039c75d7023465d311277a1fc29ed7236b5746e9dddf180393113"}, - {file = "pandas-1.5.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e675f8fe9aa6c418dc8d3aac0087b5294c1a4527f1eacf9fe5ea671685285454"}, - {file = "pandas-1.5.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:04e51b01d5192499390c0015630975f57836cc95c7411415b499b599b05c0c96"}, - {file = "pandas-1.5.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cee0c74e93ed4f9d39007e439debcaadc519d7ea5c0afc3d590a3a7b2edf060"}, - {file = "pandas-1.5.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b156a971bc451c68c9e1f97567c94fd44155f073e3bceb1b0d195fd98ed12048"}, - {file = "pandas-1.5.1-cp39-cp39-win32.whl", hash = "sha256:05c527c64ee02a47a24031c880ee0ded05af0623163494173204c5b72ddce658"}, - {file = "pandas-1.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:6bb391659a747cf4f181a227c3e64b6d197100d53da98dcd766cc158bdd9ec68"}, - {file = "pandas-1.5.1.tar.gz", hash = "sha256:249cec5f2a5b22096440bd85c33106b6102e0672204abd2d5c014106459804ee"}, -] -parso = [ - {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, - {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, -] -pathspec = [ - {file = "pathspec-0.10.2-py3-none-any.whl", hash = "sha256:88c2606f2c1e818b978540f73ecc908e13999c6c3a383daf3705652ae79807a5"}, - {file = "pathspec-0.10.2.tar.gz", hash = "sha256:8f6bf73e5758fd365ef5d58ce09ac7c27d2833a8d7da51712eac6e27e35141b0"}, -] -pexpect = [ - {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, - {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, -] -pickleshare = [ - {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, - {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, -] -platformdirs = [ - {file = "platformdirs-2.5.4-py3-none-any.whl", hash = "sha256:af0276409f9a02373d540bf8480021a048711d572745aef4b7842dad245eba10"}, - {file = "platformdirs-2.5.4.tar.gz", hash = "sha256:1006647646d80f16130f052404c6b901e80ee4ed6bef6792e1f238a8969106f7"}, -] -prompt-toolkit = [ - {file = "prompt_toolkit-3.0.33-py3-none-any.whl", hash = "sha256:ced598b222f6f4029c0800cefaa6a17373fb580cd093223003475ce32805c35b"}, - {file = "prompt_toolkit-3.0.33.tar.gz", hash = "sha256:535c29c31216c77302877d5120aef6c94ff573748a5b5ca5b1b1f76f5e700c73"}, -] -psutil = [ - {file = "psutil-5.9.4-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:c1ca331af862803a42677c120aff8a814a804e09832f166f226bfd22b56feee8"}, - {file = "psutil-5.9.4-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:68908971daf802203f3d37e78d3f8831b6d1014864d7a85937941bb35f09aefe"}, - {file = "psutil-5.9.4-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:3ff89f9b835100a825b14c2808a106b6fdcc4b15483141482a12c725e7f78549"}, - {file = "psutil-5.9.4-cp27-cp27m-win32.whl", hash = "sha256:852dd5d9f8a47169fe62fd4a971aa07859476c2ba22c2254d4a1baa4e10b95ad"}, - {file = "psutil-5.9.4-cp27-cp27m-win_amd64.whl", hash = "sha256:9120cd39dca5c5e1c54b59a41d205023d436799b1c8c4d3ff71af18535728e94"}, - {file = "psutil-5.9.4-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:6b92c532979bafc2df23ddc785ed116fced1f492ad90a6830cf24f4d1ea27d24"}, - {file = "psutil-5.9.4-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:efeae04f9516907be44904cc7ce08defb6b665128992a56957abc9b61dca94b7"}, - {file = "psutil-5.9.4-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:54d5b184728298f2ca8567bf83c422b706200bcbbfafdc06718264f9393cfeb7"}, - {file = "psutil-5.9.4-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:16653106f3b59386ffe10e0bad3bb6299e169d5327d3f187614b1cb8f24cf2e1"}, - {file = "psutil-5.9.4-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54c0d3d8e0078b7666984e11b12b88af2db11d11249a8ac8920dd5ef68a66e08"}, - {file = "psutil-5.9.4-cp36-abi3-win32.whl", hash = "sha256:149555f59a69b33f056ba1c4eb22bb7bf24332ce631c44a319cec09f876aaeff"}, - {file = "psutil-5.9.4-cp36-abi3-win_amd64.whl", hash = "sha256:fd8522436a6ada7b4aad6638662966de0d61d241cb821239b2ae7013d41a43d4"}, - {file = "psutil-5.9.4-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:6001c809253a29599bc0dfd5179d9f8a5779f9dffea1da0f13c53ee568115e1e"}, - {file = "psutil-5.9.4.tar.gz", hash = "sha256:3d7f9739eb435d4b1338944abe23f49584bde5395f27487d2ee25ad9a8774a62"}, -] -psycopg2-binary = [ - {file = "psycopg2-binary-2.9.5.tar.gz", hash = "sha256:33e632d0885b95a8b97165899006c40e9ecdc634a529dca7b991eb7de4ece41c"}, - {file = "psycopg2_binary-2.9.5-cp310-cp310-macosx_10_15_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:0775d6252ccb22b15da3b5d7adbbf8cfe284916b14b6dc0ff503a23edb01ee85"}, - {file = "psycopg2_binary-2.9.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2ec46ed947801652c9643e0b1dc334cfb2781232e375ba97312c2fc256597632"}, - {file = "psycopg2_binary-2.9.5-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3520d7af1ebc838cc6084a3281145d5cd5bdd43fdef139e6db5af01b92596cb7"}, - {file = "psycopg2_binary-2.9.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5cbc554ba47ecca8cd3396ddaca85e1ecfe3e48dd57dc5e415e59551affe568e"}, - {file = "psycopg2_binary-2.9.5-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:5d28ecdf191db558d0c07d0f16524ee9d67896edf2b7990eea800abeb23ebd61"}, - {file = "psycopg2_binary-2.9.5-cp310-cp310-manylinux_2_24_ppc64le.whl", hash = "sha256:b9c33d4aef08dfecbd1736ceab8b7b3c4358bf10a0121483e5cd60d3d308cc64"}, - {file = "psycopg2_binary-2.9.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:05b3d479425e047c848b9782cd7aac9c6727ce23181eb9647baf64ffdfc3da41"}, - {file = "psycopg2_binary-2.9.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:1e491e6489a6cb1d079df8eaa15957c277fdedb102b6a68cfbf40c4994412fd0"}, - {file = "psycopg2_binary-2.9.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:9e32cedc389bcb76d9f24ea8a012b3cb8385ee362ea437e1d012ffaed106c17d"}, - {file = "psycopg2_binary-2.9.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:46850a640df62ae940e34a163f72e26aca1f88e2da79148e1862faaac985c302"}, - {file = "psycopg2_binary-2.9.5-cp310-cp310-win32.whl", hash = "sha256:3d790f84201c3698d1bfb404c917f36e40531577a6dda02e45ba29b64d539867"}, - {file = "psycopg2_binary-2.9.5-cp310-cp310-win_amd64.whl", hash = "sha256:1764546ffeaed4f9428707be61d68972eb5ede81239b46a45843e0071104d0dd"}, - {file = "psycopg2_binary-2.9.5-cp311-cp311-macosx_10_9_universal2.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:426c2ae999135d64e6a18849a7d1ad0e1bd007277e4a8f4752eaa40a96b550ff"}, - {file = "psycopg2_binary-2.9.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7cf1d44e710ca3a9ce952bda2855830fe9f9017ed6259e01fcd71ea6287565f5"}, - {file = "psycopg2_binary-2.9.5-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:024030b13bdcbd53d8a93891a2cf07719715724fc9fee40243f3bd78b4264b8f"}, - {file = "psycopg2_binary-2.9.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bcda1c84a1c533c528356da5490d464a139b6e84eb77cc0b432e38c5c6dd7882"}, - {file = "psycopg2_binary-2.9.5-cp311-cp311-manylinux_2_24_aarch64.whl", hash = "sha256:2ef892cabdccefe577088a79580301f09f2a713eb239f4f9f62b2b29cafb0577"}, - {file = "psycopg2_binary-2.9.5-cp311-cp311-manylinux_2_24_ppc64le.whl", hash = "sha256:af0516e1711995cb08dc19bbd05bec7dbdebf4185f68870595156718d237df3e"}, - {file = "psycopg2_binary-2.9.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e72c91bda9880f097c8aa3601a2c0de6c708763ba8128006151f496ca9065935"}, - {file = "psycopg2_binary-2.9.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e67b3c26e9b6d37b370c83aa790bbc121775c57bfb096c2e77eacca25fd0233b"}, - {file = "psycopg2_binary-2.9.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5fc447058d083b8c6ac076fc26b446d44f0145308465d745fba93a28c14c9e32"}, - {file = "psycopg2_binary-2.9.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d892bfa1d023c3781a3cab8dd5af76b626c483484d782e8bd047c180db590e4c"}, - {file = "psycopg2_binary-2.9.5-cp311-cp311-win32.whl", hash = "sha256:2abccab84d057723d2ca8f99ff7b619285d40da6814d50366f61f0fc385c3903"}, - {file = "psycopg2_binary-2.9.5-cp311-cp311-win_amd64.whl", hash = "sha256:bef7e3f9dc6f0c13afdd671008534be5744e0e682fb851584c8c3a025ec09720"}, - {file = "psycopg2_binary-2.9.5-cp36-cp36m-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:6e63814ec71db9bdb42905c925639f319c80e7909fb76c3b84edc79dadef8d60"}, - {file = "psycopg2_binary-2.9.5-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:212757ffcecb3e1a5338d4e6761bf9c04f750e7d027117e74aa3cd8a75bb6fbd"}, - {file = "psycopg2_binary-2.9.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f8a9bcab7b6db2e3dbf65b214dfc795b4c6b3bb3af922901b6a67f7cb47d5f8"}, - {file = "psycopg2_binary-2.9.5-cp36-cp36m-manylinux_2_24_aarch64.whl", hash = "sha256:56b2957a145f816726b109ee3d4e6822c23f919a7d91af5a94593723ed667835"}, - {file = "psycopg2_binary-2.9.5-cp36-cp36m-manylinux_2_24_ppc64le.whl", hash = "sha256:f95b8aca2703d6a30249f83f4fe6a9abf2e627aa892a5caaab2267d56be7ab69"}, - {file = "psycopg2_binary-2.9.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:70831e03bd53702c941da1a1ad36c17d825a24fbb26857b40913d58df82ec18b"}, - {file = "psycopg2_binary-2.9.5-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:dbc332beaf8492b5731229a881807cd7b91b50dbbbaf7fe2faf46942eda64a24"}, - {file = "psycopg2_binary-2.9.5-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:2d964eb24c8b021623df1c93c626671420c6efadbdb8655cb2bd5e0c6fa422ba"}, - {file = "psycopg2_binary-2.9.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:95076399ec3b27a8f7fa1cc9a83417b1c920d55cf7a97f718a94efbb96c7f503"}, - {file = "psycopg2_binary-2.9.5-cp36-cp36m-win32.whl", hash = "sha256:3fc33295cfccad697a97a76dec3f1e94ad848b7b163c3228c1636977966b51e2"}, - {file = "psycopg2_binary-2.9.5-cp36-cp36m-win_amd64.whl", hash = "sha256:02551647542f2bf89073d129c73c05a25c372fc0a49aa50e0de65c3c143d8bd0"}, - {file = "psycopg2_binary-2.9.5-cp37-cp37m-macosx_10_15_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:63e318dbe52709ed10d516a356f22a635e07a2e34c68145484ed96a19b0c4c68"}, - {file = "psycopg2_binary-2.9.5-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7e518a0911c50f60313cb9e74a169a65b5d293770db4770ebf004245f24b5c5"}, - {file = "psycopg2_binary-2.9.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9d38a4656e4e715d637abdf7296e98d6267df0cc0a8e9a016f8ba07e4aa3eeb"}, - {file = "psycopg2_binary-2.9.5-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:68d81a2fe184030aa0c5c11e518292e15d342a667184d91e30644c9d533e53e1"}, - {file = "psycopg2_binary-2.9.5-cp37-cp37m-manylinux_2_24_ppc64le.whl", hash = "sha256:7ee3095d02d6f38bd7d9a5358fcc9ea78fcdb7176921528dd709cc63f40184f5"}, - {file = "psycopg2_binary-2.9.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:46512486be6fbceef51d7660dec017394ba3e170299d1dc30928cbedebbf103a"}, - {file = "psycopg2_binary-2.9.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b911dfb727e247340d36ae20c4b9259e4a64013ab9888ccb3cbba69b77fd9636"}, - {file = "psycopg2_binary-2.9.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:422e3d43b47ac20141bc84b3d342eead8d8099a62881a501e97d15f6addabfe9"}, - {file = "psycopg2_binary-2.9.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c5682a45df7d9642eff590abc73157c887a68f016df0a8ad722dcc0f888f56d7"}, - {file = "psycopg2_binary-2.9.5-cp37-cp37m-win32.whl", hash = "sha256:b8104f709590fff72af801e916817560dbe1698028cd0afe5a52d75ceb1fce5f"}, - {file = "psycopg2_binary-2.9.5-cp37-cp37m-win_amd64.whl", hash = "sha256:7b3751857da3e224f5629400736a7b11e940b5da5f95fa631d86219a1beaafec"}, - {file = "psycopg2_binary-2.9.5-cp38-cp38-macosx_10_15_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:043a9fd45a03858ff72364b4b75090679bd875ee44df9c0613dc862ca6b98460"}, - {file = "psycopg2_binary-2.9.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9ffdc51001136b699f9563b1c74cc1f8c07f66ef7219beb6417a4c8aaa896c28"}, - {file = "psycopg2_binary-2.9.5-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c15ba5982c177bc4b23a7940c7e4394197e2d6a424a2d282e7c236b66da6d896"}, - {file = "psycopg2_binary-2.9.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc85b3777068ed30aff8242be2813038a929f2084f69e43ef869daddae50f6ee"}, - {file = "psycopg2_binary-2.9.5-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:215d6bf7e66732a514f47614f828d8c0aaac9a648c46a831955cb103473c7147"}, - {file = "psycopg2_binary-2.9.5-cp38-cp38-manylinux_2_24_ppc64le.whl", hash = "sha256:7d07f552d1e412f4b4e64ce386d4c777a41da3b33f7098b6219012ba534fb2c2"}, - {file = "psycopg2_binary-2.9.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a0adef094c49f242122bb145c3c8af442070dc0e4312db17e49058c1702606d4"}, - {file = "psycopg2_binary-2.9.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:00475004e5ed3e3bf5e056d66e5dcdf41a0dc62efcd57997acd9135c40a08a50"}, - {file = "psycopg2_binary-2.9.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:7d88db096fa19d94f433420eaaf9f3c45382da2dd014b93e4bf3215639047c16"}, - {file = "psycopg2_binary-2.9.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:902844f9c4fb19b17dfa84d9e2ca053d4a4ba265723d62ea5c9c26b38e0aa1e6"}, - {file = "psycopg2_binary-2.9.5-cp38-cp38-win32.whl", hash = "sha256:4e7904d1920c0c89105c0517dc7e3f5c20fb4e56ba9cdef13048db76947f1d79"}, - {file = "psycopg2_binary-2.9.5-cp38-cp38-win_amd64.whl", hash = "sha256:a36a0e791805aa136e9cbd0ffa040d09adec8610453ee8a753f23481a0057af5"}, - {file = "psycopg2_binary-2.9.5-cp39-cp39-macosx_10_15_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:25382c7d174c679ce6927c16b6fbb68b10e56ee44b1acb40671e02d29f2fce7c"}, - {file = "psycopg2_binary-2.9.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9c38d3869238e9d3409239bc05bc27d6b7c99c2a460ea337d2814b35fb4fea1b"}, - {file = "psycopg2_binary-2.9.5-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5c6527c8efa5226a9e787507652dd5ba97b62d29b53c371a85cd13f957fe4d42"}, - {file = "psycopg2_binary-2.9.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e59137cdb970249ae60be2a49774c6dfb015bd0403f05af1fe61862e9626642d"}, - {file = "psycopg2_binary-2.9.5-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:d4c7b3a31502184e856df1f7bbb2c3735a05a8ce0ade34c5277e1577738a5c91"}, - {file = "psycopg2_binary-2.9.5-cp39-cp39-manylinux_2_24_ppc64le.whl", hash = "sha256:b9a794cef1d9c1772b94a72eec6da144c18e18041d294a9ab47669bc77a80c1d"}, - {file = "psycopg2_binary-2.9.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c5254cbd4f4855e11cebf678c1a848a3042d455a22a4ce61349c36aafd4c2267"}, - {file = "psycopg2_binary-2.9.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c5e65c6ac0ae4bf5bef1667029f81010b6017795dcb817ba5c7b8a8d61fab76f"}, - {file = "psycopg2_binary-2.9.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:74eddec4537ab1f701a1647214734bc52cee2794df748f6ae5908e00771f180a"}, - {file = "psycopg2_binary-2.9.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:01ad49d68dd8c5362e4bfb4158f2896dc6e0c02e87b8a3770fc003459f1a4425"}, - {file = "psycopg2_binary-2.9.5-cp39-cp39-win32.whl", hash = "sha256:937880290775033a743f4836aa253087b85e62784b63fd099ee725d567a48aa1"}, - {file = "psycopg2_binary-2.9.5-cp39-cp39-win_amd64.whl", hash = "sha256:484405b883630f3e74ed32041a87456c5e0e63a8e3429aa93e8714c366d62bd1"}, -] -ptyprocess = [ - {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, - {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, -] -pure-eval = [ - {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, - {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, -] -py = [ - {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, - {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, -] -pycodestyle = [ - {file = "pycodestyle-2.9.1-py2.py3-none-any.whl", hash = "sha256:d1735fc58b418fd7c5f658d28d943854f8a849b01a5d0a1e6f3f3fdd0166804b"}, - {file = "pycodestyle-2.9.1.tar.gz", hash = "sha256:2c9607871d58c76354b697b42f5d57e1ada7d261c261efac224b664affdc5785"}, -] -pycparser = [ - {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, - {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, -] -pydantic = [ - {file = "pydantic-1.10.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bb6ad4489af1bac6955d38ebcb95079a836af31e4c4f74aba1ca05bb9f6027bd"}, - {file = "pydantic-1.10.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a1f5a63a6dfe19d719b1b6e6106561869d2efaca6167f84f5ab9347887d78b98"}, - {file = "pydantic-1.10.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:352aedb1d71b8b0736c6d56ad2bd34c6982720644b0624462059ab29bd6e5912"}, - {file = "pydantic-1.10.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19b3b9ccf97af2b7519c42032441a891a5e05c68368f40865a90eb88833c2559"}, - {file = "pydantic-1.10.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e9069e1b01525a96e6ff49e25876d90d5a563bc31c658289a8772ae186552236"}, - {file = "pydantic-1.10.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:355639d9afc76bcb9b0c3000ddcd08472ae75318a6eb67a15866b87e2efa168c"}, - {file = "pydantic-1.10.2-cp310-cp310-win_amd64.whl", hash = "sha256:ae544c47bec47a86bc7d350f965d8b15540e27e5aa4f55170ac6a75e5f73b644"}, - {file = "pydantic-1.10.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a4c805731c33a8db4b6ace45ce440c4ef5336e712508b4d9e1aafa617dc9907f"}, - {file = "pydantic-1.10.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d49f3db871575e0426b12e2f32fdb25e579dea16486a26e5a0474af87cb1ab0a"}, - {file = "pydantic-1.10.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37c90345ec7dd2f1bcef82ce49b6235b40f282b94d3eec47e801baf864d15525"}, - {file = "pydantic-1.10.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b5ba54d026c2bd2cb769d3468885f23f43710f651688e91f5fb1edcf0ee9283"}, - {file = "pydantic-1.10.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:05e00dbebbe810b33c7a7362f231893183bcc4251f3f2ff991c31d5c08240c42"}, - {file = "pydantic-1.10.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2d0567e60eb01bccda3a4df01df677adf6b437958d35c12a3ac3e0f078b0ee52"}, - {file = "pydantic-1.10.2-cp311-cp311-win_amd64.whl", hash = "sha256:c6f981882aea41e021f72779ce2a4e87267458cc4d39ea990729e21ef18f0f8c"}, - {file = "pydantic-1.10.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4aac8e7103bf598373208f6299fa9a5cfd1fc571f2d40bf1dd1955a63d6eeb5"}, - {file = "pydantic-1.10.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81a7b66c3f499108b448f3f004801fcd7d7165fb4200acb03f1c2402da73ce4c"}, - {file = "pydantic-1.10.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bedf309630209e78582ffacda64a21f96f3ed2e51fbf3962d4d488e503420254"}, - {file = "pydantic-1.10.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9300fcbebf85f6339a02c6994b2eb3ff1b9c8c14f502058b5bf349d42447dcf5"}, - {file = "pydantic-1.10.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:216f3bcbf19c726b1cc22b099dd409aa371f55c08800bcea4c44c8f74b73478d"}, - {file = "pydantic-1.10.2-cp37-cp37m-win_amd64.whl", hash = "sha256:dd3f9a40c16daf323cf913593083698caee97df2804aa36c4b3175d5ac1b92a2"}, - {file = "pydantic-1.10.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b97890e56a694486f772d36efd2ba31612739bc6f3caeee50e9e7e3ebd2fdd13"}, - {file = "pydantic-1.10.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9cabf4a7f05a776e7793e72793cd92cc865ea0e83a819f9ae4ecccb1b8aa6116"}, - {file = "pydantic-1.10.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06094d18dd5e6f2bbf93efa54991c3240964bb663b87729ac340eb5014310624"}, - {file = "pydantic-1.10.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc78cc83110d2f275ec1970e7a831f4e371ee92405332ebfe9860a715f8336e1"}, - {file = "pydantic-1.10.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ee433e274268a4b0c8fde7ad9d58ecba12b069a033ecc4645bb6303c062d2e9"}, - {file = "pydantic-1.10.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7c2abc4393dea97a4ccbb4ec7d8658d4e22c4765b7b9b9445588f16c71ad9965"}, - {file = "pydantic-1.10.2-cp38-cp38-win_amd64.whl", hash = "sha256:0b959f4d8211fc964772b595ebb25f7652da3f22322c007b6fed26846a40685e"}, - {file = "pydantic-1.10.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c33602f93bfb67779f9c507e4d69451664524389546bacfe1bee13cae6dc7488"}, - {file = "pydantic-1.10.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5760e164b807a48a8f25f8aa1a6d857e6ce62e7ec83ea5d5c5a802eac81bad41"}, - {file = "pydantic-1.10.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6eb843dcc411b6a2237a694f5e1d649fc66c6064d02b204a7e9d194dff81eb4b"}, - {file = "pydantic-1.10.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b8795290deaae348c4eba0cebb196e1c6b98bdbe7f50b2d0d9a4a99716342fe"}, - {file = "pydantic-1.10.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e0bedafe4bc165ad0a56ac0bd7695df25c50f76961da29c050712596cf092d6d"}, - {file = "pydantic-1.10.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2e05aed07fa02231dbf03d0adb1be1d79cabb09025dd45aa094aa8b4e7b9dcda"}, - {file = "pydantic-1.10.2-cp39-cp39-win_amd64.whl", hash = "sha256:c1ba1afb396148bbc70e9eaa8c06c1716fdddabaf86e7027c5988bae2a829ab6"}, - {file = "pydantic-1.10.2-py3-none-any.whl", hash = "sha256:1b6ee725bd6e83ec78b1aa32c5b1fa67a3a65badddde3976bca5fe4568f27709"}, - {file = "pydantic-1.10.2.tar.gz", hash = "sha256:91b8e218852ef6007c2b98cd861601c6a09f1aa32bbbb74fab5b1c33d4a1e410"}, -] -pyflakes = [ - {file = "pyflakes-2.5.0-py2.py3-none-any.whl", hash = "sha256:4579f67d887f804e67edb544428f264b7b24f435b263c4614f384135cea553d2"}, - {file = "pyflakes-2.5.0.tar.gz", hash = "sha256:491feb020dca48ccc562a8c0cbe8df07ee13078df59813b83959cbdada312ea3"}, -] -pygments = [ - {file = "Pygments-2.13.0-py3-none-any.whl", hash = "sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42"}, - {file = "Pygments-2.13.0.tar.gz", hash = "sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1"}, -] -pyparsing = [ - {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, - {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, -] -python-dateutil = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, -] -python-dotenv = [ - {file = "python-dotenv-0.21.0.tar.gz", hash = "sha256:b77d08274639e3d34145dfa6c7008e66df0f04b7be7a75fd0d5292c191d79045"}, - {file = "python_dotenv-0.21.0-py3-none-any.whl", hash = "sha256:1684eb44636dd462b66c3ee016599815514527ad99965de77f43e0944634a7e5"}, -] -python-multipart = [ - {file = "python-multipart-0.0.5.tar.gz", hash = "sha256:f7bb5f611fc600d15fa47b3974c8aa16e93724513b49b5f95c81e6624c83fa43"}, -] -python-slugify = [ - {file = "python-slugify-7.0.0.tar.gz", hash = "sha256:7a0f21a39fa6c1c4bf2e5984c9b9ae944483fd10b54804cb0e23a3ccd4954f0b"}, - {file = "python_slugify-7.0.0-py2.py3-none-any.whl", hash = "sha256:003aee64f9fd955d111549f96c4b58a3f40b9319383c70fad6277a4974bbf570"}, -] -pytz = [ - {file = "pytz-2022.6-py2.py3-none-any.whl", hash = "sha256:222439474e9c98fced559f1709d89e6c9cbf8d79c794ff3eb9f8800064291427"}, - {file = "pytz-2022.6.tar.gz", hash = "sha256:e89512406b793ca39f5971bc999cc538ce125c0e51c27941bef4568b460095e2"}, -] -pywin32 = [ - {file = "pywin32-305-cp310-cp310-win32.whl", hash = "sha256:421f6cd86e84bbb696d54563c48014b12a23ef95a14e0bdba526be756d89f116"}, - {file = "pywin32-305-cp310-cp310-win_amd64.whl", hash = "sha256:73e819c6bed89f44ff1d690498c0a811948f73777e5f97c494c152b850fad478"}, - {file = "pywin32-305-cp310-cp310-win_arm64.whl", hash = "sha256:742eb905ce2187133a29365b428e6c3b9001d79accdc30aa8969afba1d8470f4"}, - {file = "pywin32-305-cp311-cp311-win32.whl", hash = "sha256:19ca459cd2e66c0e2cc9a09d589f71d827f26d47fe4a9d09175f6aa0256b51c2"}, - {file = "pywin32-305-cp311-cp311-win_amd64.whl", hash = "sha256:326f42ab4cfff56e77e3e595aeaf6c216712bbdd91e464d167c6434b28d65990"}, - {file = "pywin32-305-cp311-cp311-win_arm64.whl", hash = "sha256:4ecd404b2c6eceaca52f8b2e3e91b2187850a1ad3f8b746d0796a98b4cea04db"}, - {file = "pywin32-305-cp36-cp36m-win32.whl", hash = "sha256:48d8b1659284f3c17b68587af047d110d8c44837736b8932c034091683e05863"}, - {file = "pywin32-305-cp36-cp36m-win_amd64.whl", hash = "sha256:13362cc5aa93c2beaf489c9c9017c793722aeb56d3e5166dadd5ef82da021fe1"}, - {file = "pywin32-305-cp37-cp37m-win32.whl", hash = "sha256:a55db448124d1c1484df22fa8bbcbc45c64da5e6eae74ab095b9ea62e6d00496"}, - {file = "pywin32-305-cp37-cp37m-win_amd64.whl", hash = "sha256:109f98980bfb27e78f4df8a51a8198e10b0f347257d1e265bb1a32993d0c973d"}, - {file = "pywin32-305-cp38-cp38-win32.whl", hash = "sha256:9dd98384da775afa009bc04863426cb30596fd78c6f8e4e2e5bbf4edf8029504"}, - {file = "pywin32-305-cp38-cp38-win_amd64.whl", hash = "sha256:56d7a9c6e1a6835f521788f53b5af7912090674bb84ef5611663ee1595860fc7"}, - {file = "pywin32-305-cp39-cp39-win32.whl", hash = "sha256:9d968c677ac4d5cbdaa62fd3014ab241718e619d8e36ef8e11fb930515a1e918"}, - {file = "pywin32-305-cp39-cp39-win_amd64.whl", hash = "sha256:50768c6b7c3f0b38b7fb14dd4104da93ebced5f1a50dc0e834594bff6fbe1271"}, -] -pyyaml = [ - {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, - {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, - {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, - {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, - {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, - {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, - {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, - {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, - {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, - {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, - {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, - {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, - {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, - {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, - {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, - {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, - {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, - {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, -] -pyzmq = [ - {file = "pyzmq-24.0.1-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:28b119ba97129d3001673a697b7cce47fe6de1f7255d104c2f01108a5179a066"}, - {file = "pyzmq-24.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bcbebd369493d68162cddb74a9c1fcebd139dfbb7ddb23d8f8e43e6c87bac3a6"}, - {file = "pyzmq-24.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae61446166983c663cee42c852ed63899e43e484abf080089f771df4b9d272ef"}, - {file = "pyzmq-24.0.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:87f7ac99b15270db8d53f28c3c7b968612993a90a5cf359da354efe96f5372b4"}, - {file = "pyzmq-24.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9dca7c3956b03b7663fac4d150f5e6d4f6f38b2462c1e9afd83bcf7019f17913"}, - {file = "pyzmq-24.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8c78bfe20d4c890cb5580a3b9290f700c570e167d4cdcc55feec07030297a5e3"}, - {file = "pyzmq-24.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:48f721f070726cd2a6e44f3c33f8ee4b24188e4b816e6dd8ba542c8c3bb5b246"}, - {file = "pyzmq-24.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:afe1f3bc486d0ce40abb0a0c9adb39aed3bbac36ebdc596487b0cceba55c21c1"}, - {file = "pyzmq-24.0.1-cp310-cp310-win32.whl", hash = "sha256:3e6192dbcefaaa52ed81be88525a54a445f4b4fe2fffcae7fe40ebb58bd06bfd"}, - {file = "pyzmq-24.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:86de64468cad9c6d269f32a6390e210ca5ada568c7a55de8e681ca3b897bb340"}, - {file = "pyzmq-24.0.1-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:838812c65ed5f7c2bd11f7b098d2e5d01685a3f6d1f82849423b570bae698c00"}, - {file = "pyzmq-24.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dfb992dbcd88d8254471760879d48fb20836d91baa90f181c957122f9592b3dc"}, - {file = "pyzmq-24.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7abddb2bd5489d30ffeb4b93a428130886c171b4d355ccd226e83254fcb6b9ef"}, - {file = "pyzmq-24.0.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:94010bd61bc168c103a5b3b0f56ed3b616688192db7cd5b1d626e49f28ff51b3"}, - {file = "pyzmq-24.0.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8242543c522d84d033fe79be04cb559b80d7eb98ad81b137ff7e0a9020f00ace"}, - {file = "pyzmq-24.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ccb94342d13e3bf3ffa6e62f95b5e3f0bc6bfa94558cb37f4b3d09d6feb536ff"}, - {file = "pyzmq-24.0.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6640f83df0ae4ae1104d4c62b77e9ef39be85ebe53f636388707d532bee2b7b8"}, - {file = "pyzmq-24.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a180dbd5ea5d47c2d3b716d5c19cc3fb162d1c8db93b21a1295d69585bfddac1"}, - {file = "pyzmq-24.0.1-cp311-cp311-win32.whl", hash = "sha256:624321120f7e60336be8ec74a172ae7fba5c3ed5bf787cc85f7e9986c9e0ebc2"}, - {file = "pyzmq-24.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:1724117bae69e091309ffb8255412c4651d3f6355560d9af312d547f6c5bc8b8"}, - {file = "pyzmq-24.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:15975747462ec49fdc863af906bab87c43b2491403ab37a6d88410635786b0f4"}, - {file = "pyzmq-24.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b947e264f0e77d30dcbccbb00f49f900b204b922eb0c3a9f0afd61aaa1cedc3d"}, - {file = "pyzmq-24.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0ec91f1bad66f3ee8c6deb65fa1fe418e8ad803efedd69c35f3b5502f43bd1dc"}, - {file = "pyzmq-24.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:db03704b3506455d86ec72c3358a779e9b1d07b61220dfb43702b7b668edcd0d"}, - {file = "pyzmq-24.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:e7e66b4e403c2836ac74f26c4b65d8ac0ca1eef41dfcac2d013b7482befaad83"}, - {file = "pyzmq-24.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:7a23ccc1083c260fa9685c93e3b170baba45aeed4b524deb3f426b0c40c11639"}, - {file = "pyzmq-24.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:fa0ae3275ef706c0309556061185dd0e4c4cd3b7d6f67ae617e4e677c7a41e2e"}, - {file = "pyzmq-24.0.1-cp36-cp36m-win32.whl", hash = "sha256:f01de4ec083daebf210531e2cca3bdb1608dbbbe00a9723e261d92087a1f6ebc"}, - {file = "pyzmq-24.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:de4217b9eb8b541cf2b7fde4401ce9d9a411cc0af85d410f9d6f4333f43640be"}, - {file = "pyzmq-24.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:78068e8678ca023594e4a0ab558905c1033b2d3e806a0ad9e3094e231e115a33"}, - {file = "pyzmq-24.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77c2713faf25a953c69cf0f723d1b7dd83827b0834e6c41e3fb3bbc6765914a1"}, - {file = "pyzmq-24.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8bb4af15f305056e95ca1bd086239b9ebc6ad55e9f49076d27d80027f72752f6"}, - {file = "pyzmq-24.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:0f14cffd32e9c4c73da66db97853a6aeceaac34acdc0fae9e5bbc9370281864c"}, - {file = "pyzmq-24.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0108358dab8c6b27ff6b985c2af4b12665c1bc659648284153ee501000f5c107"}, - {file = "pyzmq-24.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:d66689e840e75221b0b290b0befa86f059fb35e1ee6443bce51516d4d61b6b99"}, - {file = "pyzmq-24.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ae08ac90aa8fa14caafc7a6251bd218bf6dac518b7bff09caaa5e781119ba3f2"}, - {file = "pyzmq-24.0.1-cp37-cp37m-win32.whl", hash = "sha256:8421aa8c9b45ea608c205db9e1c0c855c7e54d0e9c2c2f337ce024f6843cab3b"}, - {file = "pyzmq-24.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:54d8b9c5e288362ec8595c1d98666d36f2070fd0c2f76e2b3c60fbad9bd76227"}, - {file = "pyzmq-24.0.1-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:acbd0a6d61cc954b9f535daaa9ec26b0a60a0d4353c5f7c1438ebc88a359a47e"}, - {file = "pyzmq-24.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:47b11a729d61a47df56346283a4a800fa379ae6a85870d5a2e1e4956c828eedc"}, - {file = "pyzmq-24.0.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:abe6eb10122f0d746a0d510c2039ae8edb27bc9af29f6d1b05a66cc2401353ff"}, - {file = "pyzmq-24.0.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:07bec1a1b22dacf718f2c0e71b49600bb6a31a88f06527dfd0b5aababe3fa3f7"}, - {file = "pyzmq-24.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0d945a85b70da97ae86113faf9f1b9294efe66bd4a5d6f82f2676d567338b66"}, - {file = "pyzmq-24.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1b7928bb7580736ffac5baf814097be342ba08d3cfdfb48e52773ec959572287"}, - {file = "pyzmq-24.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b946da90dc2799bcafa682692c1d2139b2a96ec3c24fa9fc6f5b0da782675330"}, - {file = "pyzmq-24.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c8840f064b1fb377cffd3efeaad2b190c14d4c8da02316dae07571252d20b31f"}, - {file = "pyzmq-24.0.1-cp38-cp38-win32.whl", hash = "sha256:4854f9edc5208f63f0841c0c667260ae8d6846cfa233c479e29fdc85d42ebd58"}, - {file = "pyzmq-24.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:42d4f97b9795a7aafa152a36fe2ad44549b83a743fd3e77011136def512e6c2a"}, - {file = "pyzmq-24.0.1-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:52afb0ac962963fff30cf1be775bc51ae083ef4c1e354266ab20e5382057dd62"}, - {file = "pyzmq-24.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8bad8210ad4df68c44ff3685cca3cda448ee46e20d13edcff8909eba6ec01ca4"}, - {file = "pyzmq-24.0.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dabf1a05318d95b1537fd61d9330ef4313ea1216eea128a17615038859da3b3b"}, - {file = "pyzmq-24.0.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5bd3d7dfd9cd058eb68d9a905dec854f86649f64d4ddf21f3ec289341386c44b"}, - {file = "pyzmq-24.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8012bce6836d3f20a6c9599f81dfa945f433dab4dbd0c4917a6fb1f998ab33d"}, - {file = "pyzmq-24.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c31805d2c8ade9b11feca4674eee2b9cce1fec3e8ddb7bbdd961a09dc76a80ea"}, - {file = "pyzmq-24.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:3104f4b084ad5d9c0cb87445cc8cfd96bba710bef4a66c2674910127044df209"}, - {file = "pyzmq-24.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:df0841f94928f8af9c7a1f0aaaffba1fb74607af023a152f59379c01c53aee58"}, - {file = "pyzmq-24.0.1-cp39-cp39-win32.whl", hash = "sha256:a435ef8a3bd95c8a2d316d6e0ff70d0db524f6037411652803e118871d703333"}, - {file = "pyzmq-24.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:2032d9cb994ce3b4cba2b8dfae08c7e25bc14ba484c770d4d3be33c27de8c45b"}, - {file = "pyzmq-24.0.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bb5635c851eef3a7a54becde6da99485eecf7d068bd885ac8e6d173c4ecd68b0"}, - {file = "pyzmq-24.0.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:83ea1a398f192957cb986d9206ce229efe0ee75e3c6635baff53ddf39bd718d5"}, - {file = "pyzmq-24.0.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:941fab0073f0a54dc33d1a0460cb04e0d85893cb0c5e1476c785000f8b359409"}, - {file = "pyzmq-24.0.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e8f482c44ccb5884bf3f638f29bea0f8dc68c97e38b2061769c4cb697f6140d"}, - {file = "pyzmq-24.0.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:613010b5d17906c4367609e6f52e9a2595e35d5cc27d36ff3f1b6fa6e954d944"}, - {file = "pyzmq-24.0.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:65c94410b5a8355cfcf12fd600a313efee46ce96a09e911ea92cf2acf6708804"}, - {file = "pyzmq-24.0.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:20e7eeb1166087db636c06cae04a1ef59298627f56fb17da10528ab52a14c87f"}, - {file = "pyzmq-24.0.1-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a2712aee7b3834ace51738c15d9ee152cc5a98dc7d57dd93300461b792ab7b43"}, - {file = "pyzmq-24.0.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a7c280185c4da99e0cc06c63bdf91f5b0b71deb70d8717f0ab870a43e376db8"}, - {file = "pyzmq-24.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:858375573c9225cc8e5b49bfac846a77b696b8d5e815711b8d4ba3141e6e8879"}, - {file = "pyzmq-24.0.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:80093b595921eed1a2cead546a683b9e2ae7f4a4592bb2ab22f70d30174f003a"}, - {file = "pyzmq-24.0.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f3f3154fde2b1ff3aa7b4f9326347ebc89c8ef425ca1db8f665175e6d3bd42f"}, - {file = "pyzmq-24.0.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abb756147314430bee5d10919b8493c0ccb109ddb7f5dfd2fcd7441266a25b75"}, - {file = "pyzmq-24.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44e706bac34e9f50779cb8c39f10b53a4d15aebb97235643d3112ac20bd577b4"}, - {file = "pyzmq-24.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:687700f8371643916a1d2c61f3fdaa630407dd205c38afff936545d7b7466066"}, - {file = "pyzmq-24.0.1.tar.gz", hash = "sha256:216f5d7dbb67166759e59b0479bca82b8acf9bed6015b526b8eb10143fb08e77"}, -] -requests = [ - {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"}, - {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"}, -] -six = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] -sniffio = [ - {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, - {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, -] -sqlalchemy = [ - {file = "SQLAlchemy-1.4.44-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:da60b98b0f6f0df9fbf8b72d67d13b73aa8091923a48af79a951d4088530a239"}, - {file = "SQLAlchemy-1.4.44-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:95f4f8d62589755b507218f2e3189475a4c1f5cc9db2aec772071a7dc6cd5726"}, - {file = "SQLAlchemy-1.4.44-cp27-cp27m-win32.whl", hash = "sha256:afd1ac99179d1864a68c06b31263a08ea25a49df94e272712eb2824ef151e294"}, - {file = "SQLAlchemy-1.4.44-cp27-cp27m-win_amd64.whl", hash = "sha256:f8e5443295b218b08bef8eb85d31b214d184b3690d99a33b7bd8e5591e2b0aa1"}, - {file = "SQLAlchemy-1.4.44-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:53f90a2374f60e703c94118d21533765412da8225ba98659de7dd7998641ab17"}, - {file = "SQLAlchemy-1.4.44-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:65a0ad931944fcb0be12a8e0ac322dbd3ecf17c53f088bc10b6da8f0caac287b"}, - {file = "SQLAlchemy-1.4.44-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:595b185041a4dc5c685283ea98c2f67bbfa47bb28e4a4f5b27ebf40684e7a9f8"}, - {file = "SQLAlchemy-1.4.44-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:80ead36fb1d676cc019586ffdc21c7e906ce4bf243fe4021e4973dae332b6038"}, - {file = "SQLAlchemy-1.4.44-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68e0cd5d32a32c4395168d42f2fefbb03b817ead3a8f3704b8bd5697c0b26c24"}, - {file = "SQLAlchemy-1.4.44-cp310-cp310-win32.whl", hash = "sha256:ae1ed1ebc407d2f66c6f0ec44ef7d56e3f455859df5494680e2cf89dad8e3ae0"}, - {file = "SQLAlchemy-1.4.44-cp310-cp310-win_amd64.whl", hash = "sha256:6f0ea4d7348feb5e5d0bf317aace92e28398fa9a6e38b7be9ec1f31aad4a8039"}, - {file = "SQLAlchemy-1.4.44-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f5e8ed9cde48b76318ab989deeddc48f833d2a6a7b7c393c49b704f67dedf01d"}, - {file = "SQLAlchemy-1.4.44-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c857676d810ca196be73c98eb839125d6fa849bfa3589be06201a6517f9961c"}, - {file = "SQLAlchemy-1.4.44-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c56e6899fa6e767e4be5d106941804a4201c5cb9620a409c0b80448ec70b656"}, - {file = "SQLAlchemy-1.4.44-cp311-cp311-win32.whl", hash = "sha256:c46322354c58d4dc039a2c982d28284330f8919f31206894281f4b595b9d8dbe"}, - {file = "SQLAlchemy-1.4.44-cp311-cp311-win_amd64.whl", hash = "sha256:7313e4acebb9ae88dbde14a8a177467a7625b7449306c03a3f9f309b30e163d0"}, - {file = "SQLAlchemy-1.4.44-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:17aee7bfcef7bf0dea92f10e5dfdd67418dcf6fe0759f520e168b605855c003e"}, - {file = "SQLAlchemy-1.4.44-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9470633395e5f24d6741b4c8a6e905bce405a28cf417bba4ccbaadf3dab0111d"}, - {file = "SQLAlchemy-1.4.44-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:393f51a09778e8984d735b59a810731394308b4038acdb1635397c2865dae2b6"}, - {file = "SQLAlchemy-1.4.44-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c7e3b9e01fdbe1ce3a165cc7e1ff52b24813ee79c6df6dee0d1e13888a97817e"}, - {file = "SQLAlchemy-1.4.44-cp36-cp36m-win32.whl", hash = "sha256:6a06c2506c41926d2769f7968759995f2505e31c5b5a0821e43ca5a3ddb0e8ae"}, - {file = "SQLAlchemy-1.4.44-cp36-cp36m-win_amd64.whl", hash = "sha256:3ca21b35b714ce36f4b8d1ee8d15f149db8eb43a472cf71600bf18dae32286e7"}, - {file = "SQLAlchemy-1.4.44-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:3cbdbed8cdcae0f83640a9c44fa02b45a6c61e149c58d45a63c9581aba62850f"}, - {file = "SQLAlchemy-1.4.44-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a22208c1982f1fe2ae82e5e4c3d4a6f2445a7a0d65fb7983a3d7cbbe3983f5a4"}, - {file = "SQLAlchemy-1.4.44-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d3b9ac11f36ab9a726097fba7c7f6384f0129aedb017f1d4d1d4fce9052a1320"}, - {file = "SQLAlchemy-1.4.44-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d654870a66027af3a26df1372cf7f002e161c6768ebe4c9c6fdc0da331cb5173"}, - {file = "SQLAlchemy-1.4.44-cp37-cp37m-win32.whl", hash = "sha256:0be9b479c5806cece01f1581726573a8d6515f8404e082c375b922c45cfc2a7b"}, - {file = "SQLAlchemy-1.4.44-cp37-cp37m-win_amd64.whl", hash = "sha256:3eba07f740488c3a125f17c092a81eeae24a6c7ec32ac9dbc52bf7afaf0c4f16"}, - {file = "SQLAlchemy-1.4.44-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:ad5f966623905ee33694680dda1b735544c99c7638f216045d21546d3d8c6f5b"}, - {file = "SQLAlchemy-1.4.44-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f68eab46649504eb95be36ca529aea16cd199f080726c28cbdbcbf23d20b2a2"}, - {file = "SQLAlchemy-1.4.44-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:21f3df74a0ab39e1255e94613556e33c1dc3b454059fe0b365ec3bbb9ed82e4a"}, - {file = "SQLAlchemy-1.4.44-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8080bc51a775627865e0f1dbfc0040ff4ace685f187f6036837e1727ba2ed10"}, - {file = "SQLAlchemy-1.4.44-cp38-cp38-win32.whl", hash = "sha256:b6a337a2643a41476fb6262059b8740f4b9a2ec29bf00ffb18c18c080f6e0aed"}, - {file = "SQLAlchemy-1.4.44-cp38-cp38-win_amd64.whl", hash = "sha256:b737fbeb2f78926d1f59964feb287bbbd050e7904766f87c8ce5cfb86e6d840c"}, - {file = "SQLAlchemy-1.4.44-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:c9aa372b295a36771cffc226b6517df3011a7d146ac22d19fa6a75f1cdf9d7e6"}, - {file = "SQLAlchemy-1.4.44-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:237067ba0ef45a518b64606e1807f7229969ad568288b110ed5f0ca714a3ed3a"}, - {file = "SQLAlchemy-1.4.44-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6d7e1b28342b45f19e3dea7873a9479e4a57e15095a575afca902e517fb89652"}, - {file = "SQLAlchemy-1.4.44-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94c0093678001f5d79f2dcbf3104c54d6c89e41ab50d619494c503a4d3f1aef2"}, - {file = "SQLAlchemy-1.4.44-cp39-cp39-win32.whl", hash = "sha256:7cf7c7adbf4417e3f46fc5a2dbf8395a5a69698217337086888f79700a12e93a"}, - {file = "SQLAlchemy-1.4.44-cp39-cp39-win_amd64.whl", hash = "sha256:d3b6d4588994da73567bb00af9d7224a16c8027865a8aab53ae9be83f9b7cbd1"}, - {file = "SQLAlchemy-1.4.44.tar.gz", hash = "sha256:2dda5f96719ae89b3ec0f1b79698d86eb9aecb1d54e990abb3fdd92c04b46a90"}, -] -stack-data = [ - {file = "stack_data-0.6.1-py3-none-any.whl", hash = "sha256:960cb054d6a1b2fdd9cbd529e365b3c163e8dabf1272e02cfe36b58403cff5c6"}, - {file = "stack_data-0.6.1.tar.gz", hash = "sha256:6c9a10eb5f342415fe085db551d673955611afb821551f554d91772415464315"}, -] -starlette = [ - {file = "starlette-0.20.4-py3-none-any.whl", hash = "sha256:c0414d5a56297d37f3db96a84034d61ce29889b9eaccf65eb98a0b39441fcaa3"}, - {file = "starlette-0.20.4.tar.gz", hash = "sha256:42fcf3122f998fefce3e2c5ad7e5edbf0f02cf685d646a83a08d404726af5084"}, -] -text-unidecode = [ - {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, - {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, -] -tokenize-rt = [ - {file = "tokenize_rt-5.0.0-py2.py3-none-any.whl", hash = "sha256:c67772c662c6b3dc65edf66808577968fb10badfc2042e3027196bed4daf9e5a"}, - {file = "tokenize_rt-5.0.0.tar.gz", hash = "sha256:3160bc0c3e8491312d0485171dea861fc160a240f5f5766b72a1165408d10740"}, -] -tornado = [ - {file = "tornado-6.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:20f638fd8cc85f3cbae3c732326e96addff0a15e22d80f049e00121651e82e72"}, - {file = "tornado-6.2-cp37-abi3-macosx_10_9_x86_64.whl", hash = "sha256:87dcafae3e884462f90c90ecc200defe5e580a7fbbb4365eda7c7c1eb809ebc9"}, - {file = "tornado-6.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba09ef14ca9893954244fd872798b4ccb2367c165946ce2dd7376aebdde8e3ac"}, - {file = "tornado-6.2-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b8150f721c101abdef99073bf66d3903e292d851bee51910839831caba341a75"}, - {file = "tornado-6.2-cp37-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3a2f5999215a3a06a4fc218026cd84c61b8b2b40ac5296a6db1f1451ef04c1e"}, - {file = "tornado-6.2-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:5f8c52d219d4995388119af7ccaa0bcec289535747620116a58d830e7c25d8a8"}, - {file = "tornado-6.2-cp37-abi3-musllinux_1_1_i686.whl", hash = "sha256:6fdfabffd8dfcb6cf887428849d30cf19a3ea34c2c248461e1f7d718ad30b66b"}, - {file = "tornado-6.2-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:1d54d13ab8414ed44de07efecb97d4ef7c39f7438cf5e976ccd356bebb1b5fca"}, - {file = "tornado-6.2-cp37-abi3-win32.whl", hash = "sha256:5c87076709343557ef8032934ce5f637dbb552efa7b21d08e89ae7619ed0eb23"}, - {file = "tornado-6.2-cp37-abi3-win_amd64.whl", hash = "sha256:e5f923aa6a47e133d1cf87d60700889d7eae68988704e20c75fb2d65677a8e4b"}, - {file = "tornado-6.2.tar.gz", hash = "sha256:9b630419bde84ec666bfd7ea0a4cb2a8a651c2d5cccdbdd1972a0c859dfc3c13"}, -] -traitlets = [ - {file = "traitlets-5.5.0-py3-none-any.whl", hash = "sha256:1201b2c9f76097195989cdf7f65db9897593b0dfd69e4ac96016661bb6f0d30f"}, - {file = "traitlets-5.5.0.tar.gz", hash = "sha256:b122f9ff2f2f6c1709dab289a05555be011c87828e911c0cf4074b85cb780a79"}, -] -typing-extensions = [ - {file = "typing_extensions-4.4.0-py3-none-any.whl", hash = "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"}, - {file = "typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"}, -] -ujson = [ - {file = "ujson-5.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ff4928dc1e9704b567171c16787238201fdbf023665573c12c02146fe1e02eec"}, - {file = "ujson-5.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1dc2f46c31ef22b0aaa28cd71be897bea271e700636658d573df9c43c49ebbd0"}, - {file = "ujson-5.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6019e3480d933d3698f2ecb4b46d64bfadd64e718f04fac36e681f3254b49a93"}, - {file = "ujson-5.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5179088ef6487c475604b7898731a6ddeeada7702cfb2162155b016703a8475"}, - {file = "ujson-5.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c04ae27e076d81a3839047d8eed57c1e17e361640616fd520d752375e3ba8f0c"}, - {file = "ujson-5.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:60a4b481978ea2aad8fe8af1ecc271624d01b3cf4b09e9b643dd2fe19c07634c"}, - {file = "ujson-5.5.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7a09d203983104918c62f2eef9406f24c355511f9217967df23e70fa7f5b54ff"}, - {file = "ujson-5.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b9812638d7aa8ecda2e8e1513fb4da999249603bffab7439a5f8f0bb362b0db"}, - {file = "ujson-5.5.0-cp310-cp310-win32.whl", hash = "sha256:33cd9084fefc74cbacf88c92fd260b61211e00bcde38d640c369e5dc34a2b4e1"}, - {file = "ujson-5.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:765d46f3d5e7a1d48075035e2d1a9164f683e3fccde834ca04602e6c588835bc"}, - {file = "ujson-5.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:278aa9d7cb56435c96d19f5d702e026bcf69f824e24b41e9b52706abd3565837"}, - {file = "ujson-5.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9585892091ae86045135d6a6129a644142d6a51b23e1428bb5de6d10bc0ce0c7"}, - {file = "ujson-5.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cdc46859024501c20ab74ad542cdf2f08b94b5ce384f2f569483fa3ed926d04"}, - {file = "ujson-5.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5bea13c73f36c4346808df3fa806596163a7962b6d28001ca2a391cab856089"}, - {file = "ujson-5.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3f3f4240d99d55eb97cb012e9adf401f5ed9cd827af0341ac44603832202b0d2"}, - {file = "ujson-5.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d93940664a5ccfd79f72dcb939b0c31a3479889f14f0eb95ec52976f8c0cae7d"}, - {file = "ujson-5.5.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:880c84ce59f49776cf120f77e7ca04877c97c6887917078dbc369eb47004d7cf"}, - {file = "ujson-5.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:977bf5be704a88d46bf5b228df8b44521b1f3119d741062191608b3a6a38f224"}, - {file = "ujson-5.5.0-cp311-cp311-win32.whl", hash = "sha256:e0b36257dc90194784531c3b922d8d31fb2b4d8e5adfd27aff4eee7174176365"}, - {file = "ujson-5.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:a34a5f034b339f69ef7f6a134c22d04b92e07b6ddc1dd65382e7e4ec65d6437d"}, - {file = "ujson-5.5.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f26544bc10c83a2ff9aa2e093500c1b473f327faae31fb468d591e5823333376"}, - {file = "ujson-5.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fd797a4837ba10671954e7c09010cec7aca67e09d193f4920a16beea5f66f65"}, - {file = "ujson-5.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d7cfac2547c93389fa303fc0c0eb6698825564e8389c41c9b60009c746207b6"}, - {file = "ujson-5.5.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4875cafc9a6482c04c7df52a725d1c41beb74913c0ff4ec8f189f1954a2afe9"}, - {file = "ujson-5.5.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0762a4fdf86e01f3f8d8b6b7158d01fdd870799ff3f402b676e358fcd879e7eb"}, - {file = "ujson-5.5.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6c7ae6e0778ab9610f5e80e0595957d101ab8de18c32a8c053a19943ef4831d0"}, - {file = "ujson-5.5.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:94874584b733a18b310b0e954d53168e62cd4a0fd9db85b1903f0902a7eb33e8"}, - {file = "ujson-5.5.0-cp37-cp37m-win32.whl", hash = "sha256:3b74467564814fbce322427a5664e6bcc7dae6dbc8acbef76300fe43ca4072ab"}, - {file = "ujson-5.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:59cdcd934385f36e8bd76aedc234371cc75c848d95bdce804ac8aa8744cfeffa"}, - {file = "ujson-5.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2e506ecf89b6b9d304362ccef770831ec242a52c89dab1b4aabf1ab0eb1d5ed6"}, - {file = "ujson-5.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:10095160dbe6bba8059ad6677a01da251431f4c68041bf796dcac0956b34f8f7"}, - {file = "ujson-5.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5035bb997d163f346c22abcec75190e7e756a5349e7c708bd3d5fd7066a9a854"}, - {file = "ujson-5.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7d12f2d2df195c8c4e49d2cdbad640353a856c62ca2c624d8b47aa33b65a2a2"}, - {file = "ujson-5.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a485117f97312bef45f5d79d2ff97eff4da503b8a04f3691f59d31141686459"}, - {file = "ujson-5.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:21678d7e068707e4d54bdfeb8c250ebc548b51e499aed778b22112ca31a79669"}, - {file = "ujson-5.5.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5a9b1320d8363a42d857fae8065a2174d38217cdd58cd8dc4f48d54e0591271e"}, - {file = "ujson-5.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:701e81e047f5c0cffd4ac828efca68b0bd270c616654966a051e9a5f836b385e"}, - {file = "ujson-5.5.0-cp38-cp38-win32.whl", hash = "sha256:1cef44ea4973344baed3d50a5da4a8843de3a6af7dea7fadf0a594e53ce5892f"}, - {file = "ujson-5.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:e510d288e613d6927796dfb728e13e4530fc83b9ccac5888a21f7860486eab21"}, - {file = "ujson-5.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e1135264bcd40965cd35b0869e36952f54825024befdc7a923df9a7d83cfd800"}, - {file = "ujson-5.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:703fd69d9cb21d6ec2086789df9be2cf8140a76ff127050c24007ea8940dcd3b"}, - {file = "ujson-5.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:849f2ff40264152f25589cb48ddb4a43d14db811f841ec73989bfc0c8c4853fa"}, - {file = "ujson-5.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf416a93e1331820c77e3429df26946dbd4fe105e9b487cd2d1b7298b75784a8"}, - {file = "ujson-5.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:593a0f6fb0e186c5ba65465ed6f6215a30d1efa898c25e74de1c8577a1bff6d0"}, - {file = "ujson-5.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7c20cc83b0df47129ec6ed8a47fa7dcfc309c5bad029464004162738502568bb"}, - {file = "ujson-5.5.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6f83be8257b2f2dd6dea5ee62cd28db90584da7a7af1fba77a2102fc7943638a"}, - {file = "ujson-5.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8141f654432cf75144d6103bfac2286b8adf23467201590b173a74535d6be22d"}, - {file = "ujson-5.5.0-cp39-cp39-win32.whl", hash = "sha256:3fe1aea596f9539fc20cd9e52f098c842afc090168824fd4ca9744fe13151a03"}, - {file = "ujson-5.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:a655f7b755cfc5c07f2116b6dcf0ba148c89adef9a6d40c1b0f1fada878c4345"}, - {file = "ujson-5.5.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f19f11055ba2961eb39bdb1ff15763a53fca4fa0b5b624da3c7a528e83cdd09c"}, - {file = "ujson-5.5.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d87c817b292efb748f1974f37e8bb8a8772ef92f05f84e507159360814bcc3f"}, - {file = "ujson-5.5.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f9681ec4c60d0da590552427d770636d9079038c30b265f507ccde23caa7823"}, - {file = "ujson-5.5.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f63d1ae1ca17bb2c847e298c7bcf084a73d56d434b4c50509fb93a4b4300b0b2"}, - {file = "ujson-5.5.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:95603eff711b8f3b9596e1c961dbeb745a792ba1904141612f194e07edd71e5f"}, - {file = "ujson-5.5.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2d90414e3b4b44b39825049185959488e084ea7fcaf6124afd5c00893938b09d"}, - {file = "ujson-5.5.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7471d4486f23518cff343f1eec6c68d1b977ed74c3e6cc3e1ac896b9b7d68645"}, - {file = "ujson-5.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee9a2c9a4b2421e77f8fe33ed0621dea03c66c710707553020b1e32f3afb6240"}, - {file = "ujson-5.5.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a8cb3c8637006c5bd8237ebb5992a76ba06e39988ad5cff2096227443e8fd6a"}, - {file = "ujson-5.5.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:d9c89c521dc90c7564358e525f849b93ad1d710553c1491f66b8cce8113bc901"}, - {file = "ujson-5.5.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2ab011e3556a9a1d9461bd686870c527327765ed02fe53550531d6609a8a33ff"}, - {file = "ujson-5.5.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:603607f56a0ee84d9cd2c7e9b1d29b18a70684b94ee34f07b9ffe8dc9c8a9f81"}, - {file = "ujson-5.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d75bef34e69e7effb7b4849e3f830e3174d2cc6ec7273503fdde111c222dc9b3"}, - {file = "ujson-5.5.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abfe83e082c9208891e2158c1b5044a650ecec408b823bf6bf16cd7f8085cafa"}, - {file = "ujson-5.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4ef4ab8352861b99bd7fedb1fc6df3ea7f7d5216c789ba6d859e4ea06f1a4c45"}, - {file = "ujson-5.5.0.tar.gz", hash = "sha256:b25077a971c7da47bd6846a912a747f6963776d90720c88603b1b55d81790780"}, -] -urllib3 = [ - {file = "urllib3-1.26.12-py2.py3-none-any.whl", hash = "sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997"}, - {file = "urllib3-1.26.12.tar.gz", hash = "sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e"}, -] -uvicorn = [ - {file = "uvicorn-0.18.3-py3-none-any.whl", hash = "sha256:0abd429ebb41e604ed8d2be6c60530de3408f250e8d2d84967d85ba9e86fe3af"}, - {file = "uvicorn-0.18.3.tar.gz", hash = "sha256:9a66e7c42a2a95222f76ec24a4b754c158261c4696e683b9dadc72b590e0311b"}, -] -uvloop = [ +files = [ {file = "uvloop-0.17.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ce9f61938d7155f79d3cb2ffa663147d4a76d16e08f65e2c66b77bd41b356718"}, {file = "uvloop-0.17.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:68532f4349fd3900b839f588972b3392ee56042e440dd5873dfbbcd2cc67617c"}, {file = "uvloop-0.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0949caf774b9fcefc7c5756bacbbbd3fc4c05a6b7eebc7c7ad6f825b23998d6d"}, @@ -2042,98 +2511,222 @@ uvloop = [ {file = "uvloop-0.17.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:30babd84706115626ea78ea5dbc7dd8d0d01a2e9f9b306d24ca4ed5796c66ded"}, {file = "uvloop-0.17.0.tar.gz", hash = "sha256:0ddf6baf9cf11a1a22c71487f39f15b2cf78eb5bde7e5b45fbb99e8a9d91b9e1"}, ] -watchfiles = [ - {file = "watchfiles-0.18.1-cp37-abi3-macosx_10_7_x86_64.whl", hash = "sha256:9891d3c94272108bcecf5597a592e61105279def1313521e637f2d5acbe08bc9"}, - {file = "watchfiles-0.18.1-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:7102342d60207fa635e24c02a51c6628bf0472e5fef067f78a612386840407fc"}, - {file = "watchfiles-0.18.1-cp37-abi3-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:00ea0081eca5e8e695cffbc3a726bb90da77f4e3f78ce29b86f0d95db4e70ef7"}, - {file = "watchfiles-0.18.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b8e6db99e49cd7125d8a4c9d33c0735eea7b75a942c6ad68b75be3e91c242fb"}, - {file = "watchfiles-0.18.1-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bc7c726855f04f22ac79131b51bf0c9f728cb2117419ed830a43828b2c4a5fcb"}, - {file = "watchfiles-0.18.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cbaff354d12235002e62d9d3fa8bcf326a8490c1179aa5c17195a300a9e5952f"}, - {file = "watchfiles-0.18.1-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:888db233e06907c555eccd10da99b9cd5ed45deca47e41766954292dc9f7b198"}, - {file = "watchfiles-0.18.1-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:dde79930d1b28f15994ad6613aa2865fc7a403d2bb14585a8714a53233b15717"}, - {file = "watchfiles-0.18.1-cp37-abi3-win32.whl", hash = "sha256:e2b2bdd26bf8d6ed90763e6020b475f7634f919dbd1730ea1b6f8cb88e21de5d"}, - {file = "watchfiles-0.18.1-cp37-abi3-win_amd64.whl", hash = "sha256:c541e0f2c3e95e83e4f84561c893284ba984e9d0025352057396d96dceb09f44"}, - {file = "watchfiles-0.18.1-cp37-abi3-win_arm64.whl", hash = "sha256:9a26272ef3e930330fc0c2c148cc29706cc2c40d25760c7ccea8d768a8feef8b"}, - {file = "watchfiles-0.18.1-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:9fb12a5e2b42e0b53769455ff93546e6bc9ab14007fbd436978d827a95ca5bd1"}, - {file = "watchfiles-0.18.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:548d6b42303d40264118178053c78820533b683b20dfbb254a8706ca48467357"}, - {file = "watchfiles-0.18.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e0d8fdfebc50ac7569358f5c75f2b98bb473befccf9498cf23b3e39993bb45a"}, - {file = "watchfiles-0.18.1-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:0f9a22fff1745e2bb930b1e971c4c5b67ea3b38ae17a6adb9019371f80961219"}, - {file = "watchfiles-0.18.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b02e7fa03cd4059dd61ff0600080a5a9e7a893a85cb8e5178943533656eec65e"}, - {file = "watchfiles-0.18.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a868ce2c7565137f852bd4c863a164dc81306cae7378dbdbe4e2aca51ddb8857"}, - {file = "watchfiles-0.18.1.tar.gz", hash = "sha256:4ec0134a5e31797eb3c6c624dbe9354f2a8ee9c720e0b46fc5b7bab472b7c6d4"}, -] -wcwidth = [ - {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, - {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"}, -] -websockets = [ - {file = "websockets-10.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d58804e996d7d2307173d56c297cf7bc132c52df27a3efaac5e8d43e36c21c48"}, - {file = "websockets-10.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc0b82d728fe21a0d03e65f81980abbbcb13b5387f733a1a870672c5be26edab"}, - {file = "websockets-10.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ba089c499e1f4155d2a3c2a05d2878a3428cf321c848f2b5a45ce55f0d7d310c"}, - {file = "websockets-10.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33d69ca7612f0ddff3316b0c7b33ca180d464ecac2d115805c044bf0a3b0d032"}, - {file = "websockets-10.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62e627f6b6d4aed919a2052efc408da7a545c606268d5ab5bfab4432734b82b4"}, - {file = "websockets-10.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ea7b82bfcae927eeffc55d2ffa31665dc7fec7b8dc654506b8e5a518eb4d50"}, - {file = "websockets-10.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e0cb5cc6ece6ffa75baccfd5c02cffe776f3f5c8bf486811f9d3ea3453676ce8"}, - {file = "websockets-10.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ae5e95cfb53ab1da62185e23b3130e11d64431179debac6dc3c6acf08760e9b1"}, - {file = "websockets-10.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7c584f366f46ba667cfa66020344886cf47088e79c9b9d39c84ce9ea98aaa331"}, - {file = "websockets-10.4-cp310-cp310-win32.whl", hash = "sha256:b029fb2032ae4724d8ae8d4f6b363f2cc39e4c7b12454df8df7f0f563ed3e61a"}, - {file = "websockets-10.4-cp310-cp310-win_amd64.whl", hash = "sha256:8dc96f64ae43dde92530775e9cb169979f414dcf5cff670455d81a6823b42089"}, - {file = "websockets-10.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:47a2964021f2110116cc1125b3e6d87ab5ad16dea161949e7244ec583b905bb4"}, - {file = "websockets-10.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e789376b52c295c4946403bd0efecf27ab98f05319df4583d3c48e43c7342c2f"}, - {file = "websockets-10.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7d3f0b61c45c3fa9a349cf484962c559a8a1d80dae6977276df8fd1fa5e3cb8c"}, - {file = "websockets-10.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f55b5905705725af31ccef50e55391621532cd64fbf0bc6f4bac935f0fccec46"}, - {file = "websockets-10.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00c870522cdb69cd625b93f002961ffb0c095394f06ba8c48f17eef7c1541f96"}, - {file = "websockets-10.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f38706e0b15d3c20ef6259fd4bc1700cd133b06c3c1bb108ffe3f8947be15fa"}, - {file = "websockets-10.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f2c38d588887a609191d30e902df2a32711f708abfd85d318ca9b367258cfd0c"}, - {file = "websockets-10.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:fe10ddc59b304cb19a1bdf5bd0a7719cbbc9fbdd57ac80ed436b709fcf889106"}, - {file = "websockets-10.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:90fcf8929836d4a0e964d799a58823547df5a5e9afa83081761630553be731f9"}, - {file = "websockets-10.4-cp311-cp311-win32.whl", hash = "sha256:b9968694c5f467bf67ef97ae7ad4d56d14be2751000c1207d31bf3bb8860bae8"}, - {file = "websockets-10.4-cp311-cp311-win_amd64.whl", hash = "sha256:a7a240d7a74bf8d5cb3bfe6be7f21697a28ec4b1a437607bae08ac7acf5b4882"}, - {file = "websockets-10.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:74de2b894b47f1d21cbd0b37a5e2b2392ad95d17ae983e64727e18eb281fe7cb"}, - {file = "websockets-10.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3a686ecb4aa0d64ae60c9c9f1a7d5d46cab9bfb5d91a2d303d00e2cd4c4c5cc"}, - {file = "websockets-10.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0d15c968ea7a65211e084f523151dbf8ae44634de03c801b8bd070b74e85033"}, - {file = "websockets-10.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00213676a2e46b6ebf6045bc11d0f529d9120baa6f58d122b4021ad92adabd41"}, - {file = "websockets-10.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:e23173580d740bf8822fd0379e4bf30aa1d5a92a4f252d34e893070c081050df"}, - {file = "websockets-10.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:dd500e0a5e11969cdd3320935ca2ff1e936f2358f9c2e61f100a1660933320ea"}, - {file = "websockets-10.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4239b6027e3d66a89446908ff3027d2737afc1a375f8fd3eea630a4842ec9a0c"}, - {file = "websockets-10.4-cp37-cp37m-win32.whl", hash = "sha256:8a5cc00546e0a701da4639aa0bbcb0ae2bb678c87f46da01ac2d789e1f2d2038"}, - {file = "websockets-10.4-cp37-cp37m-win_amd64.whl", hash = "sha256:a9f9a735deaf9a0cadc2d8c50d1a5bcdbae8b6e539c6e08237bc4082d7c13f28"}, - {file = "websockets-10.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5c1289596042fad2cdceb05e1ebf7aadf9995c928e0da2b7a4e99494953b1b94"}, - {file = "websockets-10.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0cff816f51fb33c26d6e2b16b5c7d48eaa31dae5488ace6aae468b361f422b63"}, - {file = "websockets-10.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:dd9becd5fe29773d140d68d607d66a38f60e31b86df75332703757ee645b6faf"}, - {file = "websockets-10.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45ec8e75b7dbc9539cbfafa570742fe4f676eb8b0d3694b67dabe2f2ceed8aa6"}, - {file = "websockets-10.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f72e5cd0f18f262f5da20efa9e241699e0cf3a766317a17392550c9ad7b37d8"}, - {file = "websockets-10.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:185929b4808b36a79c65b7865783b87b6841e852ef5407a2fb0c03381092fa3b"}, - {file = "websockets-10.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7d27a7e34c313b3a7f91adcd05134315002aaf8540d7b4f90336beafaea6217c"}, - {file = "websockets-10.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:884be66c76a444c59f801ac13f40c76f176f1bfa815ef5b8ed44321e74f1600b"}, - {file = "websockets-10.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:931c039af54fc195fe6ad536fde4b0de04da9d5916e78e55405436348cfb0e56"}, - {file = "websockets-10.4-cp38-cp38-win32.whl", hash = "sha256:db3c336f9eda2532ec0fd8ea49fef7a8df8f6c804cdf4f39e5c5c0d4a4ad9a7a"}, - {file = "websockets-10.4-cp38-cp38-win_amd64.whl", hash = "sha256:48c08473563323f9c9debac781ecf66f94ad5a3680a38fe84dee5388cf5acaf6"}, - {file = "websockets-10.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:40e826de3085721dabc7cf9bfd41682dadc02286d8cf149b3ad05bff89311e4f"}, - {file = "websockets-10.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:56029457f219ade1f2fc12a6504ea61e14ee227a815531f9738e41203a429112"}, - {file = "websockets-10.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f5fc088b7a32f244c519a048c170f14cf2251b849ef0e20cbbb0fdf0fdaf556f"}, - {file = "websockets-10.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fc8709c00704194213d45e455adc106ff9e87658297f72d544220e32029cd3d"}, - {file = "websockets-10.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0154f7691e4fe6c2b2bc275b5701e8b158dae92a1ab229e2b940efe11905dff4"}, - {file = "websockets-10.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c6d2264f485f0b53adf22697ac11e261ce84805c232ed5dbe6b1bcb84b00ff0"}, - {file = "websockets-10.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9bc42e8402dc5e9905fb8b9649f57efcb2056693b7e88faa8fb029256ba9c68c"}, - {file = "websockets-10.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:edc344de4dac1d89300a053ac973299e82d3db56330f3494905643bb68801269"}, - {file = "websockets-10.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:84bc2a7d075f32f6ed98652db3a680a17a4edb21ca7f80fe42e38753a58ee02b"}, - {file = "websockets-10.4-cp39-cp39-win32.whl", hash = "sha256:c94ae4faf2d09f7c81847c63843f84fe47bf6253c9d60b20f25edfd30fb12588"}, - {file = "websockets-10.4-cp39-cp39-win_amd64.whl", hash = "sha256:bbccd847aa0c3a69b5f691a84d2341a4f8a629c6922558f2a70611305f902d74"}, - {file = "websockets-10.4-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:82ff5e1cae4e855147fd57a2863376ed7454134c2bf49ec604dfe71e446e2193"}, - {file = "websockets-10.4-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d210abe51b5da0ffdbf7b43eed0cfdff8a55a1ab17abbec4301c9ff077dd0342"}, - {file = "websockets-10.4-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:942de28af58f352a6f588bc72490ae0f4ccd6dfc2bd3de5945b882a078e4e179"}, - {file = "websockets-10.4-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9b27d6c1c6cd53dc93614967e9ce00ae7f864a2d9f99fe5ed86706e1ecbf485"}, - {file = "websockets-10.4-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:3d3cac3e32b2c8414f4f87c1b2ab686fa6284a980ba283617404377cd448f631"}, - {file = "websockets-10.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:da39dd03d130162deb63da51f6e66ed73032ae62e74aaccc4236e30edccddbb0"}, - {file = "websockets-10.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:389f8dbb5c489e305fb113ca1b6bdcdaa130923f77485db5b189de343a179393"}, - {file = "websockets-10.4-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09a1814bb15eff7069e51fed0826df0bc0702652b5cb8f87697d469d79c23576"}, - {file = "websockets-10.4-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff64a1d38d156d429404aaa84b27305e957fd10c30e5880d1765c9480bea490f"}, - {file = "websockets-10.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:b343f521b047493dc4022dd338fc6db9d9282658862756b4f6fd0e996c1380e1"}, - {file = "websockets-10.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:932af322458da7e4e35df32f050389e13d3d96b09d274b22a7aa1808f292fee4"}, - {file = "websockets-10.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6a4162139374a49eb18ef5b2f4da1dd95c994588f5033d64e0bbfda4b6b6fcf"}, - {file = "websockets-10.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c57e4c1349fbe0e446c9fa7b19ed2f8a4417233b6984277cce392819123142d3"}, - {file = "websockets-10.4-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b627c266f295de9dea86bd1112ed3d5fafb69a348af30a2422e16590a8ecba13"}, - {file = "websockets-10.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:05a7233089f8bd355e8cbe127c2e8ca0b4ea55467861906b80d2ebc7db4d6b72"}, - {file = "websockets-10.4.tar.gz", hash = "sha256:eef610b23933c54d5d921c92578ae5f89813438fded840c2e9809d378dc765d3"}, + +[package.extras] +dev = ["Cython (>=0.29.32,<0.30.0)", "Sphinx (>=4.1.2,<4.2.0)", "aiohttp", "flake8 (>=3.9.2,<3.10.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=22.0.0,<22.1.0)", "pycodestyle (>=2.7.0,<2.8.0)", "pytest (>=3.6.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] +docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] +test = ["Cython (>=0.29.32,<0.30.0)", "aiohttp", "flake8 (>=3.9.2,<3.10.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=22.0.0,<22.1.0)", "pycodestyle (>=2.7.0,<2.8.0)"] + +[[package]] +name = "watchfiles" +version = "0.19.0" +description = "Simple, modern and high performance file watching and code reload in python." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "watchfiles-0.19.0-cp37-abi3-macosx_10_7_x86_64.whl", hash = "sha256:91633e64712df3051ca454ca7d1b976baf842d7a3640b87622b323c55f3345e7"}, + {file = "watchfiles-0.19.0-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:b6577b8c6c8701ba8642ea9335a129836347894b666dd1ec2226830e263909d3"}, + {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:18b28f6ad871b82df9542ff958d0c86bb0d8310bb09eb8e87d97318a3b5273af"}, + {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fac19dc9cbc34052394dbe81e149411a62e71999c0a19e1e09ce537867f95ae0"}, + {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:09ea3397aecbc81c19ed7f025e051a7387feefdb789cf768ff994c1228182fda"}, + {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c0376deac92377817e4fb8f347bf559b7d44ff556d9bc6f6208dd3f79f104aaf"}, + {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c75eff897786ee262c9f17a48886f4e98e6cfd335e011c591c305e5d083c056"}, + {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb5d45c4143c1dd60f98a16187fd123eda7248f84ef22244818c18d531a249d1"}, + {file = "watchfiles-0.19.0-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:79c533ff593db861ae23436541f481ec896ee3da4e5db8962429b441bbaae16e"}, + {file = "watchfiles-0.19.0-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:3d7d267d27aceeeaa3de0dd161a0d64f0a282264d592e335fff7958cc0cbae7c"}, + {file = "watchfiles-0.19.0-cp37-abi3-win32.whl", hash = "sha256:176a9a7641ec2c97b24455135d58012a5be5c6217fc4d5fef0b2b9f75dbf5154"}, + {file = "watchfiles-0.19.0-cp37-abi3-win_amd64.whl", hash = "sha256:945be0baa3e2440151eb3718fd8846751e8b51d8de7b884c90b17d271d34cae8"}, + {file = "watchfiles-0.19.0-cp37-abi3-win_arm64.whl", hash = "sha256:0089c6dc24d436b373c3c57657bf4f9a453b13767150d17284fc6162b2791911"}, + {file = "watchfiles-0.19.0-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:cae3dde0b4b2078f31527acff6f486e23abed307ba4d3932466ba7cdd5ecec79"}, + {file = "watchfiles-0.19.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:7f3920b1285a7d3ce898e303d84791b7bf40d57b7695ad549dc04e6a44c9f120"}, + {file = "watchfiles-0.19.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9afd0d69429172c796164fd7fe8e821ade9be983f51c659a38da3faaaaac44dc"}, + {file = "watchfiles-0.19.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68dce92b29575dda0f8d30c11742a8e2b9b8ec768ae414b54f7453f27bdf9545"}, + {file = "watchfiles-0.19.0-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:5569fc7f967429d4bc87e355cdfdcee6aabe4b620801e2cf5805ea245c06097c"}, + {file = "watchfiles-0.19.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:5471582658ea56fca122c0f0d0116a36807c63fefd6fdc92c71ca9a4491b6b48"}, + {file = "watchfiles-0.19.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b538014a87f94d92f98f34d3e6d2635478e6be6423a9ea53e4dd96210065e193"}, + {file = "watchfiles-0.19.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20b44221764955b1e703f012c74015306fb7e79a00c15370785f309b1ed9aa8d"}, + {file = "watchfiles-0.19.0.tar.gz", hash = "sha256:d9b073073e048081e502b6c6b0b88714c026a1a4c890569238d04aca5f9ca74b"}, ] + +[package.dependencies] +anyio = ">=3.0.0" + +[[package]] +name = "wcwidth" +version = "0.2.6" +description = "Measures the displayed width of unicode strings in a terminal" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "wcwidth-0.2.6-py2.py3-none-any.whl", hash = "sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e"}, + {file = "wcwidth-0.2.6.tar.gz", hash = "sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0"}, +] + +[[package]] +name = "websockets" +version = "11.0.3" +description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3ccc8a0c387629aec40f2fc9fdcb4b9d5431954f934da3eaf16cdc94f67dbfac"}, + {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d67ac60a307f760c6e65dad586f556dde58e683fab03323221a4e530ead6f74d"}, + {file = "websockets-11.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84d27a4832cc1a0ee07cdcf2b0629a8a72db73f4cf6de6f0904f6661227f256f"}, + {file = "websockets-11.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffd7dcaf744f25f82190856bc26ed81721508fc5cbf2a330751e135ff1283564"}, + {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7622a89d696fc87af8e8d280d9b421db5133ef5b29d3f7a1ce9f1a7bf7fcfa11"}, + {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bceab846bac555aff6427d060f2fcfff71042dba6f5fca7dc4f75cac815e57ca"}, + {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:54c6e5b3d3a8936a4ab6870d46bdd6ec500ad62bde9e44462c32d18f1e9a8e54"}, + {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:41f696ba95cd92dc047e46b41b26dd24518384749ed0d99bea0a941ca87404c4"}, + {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:86d2a77fd490ae3ff6fae1c6ceaecad063d3cc2320b44377efdde79880e11526"}, + {file = "websockets-11.0.3-cp310-cp310-win32.whl", hash = "sha256:2d903ad4419f5b472de90cd2d40384573b25da71e33519a67797de17ef849b69"}, + {file = "websockets-11.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:1d2256283fa4b7f4c7d7d3e84dc2ece74d341bce57d5b9bf385df109c2a1a82f"}, + {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e848f46a58b9fcf3d06061d17be388caf70ea5b8cc3466251963c8345e13f7eb"}, + {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa5003845cdd21ac0dc6c9bf661c5beddd01116f6eb9eb3c8e272353d45b3288"}, + {file = "websockets-11.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b58cbf0697721120866820b89f93659abc31c1e876bf20d0b3d03cef14faf84d"}, + {file = "websockets-11.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:660e2d9068d2bedc0912af508f30bbeb505bbbf9774d98def45f68278cea20d3"}, + {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c1f0524f203e3bd35149f12157438f406eff2e4fb30f71221c8a5eceb3617b6b"}, + {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:def07915168ac8f7853812cc593c71185a16216e9e4fa886358a17ed0fd9fcf6"}, + {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b30c6590146e53149f04e85a6e4fcae068df4289e31e4aee1fdf56a0dead8f97"}, + {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:619d9f06372b3a42bc29d0cd0354c9bb9fb39c2cbc1a9c5025b4538738dbffaf"}, + {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:01f5567d9cf6f502d655151645d4e8b72b453413d3819d2b6f1185abc23e82dd"}, + {file = "websockets-11.0.3-cp311-cp311-win32.whl", hash = "sha256:e1459677e5d12be8bbc7584c35b992eea142911a6236a3278b9b5ce3326f282c"}, + {file = "websockets-11.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:e7837cb169eca3b3ae94cc5787c4fed99eef74c0ab9506756eea335e0d6f3ed8"}, + {file = "websockets-11.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9f59a3c656fef341a99e3d63189852be7084c0e54b75734cde571182c087b152"}, + {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2529338a6ff0eb0b50c7be33dc3d0e456381157a31eefc561771ee431134a97f"}, + {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34fd59a4ac42dff6d4681d8843217137f6bc85ed29722f2f7222bd619d15e95b"}, + {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:332d126167ddddec94597c2365537baf9ff62dfcc9db4266f263d455f2f031cb"}, + {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6505c1b31274723ccaf5f515c1824a4ad2f0d191cec942666b3d0f3aa4cb4007"}, + {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f467ba0050b7de85016b43f5a22b46383ef004c4f672148a8abf32bc999a87f0"}, + {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9d9acd80072abcc98bd2c86c3c9cd4ac2347b5a5a0cae7ed5c0ee5675f86d9af"}, + {file = "websockets-11.0.3-cp37-cp37m-win32.whl", hash = "sha256:e590228200fcfc7e9109509e4d9125eace2042fd52b595dd22bbc34bb282307f"}, + {file = "websockets-11.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:b16fff62b45eccb9c7abb18e60e7e446998093cdcb50fed33134b9b6878836de"}, + {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fb06eea71a00a7af0ae6aefbb932fb8a7df3cb390cc217d51a9ad7343de1b8d0"}, + {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8a34e13a62a59c871064dfd8ffb150867e54291e46d4a7cf11d02c94a5275bae"}, + {file = "websockets-11.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4841ed00f1026dfbced6fca7d963c4e7043aa832648671b5138008dc5a8f6d99"}, + {file = "websockets-11.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a073fc9ab1c8aff37c99f11f1641e16da517770e31a37265d2755282a5d28aa"}, + {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68b977f21ce443d6d378dbd5ca38621755f2063d6fdb3335bda981d552cfff86"}, + {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1a99a7a71631f0efe727c10edfba09ea6bee4166a6f9c19aafb6c0b5917d09c"}, + {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bee9fcb41db2a23bed96c6b6ead6489702c12334ea20a297aa095ce6d31370d0"}, + {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4b253869ea05a5a073ebfdcb5cb3b0266a57c3764cf6fe114e4cd90f4bfa5f5e"}, + {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1553cb82942b2a74dd9b15a018dce645d4e68674de2ca31ff13ebc2d9f283788"}, + {file = "websockets-11.0.3-cp38-cp38-win32.whl", hash = "sha256:f61bdb1df43dc9c131791fbc2355535f9024b9a04398d3bd0684fc16ab07df74"}, + {file = "websockets-11.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:03aae4edc0b1c68498f41a6772d80ac7c1e33c06c6ffa2ac1c27a07653e79d6f"}, + {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:777354ee16f02f643a4c7f2b3eff8027a33c9861edc691a2003531f5da4f6bc8"}, + {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8c82f11964f010053e13daafdc7154ce7385ecc538989a354ccc7067fd7028fd"}, + {file = "websockets-11.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3580dd9c1ad0701169e4d6fc41e878ffe05e6bdcaf3c412f9d559389d0c9e016"}, + {file = "websockets-11.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f1a3f10f836fab6ca6efa97bb952300b20ae56b409414ca85bff2ad241d2a61"}, + {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df41b9bc27c2c25b486bae7cf42fccdc52ff181c8c387bfd026624a491c2671b"}, + {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:279e5de4671e79a9ac877427f4ac4ce93751b8823f276b681d04b2156713b9dd"}, + {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1fdf26fa8a6a592f8f9235285b8affa72748dc12e964a5518c6c5e8f916716f7"}, + {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:69269f3a0b472e91125b503d3c0b3566bda26da0a3261c49f0027eb6075086d1"}, + {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:97b52894d948d2f6ea480171a27122d77af14ced35f62e5c892ca2fae9344311"}, + {file = "websockets-11.0.3-cp39-cp39-win32.whl", hash = "sha256:c7f3cb904cce8e1be667c7e6fef4516b98d1a6a0635a58a57528d577ac18a128"}, + {file = "websockets-11.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c792ea4eabc0159535608fc5658a74d1a81020eb35195dd63214dcf07556f67e"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f2e58f2c36cc52d41f2659e4c0cbf7353e28c8c9e63e30d8c6d3494dc9fdedcf"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de36fe9c02995c7e6ae6efe2e205816f5f00c22fd1fbf343d4d18c3d5ceac2f5"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ac56b661e60edd453585f4bd68eb6a29ae25b5184fd5ba51e97652580458998"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e052b8467dd07d4943936009f46ae5ce7b908ddcac3fda581656b1b19c083d9b"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:42cc5452a54a8e46a032521d7365da775823e21bfba2895fb7b77633cce031bb"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e6316827e3e79b7b8e7d8e3b08f4e331af91a48e794d5d8b099928b6f0b85f20"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8531fdcad636d82c517b26a448dcfe62f720e1922b33c81ce695d0edb91eb931"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c114e8da9b475739dde229fd3bc6b05a6537a88a578358bc8eb29b4030fac9c9"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e063b1865974611313a3849d43f2c3f5368093691349cf3c7c8f8f75ad7cb280"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:92b2065d642bf8c0a82d59e59053dd2fdde64d4ed44efe4870fa816c1232647b"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0ee68fe502f9031f19d495dae2c268830df2760c0524cbac5d759921ba8c8e82"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcacf2c7a6c3a84e720d1bb2b543c675bf6c40e460300b628bab1b1efc7c034c"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b67c6f5e5a401fc56394f191f00f9b3811fe843ee93f4a70df3c389d1adf857d"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d5023a4b6a5b183dc838808087033ec5df77580485fc533e7dab2567851b0a4"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ed058398f55163a79bb9f06a90ef9ccc063b204bb346c4de78efc5d15abfe602"}, + {file = "websockets-11.0.3-py3-none-any.whl", hash = "sha256:6681ba9e7f8f3b19440921e99efbb40fc89f26cd71bf539e45d8c8a25c976dc6"}, + {file = "websockets-11.0.3.tar.gz", hash = "sha256:88fc51d9a26b10fc331be344f1781224a375b78488fc343620184e95a4b27016"}, +] + +[[package]] +name = "wheel" +version = "0.38.4" +description = "A built-package format for Python" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "wheel-0.38.4-py3-none-any.whl", hash = "sha256:b60533f3f5d530e971d6737ca6d58681ee434818fab630c83a734bb10c083ce8"}, + {file = "wheel-0.38.4.tar.gz", hash = "sha256:965f5259b566725405b05e7cf774052044b1ed30119b5d586b2703aafe8719ac"}, +] + +[package.extras] +test = ["pytest (>=3.0.0)"] + +[[package]] +name = "zope-event" +version = "4.6" +description = "Very basic event publishing system" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "zope.event-4.6-py2.py3-none-any.whl", hash = "sha256:73d9e3ef750cca14816a9c322c7250b0d7c9dbc337df5d1b807ff8d3d0b9e97c"}, + {file = "zope.event-4.6.tar.gz", hash = "sha256:81d98813046fc86cc4136e3698fee628a3282f9c320db18658c21749235fce80"}, +] + +[package.dependencies] +setuptools = "*" + +[package.extras] +docs = ["Sphinx"] +test = ["zope.testrunner"] + +[[package]] +name = "zope-interface" +version = "6.0" +description = "Interfaces for Python" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "zope.interface-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f299c020c6679cb389814a3b81200fe55d428012c5e76da7e722491f5d205990"}, + {file = "zope.interface-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ee4b43f35f5dc15e1fec55ccb53c130adb1d11e8ad8263d68b1284b66a04190d"}, + {file = "zope.interface-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a158846d0fca0a908c1afb281ddba88744d403f2550dc34405c3691769cdd85"}, + {file = "zope.interface-6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f72f23bab1848edb7472309e9898603141644faec9fd57a823ea6b4d1c4c8995"}, + {file = "zope.interface-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48f4d38cf4b462e75fac78b6f11ad47b06b1c568eb59896db5b6ec1094eb467f"}, + {file = "zope.interface-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:87b690bbee9876163210fd3f500ee59f5803e4a6607d1b1238833b8885ebd410"}, + {file = "zope.interface-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f2363e5fd81afb650085c6686f2ee3706975c54f331b426800b53531191fdf28"}, + {file = "zope.interface-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:af169ba897692e9cd984a81cb0f02e46dacdc07d6cf9fd5c91e81f8efaf93d52"}, + {file = "zope.interface-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa90bac61c9dc3e1a563e5babb3fd2c0c1c80567e815442ddbe561eadc803b30"}, + {file = "zope.interface-6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:89086c9d3490a0f265a3c4b794037a84541ff5ffa28bb9c24cc9f66566968464"}, + {file = "zope.interface-6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:809fe3bf1a91393abc7e92d607976bbb8586512913a79f2bf7d7ec15bd8ea518"}, + {file = "zope.interface-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:0ec9653825f837fbddc4e4b603d90269b501486c11800d7c761eee7ce46d1bbb"}, + {file = "zope.interface-6.0-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:790c1d9d8f9c92819c31ea660cd43c3d5451df1df61e2e814a6f99cebb292788"}, + {file = "zope.interface-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b39b8711578dcfd45fc0140993403b8a81e879ec25d53189f3faa1f006087dca"}, + {file = "zope.interface-6.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eba51599370c87088d8882ab74f637de0c4f04a6d08a312dce49368ba9ed5c2a"}, + {file = "zope.interface-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ee934f023f875ec2cfd2b05a937bd817efcc6c4c3f55c5778cbf78e58362ddc"}, + {file = "zope.interface-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:042f2381118b093714081fd82c98e3b189b68db38ee7d35b63c327c470ef8373"}, + {file = "zope.interface-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dfbbbf0809a3606046a41f8561c3eada9db811be94138f42d9135a5c47e75f6f"}, + {file = "zope.interface-6.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:424d23b97fa1542d7be882eae0c0fc3d6827784105264a8169a26ce16db260d8"}, + {file = "zope.interface-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e538f2d4a6ffb6edfb303ce70ae7e88629ac6e5581870e66c306d9ad7b564a58"}, + {file = "zope.interface-6.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12175ca6b4db7621aedd7c30aa7cfa0a2d65ea3a0105393e05482d7a2d367446"}, + {file = "zope.interface-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c3d7dfd897a588ec27e391edbe3dd320a03684457470415870254e714126b1f"}, + {file = "zope.interface-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:b3f543ae9d3408549a9900720f18c0194ac0fe810cecda2a584fd4dca2eb3bb8"}, + {file = "zope.interface-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d0583b75f2e70ec93f100931660328965bb9ff65ae54695fb3fa0a1255daa6f2"}, + {file = "zope.interface-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:23ac41d52fd15dd8be77e3257bc51bbb82469cf7f5e9a30b75e903e21439d16c"}, + {file = "zope.interface-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99856d6c98a326abbcc2363827e16bd6044f70f2ef42f453c0bd5440c4ce24e5"}, + {file = "zope.interface-6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1592f68ae11e557b9ff2bc96ac8fc30b187e77c45a3c9cd876e3368c53dc5ba8"}, + {file = "zope.interface-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4407b1435572e3e1610797c9203ad2753666c62883b921318c5403fb7139dec2"}, + {file = "zope.interface-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:5171eb073474a5038321409a630904fd61f12dd1856dd7e9d19cd6fe092cbbc5"}, + {file = "zope.interface-6.0.tar.gz", hash = "sha256:aab584725afd10c710b8f1e6e208dbee2d0ad009f57d674cb9d1b3964037275d"}, +] + +[package.dependencies] +setuptools = "*" + +[package.extras] +docs = ["Sphinx", "repoze.sphinx.autointerface"] +test = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] +testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] + +[metadata] +lock-version = "2.0" +python-versions = "^3.11" +content-hash = "6ec8de89b858b163e7c4fe09594d730dbe1bb8e7d85bf3d55f883482414832dc" diff --git a/backend/pyproject.toml b/backend/pyproject.toml index 1d578dc9..f881fd05 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -6,7 +6,7 @@ authors = ["Terry Crapts ", "Lars Musters 1% +last 2 versions +not dead +not ie 11 diff --git a/frontend-beheer/.editorconfig b/frontend-beheer/.editorconfig new file mode 100644 index 00000000..7053c49a --- /dev/null +++ b/frontend-beheer/.editorconfig @@ -0,0 +1,5 @@ +[*.{js,jsx,ts,tsx,vue}] +indent_style = space +indent_size = 2 +trim_trailing_whitespace = true +insert_final_newline = true diff --git a/frontend-beheer/.env b/frontend-beheer/.env new file mode 100644 index 00000000..1bd15da3 --- /dev/null +++ b/frontend-beheer/.env @@ -0,0 +1,2 @@ +VITE_BASE_URL='/webformulier' +VITE_APP_NAME='Algoritmeregister webformulier' diff --git a/frontend-beheer/.env.dummy b/frontend-beheer/.env.dummy new file mode 100644 index 00000000..31c68068 --- /dev/null +++ b/frontend-beheer/.env.dummy @@ -0,0 +1,2 @@ +VITE_BASE_URL='/webformulier' +VITE_APP_NAME= \ No newline at end of file diff --git a/frontend-beheer/.eslintrc.js b/frontend-beheer/.eslintrc.js new file mode 100644 index 00000000..1748a430 --- /dev/null +++ b/frontend-beheer/.eslintrc.js @@ -0,0 +1,38 @@ +module.exports = { + root: true, + env: { + node: true, + }, + ignorePatterns: ['**/public/*'], + extends: ['plugin:vue/vue3-recommended', '@vue/eslint-config-typescript'], + rules: { + 'vue/multi-word-component-names': 'off', + quotes: ['warn', 'single'], + 'object-curly-spacing': ['warn', 'always'], + semi: ['warn', 'never'], + 'comma-dangle': [ + 'warn', + { + arrays: 'always-multiline', + objects: 'always-multiline', + imports: 'always-multiline', + exports: 'always-multiline', + }, + ], + 'vue/max-attributes-per-line': [ + 'warn', + { + singleline: 2, + multiline: { + max: 1, + }, + }, + ], + 'vue/valid-v-slot': [ + 'error', + { + allowModifiers: true, + }, + ], + }, +} diff --git a/frontend-beheer/.gitignore b/frontend-beheer/.gitignore new file mode 100644 index 00000000..403adbc1 --- /dev/null +++ b/frontend-beheer/.gitignore @@ -0,0 +1,23 @@ +.DS_Store +node_modules +/dist + + +# local env files +.env.local +.env.*.local + +# Log files +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/frontend-beheer/Dockerfile b/frontend-beheer/Dockerfile new file mode 100644 index 00000000..6049f8dd --- /dev/null +++ b/frontend-beheer/Dockerfile @@ -0,0 +1,12 @@ +FROM harbor.cicd.s15m.nl/ocw-lsp-pub/nginxinc/nginx-unprivileged:1.21.6-alpine_lsp + +USER root +RUN apk update +RUN apk upgrade +RUN rm /etc/nginx/conf.d/default.conf +COPY ./frontend-beheer/dist /app/webformulier +COPY ./frontend-beheer/nginx /etc/nginx +CMD nginx -g "daemon off;" + +# Expose ports +EXPOSE 8080:8080 \ No newline at end of file diff --git a/frontend-beheer/README.md b/frontend-beheer/README.md new file mode 100644 index 00000000..50b30e02 --- /dev/null +++ b/frontend-beheer/README.md @@ -0,0 +1,44 @@ +# default + +## Project setup + +``` +# yarn +yarn + +# npm +npm install + +# pnpm +pnpm install +``` + +### Compiles and hot-reloads for development + +``` +# yarn +yarn dev + +# npm +npm run dev + +# pnpm +pnpm dev +``` + +### Compiles and minifies for production + +``` +# yarn +yarn build + +# npm +npm run build + +# pnpm +pnpm build +``` + +### Customize configuration + +See [Configuration Reference](https://vitejs.dev/config/). diff --git a/frontend-beheer/index.html b/frontend-beheer/index.html new file mode 100644 index 00000000..3322f813 --- /dev/null +++ b/frontend-beheer/index.html @@ -0,0 +1,16 @@ + + + + + + + + Aanleverportaal + + + +

    + + + + diff --git a/frontend-beheer/nginx/nginx.conf b/frontend-beheer/nginx/nginx.conf new file mode 100644 index 00000000..ebb45842 --- /dev/null +++ b/frontend-beheer/nginx/nginx.conf @@ -0,0 +1,32 @@ +user nginx; +worker_processes auto; +pid "/tmp/nginx.pid"; +events { worker_connections 1024; } +http { + include mime.types; + default_type application/octet-stream; + log_format main '[$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" '; + sendfile on; + keepalive_timeout 3600; + client_max_body_size 400m; + server { + server_tokens off; + listen 8080; + server_name localhost; + access_log /var/log/nginx/access.log main; + root /app/webformulier; + error_page 404 /index.html; + location = / { + try_files $uri $uri/ /index.html; + } + location /webformulier/ { + root /app; + } + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-Content-Type-Options nosniff always; + add_header Content-Security-Policy "default-src 'self'; connect-src 'self'; img-src 'self' data:; form-action 'self'; frame-ancestors 'self'; script-src 'self'; object-src 'self'; font-src 'self' https://cdn.jsdelivr.net https://fonts.gstatic.com; style-src 'self' https://cdn.jsdelivr.net https://fonts.googleapis.com 'nonce-eQw4j9WgXcB'" always; + add_header Referrer-Policy "no-referrer, strict-origin-when-cross-origin" always; + add_header Permissions-Policy "geolocation=(),midi=(),sync-xhr=(),microphone=(),camera=(),magnetometer=(),gyroscope=(),fullscreen=(self),payment=()" always; + } +} diff --git a/frontend-beheer/package-lock.json b/frontend-beheer/package-lock.json new file mode 100644 index 00000000..5723ed98 --- /dev/null +++ b/frontend-beheer/package-lock.json @@ -0,0 +1,4369 @@ +{ + "name": "frontend-beheer", + "version": "0.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "frontend-beheer", + "version": "0.0.0", + "dependencies": { + "@mdi/font": "7.0.96", + "@vueuse/core": "^9.13.0", + "axios": "^1.3.4", + "keycloak-js": "^21.0.1", + "pinia": "^2.0.23", + "roboto-fontface": "*", + "sass": "^1.59.3", + "vue": "^3.2.38", + "vue-router": "^4.0.0", + "vuetify": "^3.1.11", + "webfontloader": "^1.0.0" + }, + "devDependencies": { + "@types/node": "^18.11.9", + "@types/webfontloader": "^1.6.35", + "@vitejs/plugin-vue": "^3.0.3", + "@vue/eslint-config-typescript": "^11.0.0", + "eslint": "^8.7.0", + "eslint-plugin-vue": "^9.3.0", + "prettier": "^2.5.1", + "typescript": "^4.0.0", + "vite": "^3.0.9", + "vite-plugin-vuetify": "^1.0.0-alpha.12", + "vue-eslint-parser": "^8.0.0", + "vue-tsc": "^1.0.9" + } + }, + "node_modules/@babel/parser": { + "version": "7.21.4", + "integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.5.0", + "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.0.2", + "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.5.1", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.37.0", + "integrity": "sha512-x5vzdtOOGgFVDCUs81QRB2+liax8rFg3+7hqM+QhBG0/G3F1ZsoYl97UrqgHgQ9KKT7G6c4V+aTUCgu/n22v1A==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.8", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@mdi/font": { + "version": "7.0.96", + "integrity": "sha512-rzlxTfR64hqY8yiBzDjmANfcd8rv+T5C0Yedv/TWk2QyAQYdc66e0kaN1ipmnYU3RukHRTRcBARHzzm+tIhL7w==" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "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", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.15.11", + "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==", + "devOptional": true + }, + "node_modules/@types/semver": { + "version": "7.3.13", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dev": true + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", + "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==" + }, + "node_modules/@types/webfontloader": { + "version": "1.6.35", + "integrity": "sha512-IJlrsiDWq6KghQ7tPlL5tcwSUyOxLDceT+AFUY7Ylj0Fcv3/h3QkANqQxZ0B5mEpEKxhTw76vDmvrruSMV9n9Q==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.57.0", + "integrity": "sha512-itag0qpN6q2UMM6Xgk6xoHa0D0/P+M17THnr4SVgqn9Rgam5k/He33MA7/D7QoJcdMxHFyX7U9imaBonAX/6qA==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.57.0", + "@typescript-eslint/type-utils": "5.57.0", + "@typescript-eslint/utils": "5.57.0", + "debug": "^4.3.4", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.57.0", + "integrity": "sha512-orrduvpWYkgLCyAdNtR1QIWovcNZlEm6yL8nwH/eTxWLd8gsP+25pdLHYzL2QdkqrieaDwLpytHqycncv0woUQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.57.0", + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/typescript-estree": "5.57.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.57.0", + "integrity": "sha512-NANBNOQvllPlizl9LatX8+MHi7bx7WGIWYjPHDmQe5Si/0YEYfxSljJpoTyTWFTgRy3X8gLYSE4xQ2U+aCozSw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/visitor-keys": "5.57.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.57.0", + "integrity": "sha512-kxXoq9zOTbvqzLbdNKy1yFrxLC6GDJFE2Yuo3KqSwTmDOFjUGeWSakgoXT864WcK5/NAJkkONCiKb1ddsqhLXQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "5.57.0", + "@typescript-eslint/utils": "5.57.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.57.0", + "integrity": "sha512-mxsod+aZRSyLT+jiqHw1KK6xrANm19/+VFALVFP5qa/aiJnlP38qpyaTd0fEKhWvQk6YeNZ5LGwI1pDpBRBhtQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.57.0", + "integrity": "sha512-LTzQ23TV82KpO8HPnWuxM2V7ieXW8O142I7hQTxWIHDcCEIjtkat6H96PFkYBQqGFLW/G/eVVOB9Z8rcvdY/Vw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/visitor-keys": "5.57.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.57.0", + "integrity": "sha512-ps/4WohXV7C+LTSgAL5CApxvxbMkl9B9AUZRtnEFonpIxZDIT7wC1xfvuJONMidrkB9scs4zhtRyIwHh4+18kw==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.57.0", + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/typescript-estree": "5.57.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { + "version": "5.1.1", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/estraverse": { + "version": "4.3.0", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.57.0", + "integrity": "sha512-ery2g3k0hv5BLiKpPuwYt9KBkAp2ugT6VvyShXdLOkax895EC55sP0Tx5L0fZaQueiK3fBLvHVvEl3jFS5ia+g==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.57.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vitejs/plugin-vue": { + "version": "3.2.0", + "integrity": "sha512-E0tnaL4fr+qkdCNxJ+Xd0yM31UwMkQje76fsDVBBUCoGOUPexu2VDUYHL8P4CwV+zMvWw6nlRw19OnRKmYAJpw==", + "dev": true, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^3.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@volar/language-core": { + "version": "1.3.0-alpha.0", + "integrity": "sha512-W3uMzecHPcbwddPu4SJpUcPakRBK/y/BP+U0U6NiPpUX1tONLC4yCawt+QBJqtgJ+sfD6ztf5PyvPL3hQRqfOA==", + "dev": true, + "dependencies": { + "@volar/source-map": "1.3.0-alpha.0" + } + }, + "node_modules/@volar/source-map": { + "version": "1.3.0-alpha.0", + "integrity": "sha512-jSdizxWFvDTvkPYZnO6ew3sBZUnS0abKCbuopkc0JrIlFbznWC/fPH3iPFIMS8/IIkRxq1Jh9VVG60SmtsdaMQ==", + "dev": true, + "dependencies": { + "muggle-string": "^0.2.2" + } + }, + "node_modules/@volar/typescript": { + "version": "1.3.0-alpha.0", + "integrity": "sha512-5UItyW2cdH2mBLu4RrECRNJRgtvvzKrSCn2y3v/D61QwIDkGx4aeil6x8RFuUL5TFtV6QvVHXnsOHxNgd+sCow==", + "dev": true, + "dependencies": { + "@volar/language-core": "1.3.0-alpha.0" + } + }, + "node_modules/@volar/vue-language-core": { + "version": "1.2.0", + "integrity": "sha512-w7yEiaITh2WzKe6u8ZdeLKCUz43wdmY/OqAmsB/PGDvvhTcVhCJ6f0W/RprZL1IhqH8wALoWiwEh/Wer7ZviMQ==", + "dev": true, + "dependencies": { + "@volar/language-core": "1.3.0-alpha.0", + "@volar/source-map": "1.3.0-alpha.0", + "@vue/compiler-dom": "^3.2.47", + "@vue/compiler-sfc": "^3.2.47", + "@vue/reactivity": "^3.2.47", + "@vue/shared": "^3.2.47", + "minimatch": "^6.1.6", + "muggle-string": "^0.2.2", + "vue-template-compiler": "^2.7.14" + } + }, + "node_modules/@volar/vue-language-core/node_modules/brace-expansion": { + "version": "2.0.1", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@volar/vue-language-core/node_modules/minimatch": { + "version": "6.2.0", + "integrity": "sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@volar/vue-typescript": { + "version": "1.2.0", + "integrity": "sha512-zjmRi9y3J1EkG+pfuHp8IbHmibihrKK485cfzsHjiuvJMGrpkWvlO5WVEk8oslMxxeGC5XwBFE9AOlvh378EPA==", + "dev": true, + "dependencies": { + "@volar/typescript": "1.3.0-alpha.0", + "@volar/vue-language-core": "1.2.0" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.2.47", + "integrity": "sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==", + "dependencies": { + "@babel/parser": "^7.16.4", + "@vue/shared": "3.2.47", + "estree-walker": "^2.0.2", + "source-map": "^0.6.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.2.47", + "integrity": "sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==", + "dependencies": { + "@vue/compiler-core": "3.2.47", + "@vue/shared": "3.2.47" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.2.47", + "integrity": "sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==", + "dependencies": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.47", + "@vue/compiler-dom": "3.2.47", + "@vue/compiler-ssr": "3.2.47", + "@vue/reactivity-transform": "3.2.47", + "@vue/shared": "3.2.47", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7", + "postcss": "^8.1.10", + "source-map": "^0.6.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.2.47", + "integrity": "sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==", + "dependencies": { + "@vue/compiler-dom": "3.2.47", + "@vue/shared": "3.2.47" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.5.0", + "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==" + }, + "node_modules/@vue/eslint-config-typescript": { + "version": "11.0.2", + "integrity": "sha512-EiKud1NqlWmSapBFkeSrE994qpKx7/27uCGnhdqzllYDpQZroyX/O6bwjEpeuyKamvLbsGdO6PMR2faIf+zFnw==", + "dev": true, + "dependencies": { + "@typescript-eslint/eslint-plugin": "^5.0.0", + "@typescript-eslint/parser": "^5.0.0", + "vue-eslint-parser": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0", + "eslint-plugin-vue": "^9.0.0", + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/eslint-config-typescript/node_modules/vue-eslint-parser": { + "version": "9.1.1", + "integrity": "sha512-C2aI/r85Q6tYcz4dpgvrs4wH/MqVrRAVIdpYedrxnATDHHkb+TroeRcDpKWGZCx/OcECMWfz7tVwQ8e+Opy6rA==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.6" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.2.47", + "integrity": "sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==", + "dependencies": { + "@vue/shared": "3.2.47" + } + }, + "node_modules/@vue/reactivity-transform": { + "version": "3.2.47", + "integrity": "sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==", + "dependencies": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.47", + "@vue/shared": "3.2.47", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.2.47", + "integrity": "sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==", + "dependencies": { + "@vue/reactivity": "3.2.47", + "@vue/shared": "3.2.47" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.2.47", + "integrity": "sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==", + "dependencies": { + "@vue/runtime-core": "3.2.47", + "@vue/shared": "3.2.47", + "csstype": "^2.6.8" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.2.47", + "integrity": "sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==", + "dependencies": { + "@vue/compiler-ssr": "3.2.47", + "@vue/shared": "3.2.47" + }, + "peerDependencies": { + "vue": "3.2.47" + } + }, + "node_modules/@vue/shared": { + "version": "3.2.47", + "integrity": "sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==" + }, + "node_modules/@vuetify/loader-shared": { + "version": "1.7.1", + "integrity": "sha512-kLUvuAed6RCvkeeTNJzuy14pqnkur8lTuner7v7pNE/kVhPR97TuyXwBSBMR1cJeiLiOfu6SF5XlCYbXByEx1g==", + "devOptional": true, + "dependencies": { + "find-cache-dir": "^3.3.2", + "upath": "^2.0.1" + }, + "peerDependencies": { + "vue": "^3.0.0", + "vuetify": "^3.0.0-beta.4" + } + }, + "node_modules/@vueuse/core": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.13.0.tgz", + "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==", + "dependencies": { + "@types/web-bluetooth": "^0.0.16", + "@vueuse/metadata": "9.13.0", + "@vueuse/shared": "9.13.0", + "vue-demi": "*" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/metadata": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.13.0.tgz", + "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.13.0.tgz", + "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==", + "dependencies": { + "vue-demi": "*" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/acorn": { + "version": "8.8.2", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "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/ansi-regex": { + "version": "5.0.1", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "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", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/axios": { + "version": "1.3.4", + "integrity": "sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "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/chokidar": { + "version": "3.5.3", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "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", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "devOptional": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "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/cssesc": { + "version": "3.0.0", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "2.6.21", + "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" + }, + "node_modules/de-indent": { + "version": "1.0.2", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "devOptional": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/esbuild": { + "version": "0.15.18", + "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", + "devOptional": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.15.18", + "@esbuild/linux-loong64": "0.15.18", + "esbuild-android-64": "0.15.18", + "esbuild-android-arm64": "0.15.18", + "esbuild-darwin-64": "0.15.18", + "esbuild-darwin-arm64": "0.15.18", + "esbuild-freebsd-64": "0.15.18", + "esbuild-freebsd-arm64": "0.15.18", + "esbuild-linux-32": "0.15.18", + "esbuild-linux-64": "0.15.18", + "esbuild-linux-arm": "0.15.18", + "esbuild-linux-arm64": "0.15.18", + "esbuild-linux-mips64le": "0.15.18", + "esbuild-linux-ppc64le": "0.15.18", + "esbuild-linux-riscv64": "0.15.18", + "esbuild-linux-s390x": "0.15.18", + "esbuild-netbsd-64": "0.15.18", + "esbuild-openbsd-64": "0.15.18", + "esbuild-sunos-64": "0.15.18", + "esbuild-windows-32": "0.15.18", + "esbuild-windows-64": "0.15.18", + "esbuild-windows-arm64": "0.15.18" + } + }, + "node_modules/esbuild-linux-64": { + "version": "0.15.18", + "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.37.0", + "integrity": "sha512-NU3Ps9nI05GUoVMxcZx1J8CNR6xOvUT4jAUMH5+z8lpp3aEdPVCImKw6PWG4PY+Vfkpr+jvMpxs/qoE7wq0sPw==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.2", + "@eslint/js": "8.37.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.4.0", + "espree": "^9.5.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-vue": { + "version": "9.10.0", + "integrity": "sha512-2MgP31OBf8YilUvtakdVMc8xVbcMp7z7/iQj8LHVpXrSXHPXSJRUIGSPFI6b6pyCx/buKaFJ45ycqfHvQRiW2g==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.3.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.0.1", + "postcss-selector-parser": "^6.0.9", + "semver": "^7.3.5", + "vue-eslint-parser": "^9.0.1", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-plugin-vue/node_modules/vue-eslint-parser": { + "version": "9.1.1", + "integrity": "sha512-C2aI/r85Q6tYcz4dpgvrs4wH/MqVrRAVIdpYedrxnATDHHkb+TroeRcDpKWGZCx/OcECMWfz7tVwQ8e+Opy6rA==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.6" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.1.1", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.0", + "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/espree": { + "version": "9.5.1", + "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", + "dev": true, + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "node_modules/esutils": { + "version": "2.0.3", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "devOptional": 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/find-up": { + "version": "5.0.0", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/function-bind": { + "version": "1.1.1", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "devOptional": true + }, + "node_modules/glob": { + "version": "7.2.3", + "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/glob-parent": { + "version": "5.1.2", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "13.20.0", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "devOptional": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/he": { + "version": "1.2.0", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/ignore": { + "version": "5.2.4", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/immutable": { + "version": "4.3.0", + "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==" + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "devOptional": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/js-sdsl": { + "version": "4.4.0", + "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "node_modules/js-sha256": { + "version": "0.9.0", + "integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/keycloak-js": { + "version": "21.0.2", + "integrity": "sha512-i05i3VBPhQ867EgjA+OYPlf8YUPiUwtrU2zv4j8tvZIdRvhJY8f+mp1ZvRJl/GMRb+XhJs9BDknyBMrIspwDkw==", + "dependencies": { + "base64-js": "^1.5.1", + "js-sha256": "^0.9.0" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/magic-string": { + "version": "0.25.9", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "devOptional": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "devOptional": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "devOptional": true + }, + "node_modules/muggle-string": { + "version": "0.2.2", + "integrity": "sha512-YVE1mIJ4VpUMqZObFndk9CJu6DBJR/GB13p3tXuNbwD4XExaI5EOuRl6BHeIDxIqXZVxSfAC+y6U1Z/IxCfKUg==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.6", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "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/natural-compare": { + "version": "1.4.0", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/once": { + "version": "1.4.0", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "devOptional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "devOptional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "devOptional": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pinia": { + "version": "2.0.33", + "integrity": "sha512-HOj1yVV2itw6rNIrR2f7+MirGNxhORjrULL8GWgRwXsGSvEqIQ+SE0MYt6cwtpegzCda3i+rVTZM+AM7CG+kRg==", + "dependencies": { + "@vue/devtools-api": "^6.5.0", + "vue-demi": "*" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "@vue/composition-api": "^1.4.0", + "typescript": ">=4.4.4", + "vue": "^2.6.14 || ^3.2.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "devOptional": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "devOptional": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "devOptional": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "devOptional": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "devOptional": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss": { + "version": "8.4.21", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.11", + "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.8.7", + "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/punycode": { + "version": "2.3.0", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "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/readdirp": { + "version": "3.6.0", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.1", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "devOptional": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/roboto-fontface": { + "version": "0.10.0", + "integrity": "sha512-OlwfYEgA2RdboZohpldlvJ1xngOins5d7ejqnIBWr9KaMxsnBqotpptRXTyfNRLnFpqzX6sTDt+X+a+6udnU8g==" + }, + "node_modules/rollup": { + "version": "2.79.1", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "devOptional": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "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/sass": { + "version": "1.60.0", + "integrity": "sha512-updbwW6fNb5gGm8qMXzVO7V4sWf7LMXnMly/JEyfbfERbVH46Fn6q02BX7/eHTdKpE7d+oTkMMQpFWNUMfFbgQ==", + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/semver": { + "version": "7.3.8", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "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", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead" + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "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", + "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", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "devOptional": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tsutils": { + "version": "3.21.0", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "4.9.5", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "devOptional": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/upath": { + "version": "2.0.1", + "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", + "devOptional": true, + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/vite": { + "version": "3.2.5", + "integrity": "sha512-4mVEpXpSOgrssFZAOmGIr85wPHKvaDAcXqxVxVRZhljkJOMZi1ibLibzjLHzJvcok8BMguLc7g1W6W/GqZbLdQ==", + "devOptional": true, + "dependencies": { + "esbuild": "^0.15.9", + "postcss": "^8.4.18", + "resolve": "^1.22.1", + "rollup": "^2.79.1" + }, + "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/vite-plugin-vuetify": { + "version": "1.0.2", + "integrity": "sha512-MubIcKD33O8wtgQXlbEXE7ccTEpHZ8nPpe77y9Wy3my2MWw/PgehP9VqTp92BLqr0R1dSL970Lynvisx3UxBFw==", + "devOptional": true, + "dependencies": { + "@vuetify/loader-shared": "^1.7.1", + "debug": "^4.3.3", + "upath": "^2.0.1" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "vite": "^2.7.0 || ^3.0.0 || ^4.0.0", + "vuetify": "^3.0.0-beta.4" + } + }, + "node_modules/vue": { + "version": "3.2.47", + "integrity": "sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==", + "dependencies": { + "@vue/compiler-dom": "3.2.47", + "@vue/compiler-sfc": "3.2.47", + "@vue/runtime-dom": "3.2.47", + "@vue/server-renderer": "3.2.47", + "@vue/shared": "3.2.47" + } + }, + "node_modules/vue-demi": { + "version": "0.13.11", + "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/vue-eslint-parser": { + "version": "8.3.0", + "integrity": "sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==", + "dev": true, + "dependencies": { + "debug": "^4.3.2", + "eslint-scope": "^7.0.0", + "eslint-visitor-keys": "^3.1.0", + "espree": "^9.0.0", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/vue-router": { + "version": "4.1.6", + "integrity": "sha512-DYWYwsG6xNPmLq/FmZn8Ip+qrhFEzA14EI12MsMgVxvHFDYvlr4NXpVF5hrRH1wVcDP8fGi5F4rxuJSl8/r+EQ==", + "dependencies": { + "@vue/devtools-api": "^6.4.5" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/vue-template-compiler": { + "version": "2.7.14", + "integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==", + "dev": true, + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/vue-tsc": { + "version": "1.2.0", + "integrity": "sha512-rIlzqdrhyPYyLG9zxsVRa+JEseeS9s8F2BbVVVWRRsTZvJO2BbhLEb2HW3MY+DFma0378tnIqs+vfTzbcQtRFw==", + "dev": true, + "dependencies": { + "@volar/vue-language-core": "1.2.0", + "@volar/vue-typescript": "1.2.0" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": "*" + } + }, + "node_modules/vuetify": { + "version": "3.1.12", + "integrity": "sha512-6SOMWzNtziDdi/Noeg0l9Q5o20amIuqmj9V5W8fV1nCNdQUZsi6mt9iN+UcfjqwAaALS/z5Nbd4v5OJxy8M4Rw==", + "engines": { + "node": "^12.20 || >=14.13" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/johnleider" + }, + "peerDependencies": { + "vite-plugin-vuetify": "^1.0.0-alpha.12", + "vue": "^3.2.0", + "vue-i18n": "^9.0.0", + "webpack-plugin-vuetify": "^2.0.0-alpha.11" + }, + "peerDependenciesMeta": { + "vite-plugin-vuetify": { + "optional": true + }, + "vue-i18n": { + "optional": true + }, + "webpack-plugin-vuetify": { + "optional": true + } + } + }, + "node_modules/webfontloader": { + "version": "1.6.28", + "integrity": "sha512-Egb0oFEga6f+nSgasH3E0M405Pzn6y3/9tOVanv/DLfa1YBIgcv90L18YyWnvXkRbIM17v5Kv6IT2N6g1x5tvQ==" + }, + "node_modules/which": { + "version": "2.0.2", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, + "dependencies": { + "@babel/parser": { + "version": "7.21.4", + "integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==" + }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.5.0", + "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", + "dev": true + }, + "@eslint/eslintrc": { + "version": "2.0.2", + "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.5.1", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + } + }, + "@eslint/js": { + "version": "8.37.0", + "integrity": "sha512-x5vzdtOOGgFVDCUs81QRB2+liax8rFg3+7hqM+QhBG0/G3F1ZsoYl97UrqgHgQ9KKT7G6c4V+aTUCgu/n22v1A==", + "dev": true + }, + "@humanwhocodes/config-array": { + "version": "0.11.8", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + } + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "@mdi/font": { + "version": "7.0.96", + "integrity": "sha512-rzlxTfR64hqY8yiBzDjmANfcd8rv+T5C0Yedv/TWk2QyAQYdc66e0kaN1ipmnYU3RukHRTRcBARHzzm+tIhL7w==" + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "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", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@types/json-schema": { + "version": "7.0.11", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "@types/node": { + "version": "18.15.11", + "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==", + "devOptional": true + }, + "@types/semver": { + "version": "7.3.13", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dev": true + }, + "@types/web-bluetooth": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", + "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==" + }, + "@types/webfontloader": { + "version": "1.6.35", + "integrity": "sha512-IJlrsiDWq6KghQ7tPlL5tcwSUyOxLDceT+AFUY7Ylj0Fcv3/h3QkANqQxZ0B5mEpEKxhTw76vDmvrruSMV9n9Q==", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "5.57.0", + "integrity": "sha512-itag0qpN6q2UMM6Xgk6xoHa0D0/P+M17THnr4SVgqn9Rgam5k/He33MA7/D7QoJcdMxHFyX7U9imaBonAX/6qA==", + "dev": true, + "requires": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.57.0", + "@typescript-eslint/type-utils": "5.57.0", + "@typescript-eslint/utils": "5.57.0", + "debug": "^4.3.4", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/parser": { + "version": "5.57.0", + "integrity": "sha512-orrduvpWYkgLCyAdNtR1QIWovcNZlEm6yL8nwH/eTxWLd8gsP+25pdLHYzL2QdkqrieaDwLpytHqycncv0woUQ==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.57.0", + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/typescript-estree": "5.57.0", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.57.0", + "integrity": "sha512-NANBNOQvllPlizl9LatX8+MHi7bx7WGIWYjPHDmQe5Si/0YEYfxSljJpoTyTWFTgRy3X8gLYSE4xQ2U+aCozSw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/visitor-keys": "5.57.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.57.0", + "integrity": "sha512-kxXoq9zOTbvqzLbdNKy1yFrxLC6GDJFE2Yuo3KqSwTmDOFjUGeWSakgoXT864WcK5/NAJkkONCiKb1ddsqhLXQ==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "5.57.0", + "@typescript-eslint/utils": "5.57.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/types": { + "version": "5.57.0", + "integrity": "sha512-mxsod+aZRSyLT+jiqHw1KK6xrANm19/+VFALVFP5qa/aiJnlP38qpyaTd0fEKhWvQk6YeNZ5LGwI1pDpBRBhtQ==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.57.0", + "integrity": "sha512-LTzQ23TV82KpO8HPnWuxM2V7ieXW8O142I7hQTxWIHDcCEIjtkat6H96PFkYBQqGFLW/G/eVVOB9Z8rcvdY/Vw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/visitor-keys": "5.57.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/utils": { + "version": "5.57.0", + "integrity": "sha512-ps/4WohXV7C+LTSgAL5CApxvxbMkl9B9AUZRtnEFonpIxZDIT7wC1xfvuJONMidrkB9scs4zhtRyIwHh4+18kw==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.57.0", + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/typescript-estree": "5.57.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "dependencies": { + "eslint-scope": { + "version": "5.1.1", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "estraverse": { + "version": "4.3.0", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.57.0", + "integrity": "sha512-ery2g3k0hv5BLiKpPuwYt9KBkAp2ugT6VvyShXdLOkax895EC55sP0Tx5L0fZaQueiK3fBLvHVvEl3jFS5ia+g==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.57.0", + "eslint-visitor-keys": "^3.3.0" + } + }, + "@vitejs/plugin-vue": { + "version": "3.2.0", + "integrity": "sha512-E0tnaL4fr+qkdCNxJ+Xd0yM31UwMkQje76fsDVBBUCoGOUPexu2VDUYHL8P4CwV+zMvWw6nlRw19OnRKmYAJpw==", + "dev": true, + "requires": {} + }, + "@volar/language-core": { + "version": "1.3.0-alpha.0", + "integrity": "sha512-W3uMzecHPcbwddPu4SJpUcPakRBK/y/BP+U0U6NiPpUX1tONLC4yCawt+QBJqtgJ+sfD6ztf5PyvPL3hQRqfOA==", + "dev": true, + "requires": { + "@volar/source-map": "1.3.0-alpha.0" + } + }, + "@volar/source-map": { + "version": "1.3.0-alpha.0", + "integrity": "sha512-jSdizxWFvDTvkPYZnO6ew3sBZUnS0abKCbuopkc0JrIlFbznWC/fPH3iPFIMS8/IIkRxq1Jh9VVG60SmtsdaMQ==", + "dev": true, + "requires": { + "muggle-string": "^0.2.2" + } + }, + "@volar/typescript": { + "version": "1.3.0-alpha.0", + "integrity": "sha512-5UItyW2cdH2mBLu4RrECRNJRgtvvzKrSCn2y3v/D61QwIDkGx4aeil6x8RFuUL5TFtV6QvVHXnsOHxNgd+sCow==", + "dev": true, + "requires": { + "@volar/language-core": "1.3.0-alpha.0" + } + }, + "@volar/vue-language-core": { + "version": "1.2.0", + "integrity": "sha512-w7yEiaITh2WzKe6u8ZdeLKCUz43wdmY/OqAmsB/PGDvvhTcVhCJ6f0W/RprZL1IhqH8wALoWiwEh/Wer7ZviMQ==", + "dev": true, + "requires": { + "@volar/language-core": "1.3.0-alpha.0", + "@volar/source-map": "1.3.0-alpha.0", + "@vue/compiler-dom": "^3.2.47", + "@vue/compiler-sfc": "^3.2.47", + "@vue/reactivity": "^3.2.47", + "@vue/shared": "^3.2.47", + "minimatch": "^6.1.6", + "muggle-string": "^0.2.2", + "vue-template-compiler": "^2.7.14" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "6.2.0", + "integrity": "sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "@volar/vue-typescript": { + "version": "1.2.0", + "integrity": "sha512-zjmRi9y3J1EkG+pfuHp8IbHmibihrKK485cfzsHjiuvJMGrpkWvlO5WVEk8oslMxxeGC5XwBFE9AOlvh378EPA==", + "dev": true, + "requires": { + "@volar/typescript": "1.3.0-alpha.0", + "@volar/vue-language-core": "1.2.0" + } + }, + "@vue/compiler-core": { + "version": "3.2.47", + "integrity": "sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==", + "requires": { + "@babel/parser": "^7.16.4", + "@vue/shared": "3.2.47", + "estree-walker": "^2.0.2", + "source-map": "^0.6.1" + } + }, + "@vue/compiler-dom": { + "version": "3.2.47", + "integrity": "sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==", + "requires": { + "@vue/compiler-core": "3.2.47", + "@vue/shared": "3.2.47" + } + }, + "@vue/compiler-sfc": { + "version": "3.2.47", + "integrity": "sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==", + "requires": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.47", + "@vue/compiler-dom": "3.2.47", + "@vue/compiler-ssr": "3.2.47", + "@vue/reactivity-transform": "3.2.47", + "@vue/shared": "3.2.47", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7", + "postcss": "^8.1.10", + "source-map": "^0.6.1" + } + }, + "@vue/compiler-ssr": { + "version": "3.2.47", + "integrity": "sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==", + "requires": { + "@vue/compiler-dom": "3.2.47", + "@vue/shared": "3.2.47" + } + }, + "@vue/devtools-api": { + "version": "6.5.0", + "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==" + }, + "@vue/eslint-config-typescript": { + "version": "11.0.2", + "integrity": "sha512-EiKud1NqlWmSapBFkeSrE994qpKx7/27uCGnhdqzllYDpQZroyX/O6bwjEpeuyKamvLbsGdO6PMR2faIf+zFnw==", + "dev": true, + "requires": { + "@typescript-eslint/eslint-plugin": "^5.0.0", + "@typescript-eslint/parser": "^5.0.0", + "vue-eslint-parser": "^9.0.0" + }, + "dependencies": { + "vue-eslint-parser": { + "version": "9.1.1", + "integrity": "sha512-C2aI/r85Q6tYcz4dpgvrs4wH/MqVrRAVIdpYedrxnATDHHkb+TroeRcDpKWGZCx/OcECMWfz7tVwQ8e+Opy6rA==", + "dev": true, + "requires": { + "debug": "^4.3.4", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.6" + } + } + } + }, + "@vue/reactivity": { + "version": "3.2.47", + "integrity": "sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==", + "requires": { + "@vue/shared": "3.2.47" + } + }, + "@vue/reactivity-transform": { + "version": "3.2.47", + "integrity": "sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==", + "requires": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.47", + "@vue/shared": "3.2.47", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7" + } + }, + "@vue/runtime-core": { + "version": "3.2.47", + "integrity": "sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==", + "requires": { + "@vue/reactivity": "3.2.47", + "@vue/shared": "3.2.47" + } + }, + "@vue/runtime-dom": { + "version": "3.2.47", + "integrity": "sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==", + "requires": { + "@vue/runtime-core": "3.2.47", + "@vue/shared": "3.2.47", + "csstype": "^2.6.8" + } + }, + "@vue/server-renderer": { + "version": "3.2.47", + "integrity": "sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==", + "requires": { + "@vue/compiler-ssr": "3.2.47", + "@vue/shared": "3.2.47" + } + }, + "@vue/shared": { + "version": "3.2.47", + "integrity": "sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==" + }, + "@vuetify/loader-shared": { + "version": "1.7.1", + "integrity": "sha512-kLUvuAed6RCvkeeTNJzuy14pqnkur8lTuner7v7pNE/kVhPR97TuyXwBSBMR1cJeiLiOfu6SF5XlCYbXByEx1g==", + "devOptional": true, + "requires": { + "find-cache-dir": "^3.3.2", + "upath": "^2.0.1" + } + }, + "@vueuse/core": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.13.0.tgz", + "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==", + "requires": { + "@types/web-bluetooth": "^0.0.16", + "@vueuse/metadata": "9.13.0", + "@vueuse/shared": "9.13.0", + "vue-demi": "*" + } + }, + "@vueuse/metadata": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.13.0.tgz", + "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==" + }, + "@vueuse/shared": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.13.0.tgz", + "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==", + "requires": { + "vue-demi": "*" + } + }, + "acorn": { + "version": "8.8.2", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, + "ajv": { + "version": "6.12.6", + "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" + } + }, + "ansi-regex": { + "version": "5.0.1", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.3", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "argparse": { + "version": "2.0.1", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "array-union": { + "version": "2.1.0", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "axios": { + "version": "1.3.4", + "integrity": "sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==", + "requires": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "base64-js": { + "version": "1.5.1", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "binary-extensions": { + "version": "2.2.0", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + }, + "boolbase": { + "version": "1.0.0", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "callsites": { + "version": "3.1.0", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "chokidar": { + "version": "3.5.3", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "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" + } + }, + "color-convert": { + "version": "2.0.1", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commondir": { + "version": "1.0.1", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "devOptional": true + }, + "concat-map": { + "version": "0.0.1", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "cssesc": { + "version": "3.0.0", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "csstype": { + "version": "2.6.21", + "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" + }, + "de-indent": { + "version": "1.0.2", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true + }, + "debug": { + "version": "4.3.4", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "devOptional": true, + "requires": { + "ms": "2.1.2" + } + }, + "deep-is": { + "version": "0.1.4", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "dir-glob": { + "version": "3.0.1", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "esbuild": { + "version": "0.15.18", + "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", + "devOptional": true, + "requires": { + "@esbuild/android-arm": "0.15.18", + "@esbuild/linux-loong64": "0.15.18", + "esbuild-android-64": "0.15.18", + "esbuild-android-arm64": "0.15.18", + "esbuild-darwin-64": "0.15.18", + "esbuild-darwin-arm64": "0.15.18", + "esbuild-freebsd-64": "0.15.18", + "esbuild-freebsd-arm64": "0.15.18", + "esbuild-linux-32": "0.15.18", + "esbuild-linux-64": "0.15.18", + "esbuild-linux-arm": "0.15.18", + "esbuild-linux-arm64": "0.15.18", + "esbuild-linux-mips64le": "0.15.18", + "esbuild-linux-ppc64le": "0.15.18", + "esbuild-linux-riscv64": "0.15.18", + "esbuild-linux-s390x": "0.15.18", + "esbuild-netbsd-64": "0.15.18", + "esbuild-openbsd-64": "0.15.18", + "esbuild-sunos-64": "0.15.18", + "esbuild-windows-32": "0.15.18", + "esbuild-windows-64": "0.15.18", + "esbuild-windows-arm64": "0.15.18" + } + }, + "esbuild-linux-64": { + "version": "0.15.18", + "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==", + "optional": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint": { + "version": "8.37.0", + "integrity": "sha512-NU3Ps9nI05GUoVMxcZx1J8CNR6xOvUT4jAUMH5+z8lpp3aEdPVCImKw6PWG4PY+Vfkpr+jvMpxs/qoE7wq0sPw==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.2", + "@eslint/js": "8.37.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.4.0", + "espree": "^9.5.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "dependencies": { + "glob-parent": { + "version": "6.0.2", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + } + } + }, + "eslint-plugin-vue": { + "version": "9.10.0", + "integrity": "sha512-2MgP31OBf8YilUvtakdVMc8xVbcMp7z7/iQj8LHVpXrSXHPXSJRUIGSPFI6b6pyCx/buKaFJ45ycqfHvQRiW2g==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.3.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.0.1", + "postcss-selector-parser": "^6.0.9", + "semver": "^7.3.5", + "vue-eslint-parser": "^9.0.1", + "xml-name-validator": "^4.0.0" + }, + "dependencies": { + "vue-eslint-parser": { + "version": "9.1.1", + "integrity": "sha512-C2aI/r85Q6tYcz4dpgvrs4wH/MqVrRAVIdpYedrxnATDHHkb+TroeRcDpKWGZCx/OcECMWfz7tVwQ8e+Opy6rA==", + "dev": true, + "requires": { + "debug": "^4.3.4", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.6" + } + } + } + }, + "eslint-scope": { + "version": "7.1.1", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "eslint-visitor-keys": { + "version": "3.4.0", + "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", + "dev": true + }, + "espree": { + "version": "9.5.1", + "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", + "dev": true, + "requires": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.0" + } + }, + "esquery": { + "version": "1.5.0", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + } + }, + "esrecurse": { + "version": "4.3.0", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "estree-walker": { + "version": "2.0.2", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "esutils": { + "version": "2.0.3", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-glob": { + "version": "3.2.12", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "fastq": { + "version": "1.15.0", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-cache-dir": { + "version": "3.3.2", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "devOptional": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "5.0.0", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat-cache": { + "version": "3.0.4", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.7", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "follow-redirects": { + "version": "1.15.2", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + }, + "form-data": { + "version": "4.0.0", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "devOptional": true + }, + "glob": { + "version": "7.2.3", + "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" + } + }, + "glob-parent": { + "version": "5.1.2", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "13.20.0", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "globby": { + "version": "11.1.0", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "grapheme-splitter": { + "version": "1.0.4", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, + "has": { + "version": "1.0.3", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "devOptional": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "he": { + "version": "1.2.0", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "ignore": { + "version": "5.2.4", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true + }, + "immutable": { + "version": "4.3.0", + "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==" + }, + "import-fresh": { + "version": "3.3.0", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.11.0", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "devOptional": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + }, + "is-glob": { + "version": "4.0.3", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-path-inside": { + "version": "3.0.3", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "js-sdsl": { + "version": "4.4.0", + "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", + "dev": true + }, + "js-sha256": { + "version": "0.9.0", + "integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==" + }, + "js-yaml": { + "version": "4.1.0", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "keycloak-js": { + "version": "21.0.2", + "integrity": "sha512-i05i3VBPhQ867EgjA+OYPlf8YUPiUwtrU2zv4j8tvZIdRvhJY8f+mp1ZvRJl/GMRb+XhJs9BDknyBMrIspwDkw==", + "requires": { + "base64-js": "^1.5.1", + "js-sha256": "^0.9.0" + } + }, + "levn": { + "version": "0.4.1", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "locate-path": { + "version": "6.0.0", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "magic-string": { + "version": "0.25.9", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "requires": { + "sourcemap-codec": "^1.4.8" + } + }, + "make-dir": { + "version": "3.1.0", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "devOptional": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "devOptional": true + } + } + }, + "merge2": { + "version": "1.4.1", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime-db": { + "version": "1.52.0", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.1.2", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.1.2", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "devOptional": true + }, + "muggle-string": { + "version": "0.2.2", + "integrity": "sha512-YVE1mIJ4VpUMqZObFndk9CJu6DBJR/GB13p3tXuNbwD4XExaI5EOuRl6BHeIDxIqXZVxSfAC+y6U1Z/IxCfKUg==", + "dev": true + }, + "nanoid": { + "version": "3.3.6", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==" + }, + "natural-compare": { + "version": "1.4.0", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "natural-compare-lite": { + "version": "1.4.0", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "nth-check": { + "version": "2.1.1", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, + "once": { + "version": "1.4.0", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "optionator": { + "version": "0.9.1", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "p-limit": { + "version": "3.1.0", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "p-try": { + "version": "2.2.0", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "devOptional": true + }, + "parent-module": { + "version": "1.0.1", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "path-exists": { + "version": "4.0.0", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "devOptional": true + }, + "path-is-absolute": { + "version": "1.0.1", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "devOptional": true + }, + "path-type": { + "version": "4.0.0", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "picomatch": { + "version": "2.3.1", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "pinia": { + "version": "2.0.33", + "integrity": "sha512-HOj1yVV2itw6rNIrR2f7+MirGNxhORjrULL8GWgRwXsGSvEqIQ+SE0MYt6cwtpegzCda3i+rVTZM+AM7CG+kRg==", + "requires": { + "@vue/devtools-api": "^6.5.0", + "vue-demi": "*" + } + }, + "pkg-dir": { + "version": "4.2.0", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "devOptional": true, + "requires": { + "find-up": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "devOptional": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "devOptional": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "devOptional": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "devOptional": true, + "requires": { + "p-limit": "^2.2.0" + } + } + } + }, + "postcss": { + "version": "8.4.21", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "requires": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "postcss-selector-parser": { + "version": "6.0.11", + "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "prelude-ls": { + "version": "1.2.1", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prettier": { + "version": "2.8.7", + "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", + "dev": true + }, + "proxy-from-env": { + "version": "1.1.0", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "punycode": { + "version": "2.3.0", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "readdirp": { + "version": "3.6.0", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "requires": { + "picomatch": "^2.2.1" + } + }, + "resolve": { + "version": "1.22.1", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "devOptional": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-from": { + "version": "4.0.0", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "roboto-fontface": { + "version": "0.10.0", + "integrity": "sha512-OlwfYEgA2RdboZohpldlvJ1xngOins5d7ejqnIBWr9KaMxsnBqotpptRXTyfNRLnFpqzX6sTDt+X+a+6udnU8g==" + }, + "rollup": { + "version": "2.79.1", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "devOptional": true, + "requires": { + "fsevents": "~2.3.2" + } + }, + "run-parallel": { + "version": "1.2.0", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "sass": { + "version": "1.60.0", + "integrity": "sha512-updbwW6fNb5gGm8qMXzVO7V4sWf7LMXnMly/JEyfbfERbVH46Fn6q02BX7/eHTdKpE7d+oTkMMQpFWNUMfFbgQ==", + "requires": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + } + }, + "semver": { + "version": "7.3.8", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "shebang-command": { + "version": "2.0.0", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-js": { + "version": "1.0.2", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" + }, + "sourcemap-codec": { + "version": "1.4.8", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + }, + "strip-ansi": { + "version": "6.0.1", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "devOptional": true + }, + "text-table": { + "version": "0.2.0", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, + "tslib": { + "version": "1.14.1", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "tsutils": { + "version": "3.21.0", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "type-check": { + "version": "0.4.0", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.20.2", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "typescript": { + "version": "4.9.5", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "devOptional": true + }, + "upath": { + "version": "2.0.1", + "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", + "devOptional": true + }, + "uri-js": { + "version": "4.4.1", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "vite": { + "version": "3.2.5", + "integrity": "sha512-4mVEpXpSOgrssFZAOmGIr85wPHKvaDAcXqxVxVRZhljkJOMZi1ibLibzjLHzJvcok8BMguLc7g1W6W/GqZbLdQ==", + "devOptional": true, + "requires": { + "esbuild": "^0.15.9", + "fsevents": "~2.3.2", + "postcss": "^8.4.18", + "resolve": "^1.22.1", + "rollup": "^2.79.1" + } + }, + "vite-plugin-vuetify": { + "version": "1.0.2", + "integrity": "sha512-MubIcKD33O8wtgQXlbEXE7ccTEpHZ8nPpe77y9Wy3my2MWw/PgehP9VqTp92BLqr0R1dSL970Lynvisx3UxBFw==", + "devOptional": true, + "requires": { + "@vuetify/loader-shared": "^1.7.1", + "debug": "^4.3.3", + "upath": "^2.0.1" + } + }, + "vue": { + "version": "3.2.47", + "integrity": "sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==", + "requires": { + "@vue/compiler-dom": "3.2.47", + "@vue/compiler-sfc": "3.2.47", + "@vue/runtime-dom": "3.2.47", + "@vue/server-renderer": "3.2.47", + "@vue/shared": "3.2.47" + } + }, + "vue-demi": { + "version": "0.13.11", + "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==", + "requires": {} + }, + "vue-eslint-parser": { + "version": "8.3.0", + "integrity": "sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==", + "dev": true, + "requires": { + "debug": "^4.3.2", + "eslint-scope": "^7.0.0", + "eslint-visitor-keys": "^3.1.0", + "espree": "^9.0.0", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.5" + } + }, + "vue-router": { + "version": "4.1.6", + "integrity": "sha512-DYWYwsG6xNPmLq/FmZn8Ip+qrhFEzA14EI12MsMgVxvHFDYvlr4NXpVF5hrRH1wVcDP8fGi5F4rxuJSl8/r+EQ==", + "requires": { + "@vue/devtools-api": "^6.4.5" + } + }, + "vue-template-compiler": { + "version": "2.7.14", + "integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==", + "dev": true, + "requires": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "vue-tsc": { + "version": "1.2.0", + "integrity": "sha512-rIlzqdrhyPYyLG9zxsVRa+JEseeS9s8F2BbVVVWRRsTZvJO2BbhLEb2HW3MY+DFma0378tnIqs+vfTzbcQtRFw==", + "dev": true, + "requires": { + "@volar/vue-language-core": "1.2.0", + "@volar/vue-typescript": "1.2.0" + } + }, + "vuetify": { + "version": "3.1.12", + "integrity": "sha512-6SOMWzNtziDdi/Noeg0l9Q5o20amIuqmj9V5W8fV1nCNdQUZsi6mt9iN+UcfjqwAaALS/z5Nbd4v5OJxy8M4Rw==", + "requires": {} + }, + "webfontloader": { + "version": "1.6.28", + "integrity": "sha512-Egb0oFEga6f+nSgasH3E0M405Pzn6y3/9tOVanv/DLfa1YBIgcv90L18YyWnvXkRbIM17v5Kv6IT2N6g1x5tvQ==" + }, + "which": { + "version": "2.0.2", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "word-wrap": { + "version": "1.2.3", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "xml-name-validator": { + "version": "4.0.0", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + } + } +} diff --git a/frontend-beheer/package.json b/frontend-beheer/package.json new file mode 100644 index 00000000..5de9d200 --- /dev/null +++ b/frontend-beheer/package.json @@ -0,0 +1,37 @@ +{ + "name": "frontend-beheer", + "version": "0.0.0", + "scripts": { + "dev": "vite", + "build": "vue-tsc --noEmit && vite build", + "preview": "vite preview", + "lint": "eslint . --fix --ignore-path .gitignore" + }, + "dependencies": { + "@mdi/font": "7.0.96", + "@vueuse/core": "^9.13.0", + "axios": "^1.3.4", + "keycloak-js": "^21.0.1", + "pinia": "^2.0.23", + "roboto-fontface": "*", + "sass": "^1.59.3", + "vue": "^3.2.38", + "vue-router": "^4.0.0", + "vuetify": "^3.1.11", + "webfontloader": "^1.0.0" + }, + "devDependencies": { + "@types/node": "^18.11.9", + "@types/webfontloader": "^1.6.35", + "@vitejs/plugin-vue": "^3.0.3", + "@vue/eslint-config-typescript": "^11.0.0", + "eslint": "^8.7.0", + "eslint-plugin-vue": "^9.3.0", + "prettier": "^2.5.1", + "typescript": "^4.0.0", + "vite": "^3.0.9", + "vite-plugin-vuetify": "^1.0.0-alpha.12", + "vue-eslint-parser": "^8.0.0", + "vue-tsc": "^1.0.9" + } +} diff --git a/frontend-beheer/public/.well-known/security.txt b/frontend-beheer/public/.well-known/security.txt new file mode 100644 index 00000000..c17c061e --- /dev/null +++ b/frontend-beheer/public/.well-known/security.txt @@ -0,0 +1,3 @@ +Contact: mailto:devops@ictu.nl +Expires: 2023-12-29T08:00:00.000Z +Preferred-Languages: nl \ No newline at end of file diff --git a/frontend-beheer/public/favicon.ico b/frontend-beheer/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c63289f51e5c389056a88065d9520e53b03a8068 GIT binary patch literal 15086 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 b%w@);p{d50Pg-&`6E<(nmC+e%8#4a~yf>gp literal 0 HcmV?d00001 diff --git a/frontend-beheer/public/icon-link-external-v2.svg b/frontend-beheer/public/icon-link-external-v2.svg new file mode 100644 index 00000000..a01ee0f4 --- /dev/null +++ b/frontend-beheer/public/icon-link-external-v2.svg @@ -0,0 +1,16 @@ + + + 3945 externe link 24px + + + + + + + + + + + + + diff --git a/frontend-beheer/src/App.vue b/frontend-beheer/src/App.vue new file mode 100644 index 00000000..bcb78288 --- /dev/null +++ b/frontend-beheer/src/App.vue @@ -0,0 +1,37 @@ + + + + + diff --git a/frontend-beheer/src/app-config.ts b/frontend-beheer/src/app-config.ts new file mode 100644 index 00000000..1f58bd9a --- /dev/null +++ b/frontend-beheer/src/app-config.ts @@ -0,0 +1,6 @@ +export default { + metaDataStandard: { + preferredVersion: '0.3.1', + availableVersions: ['0.3.1', '0.2.3', '0.1.0'], + }, +} diff --git a/frontend-beheer/src/assets/fonts/RO-SerifWeb-Regular.woff b/frontend-beheer/src/assets/fonts/RO-SerifWeb-Regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..cf4032d5052a338991aabf915103aa0fc5e9ee2b GIT binary patch literal 67204 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%0DLTn3~ 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�%_vivWNa_$1z1M$PMVAn!c5UN!3vsxAqJ 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 literal 0 HcmV?d00001 diff --git a/frontend-beheer/src/assets/fonts/ROsanswebtextbold.woff b/frontend-beheer/src/assets/fonts/ROsanswebtextbold.woff new file mode 100644 index 0000000000000000000000000000000000000000..6f0e3c819eca6311a8fa8d4e7c9e7dcb436cfdc9 GIT binary patch literal 69467 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 Z)i#~}|8=^LsxAs;>-qm=_a8qGLmyP-&%6Kt literal 0 HcmV?d00001 diff --git a/frontend-beheer/src/assets/fonts/ROsanswebtextitalic.woff b/frontend-beheer/src/assets/fonts/ROsanswebtextitalic.woff new file mode 100644 index 0000000000000000000000000000000000000000..7e74d6692834f0061b2a9d8f904cc5566d2c1f09 GIT binary patch literal 84044 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%0A^tJtbs}qGM5GQbB=py!+TZ0 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�tIG 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 Cil=V? literal 0 HcmV?d00001 diff --git a/frontend-beheer/src/assets/fonts/ROsanswebtextregular.woff b/frontend-beheer/src/assets/fonts/ROsanswebtextregular.woff new file mode 100644 index 0000000000000000000000000000000000000000..624c3f89a784358d6a72548ce60260b154783505 GIT binary patch literal 76489 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�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 literal 0 HcmV?d00001 diff --git a/frontend-beheer/src/assets/fonts/ro-icons-2.1.woff2 b/frontend-beheer/src/assets/fonts/ro-icons-2.1.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..c2865eb6ccb7af13f083e36e425c9baf0847e883 GIT binary patch literal 4412 zcmV-C5yS3xPew8T0RR9101-R@3jhEB03J9101)i}0RR9100000000000000000000 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 CZJ5je literal 0 HcmV?d00001 diff --git a/frontend-beheer/src/assets/images/icons/icon-24-lock-blue.svg b/frontend-beheer/src/assets/images/icons/icon-24-lock-blue.svg new file mode 100644 index 00000000..f1b17a53 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-24-lock-blue.svg @@ -0,0 +1,3 @@ + + + diff --git a/frontend-beheer/src/assets/images/icons/icon-64-family.svg b/frontend-beheer/src/assets/images/icons/icon-64-family.svg new file mode 100644 index 00000000..93904ffb --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-64-family.svg @@ -0,0 +1,11 @@ + + + + 01. Ontwerpprincipes/03. Icons/01. 64px/17. Gezin + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/icons/icon-64-finance.svg b/frontend-beheer/src/assets/images/icons/icon-64-finance.svg new file mode 100644 index 00000000..5798acde --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-64-finance.svg @@ -0,0 +1,11 @@ + + + + 01. Ontwerpprincipes/03. Icons/01. 64px/15. Financieen + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/icons/icon-64-kids.svg b/frontend-beheer/src/assets/images/icons/icon-64-kids.svg new file mode 100644 index 00000000..aaf1b3f6 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-64-kids.svg @@ -0,0 +1,11 @@ + + + + 01. Ontwerpprincipes/03. Icons/01. 64px/13. Kinderen + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/icons/icon-64-living.svg b/frontend-beheer/src/assets/images/icons/icon-64-living.svg new file mode 100644 index 00000000..b13f8103 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-64-living.svg @@ -0,0 +1,11 @@ + + + + 01. Ontwerpprincipes/03. Icons/01. 64px/16. Wonen + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/icons/icon-64-people.svg b/frontend-beheer/src/assets/images/icons/icon-64-people.svg new file mode 100644 index 00000000..d708b4f8 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-64-people.svg @@ -0,0 +1,11 @@ + + + + 01. Ontwerpprincipes/03. Icons/01. 64px/14. Mensen + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/icons/icon-alert-blue.svg b/frontend-beheer/src/assets/images/icons/icon-alert-blue.svg new file mode 100644 index 00000000..e7746c7d --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-alert-blue.svg @@ -0,0 +1,11 @@ + + + + 01. Ontwerpprincipes/03. Icons/02. 24px/03. Meldingen/03. Alert + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/icons/icon-alert-red.svg b/frontend-beheer/src/assets/images/icons/icon-alert-red.svg new file mode 100644 index 00000000..970184e5 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-alert-red.svg @@ -0,0 +1,11 @@ + + + + 01. Ontwerpprincipes/03. Icons/02. 24px/03. Meldingen/03. Alert + Created with Sketch. + + + + + + diff --git a/frontend-beheer/src/assets/images/icons/icon-area.svg b/frontend-beheer/src/assets/images/icons/icon-area.svg new file mode 100644 index 00000000..65563368 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-area.svg @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-arrow-down.svg b/frontend-beheer/src/assets/images/icons/icon-arrow-down.svg new file mode 100644 index 00000000..2942d201 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-arrow-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/frontend-beheer/src/assets/images/icons/icon-arrow-right.svg b/frontend-beheer/src/assets/images/icons/icon-arrow-right.svg new file mode 100644 index 00000000..b19f3958 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-arrow-right.svg @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-arrow-up-blue.svg b/frontend-beheer/src/assets/images/icons/icon-arrow-up-blue.svg new file mode 100644 index 00000000..80d77fa1 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-arrow-up-blue.svg @@ -0,0 +1,3 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-arrow-up.svg b/frontend-beheer/src/assets/images/icons/icon-arrow-up.svg new file mode 100644 index 00000000..0c231bd0 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-arrow-up.svg @@ -0,0 +1,3 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-basis.svg b/frontend-beheer/src/assets/images/icons/icon-basis.svg new file mode 100644 index 00000000..dec53132 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-basis.svg @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-bewerken-blue.svg b/frontend-beheer/src/assets/images/icons/icon-bewerken-blue.svg new file mode 100644 index 00000000..ea79a5e9 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-bewerken-blue.svg @@ -0,0 +1,4 @@ + + diff --git a/frontend-beheer/src/assets/images/icons/icon-bewerken.svg b/frontend-beheer/src/assets/images/icons/icon-bewerken.svg new file mode 100644 index 00000000..a79ddc07 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-bewerken.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/icons/icon-calendar-blue.svg b/frontend-beheer/src/assets/images/icons/icon-calendar-blue.svg new file mode 100644 index 00000000..62009033 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-calendar-blue.svg @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-calendar-white.svg b/frontend-beheer/src/assets/images/icons/icon-calendar-white.svg new file mode 100644 index 00000000..9c8e9b06 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-calendar-white.svg @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-calendar.svg b/frontend-beheer/src/assets/images/icons/icon-calendar.svg new file mode 100644 index 00000000..6e5df3d8 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-calendar.svg @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-characteristic.svg b/frontend-beheer/src/assets/images/icons/icon-characteristic.svg new file mode 100644 index 00000000..a36e5b00 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-characteristic.svg @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-check-filled-green.svg b/frontend-beheer/src/assets/images/icons/icon-check-filled-green.svg new file mode 100644 index 00000000..6a10ef41 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-check-filled-green.svg @@ -0,0 +1,11 @@ + + + + 01. Ontwerpprincipes/03. Icons/02. 24px/03. Meldingen/04. Bevestiging + Created with Sketch. + + + + + + diff --git a/frontend-beheer/src/assets/images/icons/icon-check.svg b/frontend-beheer/src/assets/images/icons/icon-check.svg new file mode 100644 index 00000000..d2cd0367 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-check.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/icons/icon-check2-blue.svg b/frontend-beheer/src/assets/images/icons/icon-check2-blue.svg new file mode 100644 index 00000000..1c526e99 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-check2-blue.svg @@ -0,0 +1,11 @@ + + + + 01. Ontwerpprincipes/03 Icons/24/Check + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/icons/icon-check2-green.svg b/frontend-beheer/src/assets/images/icons/icon-check2-green.svg new file mode 100644 index 00000000..b957b291 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-check2-green.svg @@ -0,0 +1,11 @@ + + + + 01. Ontwerpprincipes/03 Icons/24/Check + Created with Sketch. + + + + + + diff --git a/frontend-beheer/src/assets/images/icons/icon-check2-white.svg b/frontend-beheer/src/assets/images/icons/icon-check2-white.svg new file mode 100644 index 00000000..070a4aeb --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-check2-white.svg @@ -0,0 +1,11 @@ + + + + 01. Ontwerpprincipes/03 Icons/24/Check + Created with Sketch. + + + + + + diff --git a/frontend-beheer/src/assets/images/icons/icon-checkbox-white.svg b/frontend-beheer/src/assets/images/icons/icon-checkbox-white.svg new file mode 100644 index 00000000..92d8b248 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-checkbox-white.svg @@ -0,0 +1,3 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-chevron-left-blue.svg b/frontend-beheer/src/assets/images/icons/icon-chevron-left-blue.svg new file mode 100644 index 00000000..720f270d --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-chevron-left-blue.svg @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-chevron-left.svg b/frontend-beheer/src/assets/images/icons/icon-chevron-left.svg new file mode 100644 index 00000000..8bf8e871 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-chevron-left.svg @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-chevron-right.svg b/frontend-beheer/src/assets/images/icons/icon-chevron-right.svg new file mode 100644 index 00000000..7f1c8036 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-chevron-right.svg @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-chevronround-right-white.svg b/frontend-beheer/src/assets/images/icons/icon-chevronround-right-white.svg new file mode 100644 index 00000000..b96f5f88 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-chevronround-right-white.svg @@ -0,0 +1,9 @@ + + + 01. Ontwerpprincipes/03. Icons/02. 24px/02. Delta/03. Rechts + + + + + + diff --git a/frontend-beheer/src/assets/images/icons/icon-close-hover.svg b/frontend-beheer/src/assets/images/icons/icon-close-hover.svg new file mode 100644 index 00000000..ec8f1399 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-close-hover.svg @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-close-white.svg b/frontend-beheer/src/assets/images/icons/icon-close-white.svg new file mode 100644 index 00000000..d1a7df50 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-close-white.svg @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-close.svg b/frontend-beheer/src/assets/images/icons/icon-close.svg new file mode 100644 index 00000000..f885ae19 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-close.svg @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-compare.svg b/frontend-beheer/src/assets/images/icons/icon-compare.svg new file mode 100644 index 00000000..79fb0fa9 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-compare.svg @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-copy.svg b/frontend-beheer/src/assets/images/icons/icon-copy.svg new file mode 100644 index 00000000..a1f42e26 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-copy.svg @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-cross-blue.svg b/frontend-beheer/src/assets/images/icons/icon-cross-blue.svg new file mode 100644 index 00000000..e2f14130 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-cross-blue.svg @@ -0,0 +1,23 @@ + + + + 580B74B8-4557-4B89-BECE-8F8ADF95B675 + Created with sketchtool. + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/icons/icon-cross-filled.svg b/frontend-beheer/src/assets/images/icons/icon-cross-filled.svg new file mode 100644 index 00000000..9eb4f7ba --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-cross-filled.svg @@ -0,0 +1,14 @@ + + + + Symbol / cross + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/icons/icon-cross-white.svg b/frontend-beheer/src/assets/images/icons/icon-cross-white.svg new file mode 100644 index 00000000..93570dd8 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-cross-white.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/frontend-beheer/src/assets/images/icons/icon-crosshair.svg b/frontend-beheer/src/assets/images/icons/icon-crosshair.svg new file mode 100644 index 00000000..44dd5220 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-crosshair.svg @@ -0,0 +1,24 @@ + + + + 9D40975A-1AA3-4684-B88C-EE976EAD8D4E + Created with sketchtool. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/icons/icon-cta-left.svg b/frontend-beheer/src/assets/images/icons/icon-cta-left.svg new file mode 100644 index 00000000..f666aec8 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-cta-left.svg @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-cta-right-white.svg b/frontend-beheer/src/assets/images/icons/icon-cta-right-white.svg new file mode 100644 index 00000000..9469073d --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-cta-right-white.svg @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-cta-right.svg b/frontend-beheer/src/assets/images/icons/icon-cta-right.svg new file mode 100644 index 00000000..7a88dab1 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-cta-right.svg @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-dart-down.svg b/frontend-beheer/src/assets/images/icons/icon-dart-down.svg new file mode 100644 index 00000000..32576830 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-dart-down.svg @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-dart-left.svg b/frontend-beheer/src/assets/images/icons/icon-dart-left.svg new file mode 100644 index 00000000..12302c56 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-dart-left.svg @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-dart-right-blue.svg b/frontend-beheer/src/assets/images/icons/icon-dart-right-blue.svg new file mode 100644 index 00000000..4aa87b17 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-dart-right-blue.svg @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-dart-right.svg b/frontend-beheer/src/assets/images/icons/icon-dart-right.svg new file mode 100644 index 00000000..e510f060 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-dart-right.svg @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-dart-top-white.svg b/frontend-beheer/src/assets/images/icons/icon-dart-top-white.svg new file mode 100644 index 00000000..243d3b3a --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-dart-top-white.svg @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-dart-top.svg b/frontend-beheer/src/assets/images/icons/icon-dart-top.svg new file mode 100644 index 00000000..573b73fd --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-dart-top.svg @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-document-new.svg b/frontend-beheer/src/assets/images/icons/icon-document-new.svg new file mode 100644 index 00000000..f3136d34 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-document-new.svg @@ -0,0 +1,10 @@ + + + 01. Ontwerpprincipes/03. Icons/02. 24px/05. Files/05. Document-Notificatie + + + + + + + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/icons/icon-document.svg b/frontend-beheer/src/assets/images/icons/icon-document.svg new file mode 100644 index 00000000..8afc0cef --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-document.svg @@ -0,0 +1,11 @@ + + + + 01. Ontwerpprincipes/03 Icons/24/Document + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/icons/icon-dots.svg b/frontend-beheer/src/assets/images/icons/icon-dots.svg new file mode 100644 index 00000000..b282af65 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-dots.svg @@ -0,0 +1,21 @@ + + + + A8F5F2C3-F0EB-47CA-A4E1-F13BA14D3390 + Created with sketchtool. + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/icons/icon-double-left.svg b/frontend-beheer/src/assets/images/icons/icon-double-left.svg new file mode 100644 index 00000000..33a73310 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-double-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/icons/icon-double-right.svg b/frontend-beheer/src/assets/images/icons/icon-double-right.svg new file mode 100644 index 00000000..8fff12f0 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-double-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/icons/icon-download-white.svg b/frontend-beheer/src/assets/images/icons/icon-download-white.svg new file mode 100644 index 00000000..57b42ab7 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-download-white.svg @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-download.svg b/frontend-beheer/src/assets/images/icons/icon-download.svg new file mode 100644 index 00000000..8866a470 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-download.svg @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-draw.svg b/frontend-beheer/src/assets/images/icons/icon-draw.svg new file mode 100644 index 00000000..01e026b7 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-draw.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/icons/icon-explanation.svg b/frontend-beheer/src/assets/images/icons/icon-explanation.svg new file mode 100644 index 00000000..a6b7c5fe --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-explanation.svg @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-facebook.svg b/frontend-beheer/src/assets/images/icons/icon-facebook.svg new file mode 100644 index 00000000..8e4e8634 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-facebook.svg @@ -0,0 +1,7 @@ + + + 01. Ontwerpprincipes/03. Icons/02. 24px/08. Social/01. Facebook + + + + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/icons/icon-feed-blue.svg b/frontend-beheer/src/assets/images/icons/icon-feed-blue.svg new file mode 100644 index 00000000..ab9f55fc --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-feed-blue.svg @@ -0,0 +1,9 @@ + + + 01. Ontwerpprincipes/03. Icons/02. 24px/04. System/27. RSS + + + + + + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/icons/icon-filter-rotated-white.svg b/frontend-beheer/src/assets/images/icons/icon-filter-rotated-white.svg new file mode 100644 index 00000000..17101eb1 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-filter-rotated-white.svg @@ -0,0 +1,11 @@ + + + + 26. Filteren + Created with Sketch. + + + + + + diff --git a/frontend-beheer/src/assets/images/icons/icon-filter.svg b/frontend-beheer/src/assets/images/icons/icon-filter.svg new file mode 100644 index 00000000..b445d276 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-filter.svg @@ -0,0 +1,17 @@ + + + + Group 6 + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/icons/icon-hamburger-white.svg b/frontend-beheer/src/assets/images/icons/icon-hamburger-white.svg new file mode 100644 index 00000000..19d43bab --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-hamburger-white.svg @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-hamburger.svg b/frontend-beheer/src/assets/images/icons/icon-hamburger.svg new file mode 100644 index 00000000..e1d1f8df --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-hamburger.svg @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-home.svg b/frontend-beheer/src/assets/images/icons/icon-home.svg new file mode 100644 index 00000000..1cdc3430 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-home.svg @@ -0,0 +1,11 @@ + + + + 01. Ontwerpprincipes/03 Icons/24/Home + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/icons/icon-info-blue.svg b/frontend-beheer/src/assets/images/icons/icon-info-blue.svg new file mode 100644 index 00000000..711fa8ff --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-info-blue.svg @@ -0,0 +1,12 @@ + + + + Artboard + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/icons/icon-info.svg b/frontend-beheer/src/assets/images/icons/icon-info.svg new file mode 100644 index 00000000..35f8235c --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-info.svg @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-instagram.svg b/frontend-beheer/src/assets/images/icons/icon-instagram.svg new file mode 100644 index 00000000..dbc05b5a --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-instagram.svg @@ -0,0 +1,9 @@ + + + 01. Ontwerpprincipes/03. Icons/02. 24px/08. Social/03. Instagram + + + + + + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/icons/icon-link-external-v2.svg b/frontend-beheer/src/assets/images/icons/icon-link-external-v2.svg new file mode 100644 index 00000000..a01ee0f4 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-link-external-v2.svg @@ -0,0 +1,16 @@ + + + 3945 externe link 24px + + + + + + + + + + + + + diff --git a/frontend-beheer/src/assets/images/icons/icon-link-external-white-standard.svg b/frontend-beheer/src/assets/images/icons/icon-link-external-white-standard.svg new file mode 100644 index 00000000..cf51f8e7 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-link-external-white-standard.svg @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-link-external.svg b/frontend-beheer/src/assets/images/icons/icon-link-external.svg new file mode 100644 index 00000000..1db43ef5 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-link-external.svg @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-linkedin.svg b/frontend-beheer/src/assets/images/icons/icon-linkedin.svg new file mode 100644 index 00000000..9fe236c9 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-linkedin.svg @@ -0,0 +1,9 @@ + + + 01. Ontwerpprincipes/03. Icons/02. 24px/08. Social/02. LinkedIn + + + + + + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/icons/icon-list.svg b/frontend-beheer/src/assets/images/icons/icon-list.svg new file mode 100644 index 00000000..f2a4e569 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-list.svg @@ -0,0 +1,11 @@ + + + + 01. Ontwerpprincipes/03 Icons/24/List + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/icons/icon-loader.svg b/frontend-beheer/src/assets/images/icons/icon-loader.svg new file mode 100644 index 00000000..85a0d879 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-loader.svg @@ -0,0 +1,23 @@ + + + k-loader + + + + + + + + + + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/icons/icon-logout.svg b/frontend-beheer/src/assets/images/icons/icon-logout.svg new file mode 100644 index 00000000..4533a5d9 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-logout.svg @@ -0,0 +1,10 @@ + + + 01. Ontwerpprincipes/03. Icons/02. 24px/04. System/25. Uitloggen + + + + + + + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/icons/icon-mail.svg b/frontend-beheer/src/assets/images/icons/icon-mail.svg new file mode 100644 index 00000000..433541c0 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-mail.svg @@ -0,0 +1,21 @@ + + + + Shape + Created with Sketch. + + + + + + + + + + + + + + + + diff --git a/frontend-beheer/src/assets/images/icons/icon-map-blue.svg b/frontend-beheer/src/assets/images/icons/icon-map-blue.svg new file mode 100644 index 00000000..0d4056bf --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-map-blue.svg @@ -0,0 +1,11 @@ + + + + 01. Ontwerpprincipes/03 Icons/24/Map + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/icons/icon-map.svg b/frontend-beheer/src/assets/images/icons/icon-map.svg new file mode 100644 index 00000000..daed3019 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-map.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/icons/icon-marker-blue.svg b/frontend-beheer/src/assets/images/icons/icon-marker-blue.svg new file mode 100644 index 00000000..b176c5fb --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-marker-blue.svg @@ -0,0 +1,24 @@ + + + + 65F9126F-B3A9-4838-AF2F-38305A32FA01 + Created with sketchtool. + + + + + + + + + + + + + + + + + + + diff --git a/frontend-beheer/src/assets/images/icons/icon-marker.svg b/frontend-beheer/src/assets/images/icons/icon-marker.svg new file mode 100644 index 00000000..b34c2475 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-marker.svg @@ -0,0 +1,24 @@ + + + + 65F9126F-B3A9-4838-AF2F-38305A32FA01 + Created with sketchtool. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/icons/icon-min-filled-blue.svg b/frontend-beheer/src/assets/images/icons/icon-min-filled-blue.svg new file mode 100644 index 00000000..3cfef690 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-min-filled-blue.svg @@ -0,0 +1,9 @@ + + + 01. Ontwerpprincipes/03. Icons/02. 24px/04. System/29. Min + + + + + + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/icons/icon-minus-shape.svg b/frontend-beheer/src/assets/images/icons/icon-minus-shape.svg new file mode 100644 index 00000000..b4560a7c --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-minus-shape.svg @@ -0,0 +1,27 @@ + + + + 0D1AF017-5B43-4879-BF4F-30A57F0C98BF + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend-beheer/src/assets/images/icons/icon-minus.svg b/frontend-beheer/src/assets/images/icons/icon-minus.svg new file mode 100644 index 00000000..bcfe4c84 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-minus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/icons/icon-news.svg b/frontend-beheer/src/assets/images/icons/icon-news.svg new file mode 100644 index 00000000..a0642696 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-news.svg @@ -0,0 +1,9 @@ + + + + 01. Ontwerpprincipes/03 Icons/24/Nieuws + Created with Sketch. + + + + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/icons/icon-next.svg b/frontend-beheer/src/assets/images/icons/icon-next.svg new file mode 100644 index 00000000..72e2361c --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-next.svg @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-ok-green.svg b/frontend-beheer/src/assets/images/icons/icon-ok-green.svg new file mode 100644 index 00000000..cd0d268a --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-ok-green.svg @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-ok.svg b/frontend-beheer/src/assets/images/icons/icon-ok.svg new file mode 100644 index 00000000..25185c25 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-ok.svg @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-permalink.svg b/frontend-beheer/src/assets/images/icons/icon-permalink.svg new file mode 100644 index 00000000..456f6265 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-permalink.svg @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-play.svg b/frontend-beheer/src/assets/images/icons/icon-play.svg new file mode 100644 index 00000000..811f3ed9 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-play.svg @@ -0,0 +1,11 @@ + + + + B526D507-FB1A-414F-AD20-64C8176F90F6 + Created with sketchtool. + + + + + + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/icons/icon-plus-filled-blue.svg b/frontend-beheer/src/assets/images/icons/icon-plus-filled-blue.svg new file mode 100644 index 00000000..904e0653 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-plus-filled-blue.svg @@ -0,0 +1,9 @@ + + + 01. Ontwerpprincipes/03. Icons/02. 24px/04. System/28. Plus + + + + + + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/icons/icon-plus-shape.svg b/frontend-beheer/src/assets/images/icons/icon-plus-shape.svg new file mode 100644 index 00000000..3739a4ab --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-plus-shape.svg @@ -0,0 +1,27 @@ + + + + 1095F135-B295-4A94-BF9F-9EBB432250F5 + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend-beheer/src/assets/images/icons/icon-plus-white.svg b/frontend-beheer/src/assets/images/icons/icon-plus-white.svg new file mode 100644 index 00000000..0ed887ce --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-plus-white.svg @@ -0,0 +1,24 @@ + + + + E1B370A8-65E6-4828-9E78-14F6ED502B2E + Created with sketchtool. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/icons/icon-plus.svg b/frontend-beheer/src/assets/images/icons/icon-plus.svg new file mode 100644 index 00000000..81f9be79 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-plus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/icons/icon-print.svg b/frontend-beheer/src/assets/images/icons/icon-print.svg new file mode 100644 index 00000000..b48c669a --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-print.svg @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-profile.svg b/frontend-beheer/src/assets/images/icons/icon-profile.svg new file mode 100644 index 00000000..53076885 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-profile.svg @@ -0,0 +1,11 @@ + + + + 01. Ontwerpprincipes/03. Icons/02. 24px/04. System/15. User + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/icons/icon-publicatie.svg b/frontend-beheer/src/assets/images/icons/icon-publicatie.svg new file mode 100644 index 00000000..9a57716e --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-publicatie.svg @@ -0,0 +1,11 @@ + + + + 01. Ontwerpprincipes/03 Icons/64/Formulier + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/icons/icon-refresh-document-white.svg b/frontend-beheer/src/assets/images/icons/icon-refresh-document-white.svg new file mode 100644 index 00000000..8d7b61bd --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-refresh-document-white.svg @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-refresh-document.svg b/frontend-beheer/src/assets/images/icons/icon-refresh-document.svg new file mode 100644 index 00000000..cc864ea3 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-refresh-document.svg @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-refresh.svg b/frontend-beheer/src/assets/images/icons/icon-refresh.svg new file mode 100644 index 00000000..0300d58d --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-refresh.svg @@ -0,0 +1,11 @@ + + + + 01. Ontwerpprincipes/03 Icons/24/Opnieuw + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/icons/icon-relations.svg b/frontend-beheer/src/assets/images/icons/icon-relations.svg new file mode 100644 index 00000000..793542fc --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-relations.svg @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-remove-blue.svg b/frontend-beheer/src/assets/images/icons/icon-remove-blue.svg new file mode 100644 index 00000000..980556e6 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-remove-blue.svg @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-remove-white.svg b/frontend-beheer/src/assets/images/icons/icon-remove-white.svg new file mode 100644 index 00000000..3cfb1220 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-remove-white.svg @@ -0,0 +1,31 @@ + + + + 0552FFDC-99E0-4E90-B8E3-3E8800B28520 + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/icons/icon-remove.svg b/frontend-beheer/src/assets/images/icons/icon-remove.svg new file mode 100644 index 00000000..689d375e --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-remove.svg @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-search-blue.svg b/frontend-beheer/src/assets/images/icons/icon-search-blue.svg new file mode 100644 index 00000000..288f3ffe --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-search-blue.svg @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-search.svg b/frontend-beheer/src/assets/images/icons/icon-search.svg new file mode 100644 index 00000000..2a2860c2 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-search.svg @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-share-blue.svg b/frontend-beheer/src/assets/images/icons/icon-share-blue.svg new file mode 100644 index 00000000..3433a386 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-share-blue.svg @@ -0,0 +1,12 @@ + + + + Artboard + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/icons/icon-share.svg b/frontend-beheer/src/assets/images/icons/icon-share.svg new file mode 100644 index 00000000..c9cb5f66 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-share.svg @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-tel.svg b/frontend-beheer/src/assets/images/icons/icon-tel.svg new file mode 100644 index 00000000..7626bacb --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-tel.svg @@ -0,0 +1,7 @@ + + + 01. Ontwerpprincipes/03. Icons/02. 24px/04. System/36. Telefoon + + + + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/icons/icon-thumb-down.svg b/frontend-beheer/src/assets/images/icons/icon-thumb-down.svg new file mode 100644 index 00000000..b254fafc --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-thumb-down.svg @@ -0,0 +1,11 @@ + + + + 01. Ontwerpprincipes/03 Icons/24/Ontevreden + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/icons/icon-thumb-up.svg b/frontend-beheer/src/assets/images/icons/icon-thumb-up.svg new file mode 100644 index 00000000..bdc97877 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-thumb-up.svg @@ -0,0 +1,11 @@ + + + + 01. Ontwerpprincipes/03 Icons/24/Tevreden + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/icons/icon-twitter.svg b/frontend-beheer/src/assets/images/icons/icon-twitter.svg new file mode 100644 index 00000000..e240a52c --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-twitter.svg @@ -0,0 +1,7 @@ + + + 01. Ontwerpprincipes/03. Icons/02. 24px/08. Social/05. Twitter + + + + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/icons/icon-upload.svg b/frontend-beheer/src/assets/images/icons/icon-upload.svg new file mode 100644 index 00000000..b83ca63e --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-upload.svg @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-warning.svg b/frontend-beheer/src/assets/images/icons/icon-warning.svg new file mode 100644 index 00000000..422ecd24 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-warning.svg @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/images/icons/icon-whatsapp.svg b/frontend-beheer/src/assets/images/icons/icon-whatsapp.svg new file mode 100644 index 00000000..1317b2b8 --- /dev/null +++ b/frontend-beheer/src/assets/images/icons/icon-whatsapp.svg @@ -0,0 +1,9 @@ + + + 01. Ontwerpprincipes/03. Icons/02. 24px/08. Social/04. Whatsapp + + + + + + \ No newline at end of file diff --git a/frontend-beheer/src/assets/images/logo-ro-zonder-caption-mobile.svg b/frontend-beheer/src/assets/images/logo-ro-zonder-caption-mobile.svg new file mode 100644 index 00000000..c80617dd --- /dev/null +++ b/frontend-beheer/src/assets/images/logo-ro-zonder-caption-mobile.svg @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/frontend-beheer/src/assets/images/logo-ro-zonder-caption.svg b/frontend-beheer/src/assets/images/logo-ro-zonder-caption.svg new file mode 100644 index 00000000..e08787d5 --- /dev/null +++ b/frontend-beheer/src/assets/images/logo-ro-zonder-caption.svg @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/frontend-beheer/src/assets/images/logo.svg b/frontend-beheer/src/assets/images/logo.svg new file mode 100644 index 00000000..5c939bf1 --- /dev/null +++ b/frontend-beheer/src/assets/images/logo.svg @@ -0,0 +1,2 @@ + + diff --git a/frontend-beheer/src/assets/styles/_colors.scss b/frontend-beheer/src/assets/styles/_colors.scss new file mode 100644 index 00000000..0432d597 --- /dev/null +++ b/frontend-beheer/src/assets/styles/_colors.scss @@ -0,0 +1,16 @@ +$primary: #007bc7; +$primary-dark: #27598f; +$primary-darker: #154273; +$secondary: #b2d7ee; +$tertiary: #e5f1f9; +$quaternary: #cae3f0; +$quinary: #d2e5ee; +$accent: #82b1ff; +$error: #ff5252; +$info: #2196f3; +$success: #4caf50; +$warning: #ffc107; +$headerTextColour: #000000; +$headerHoverColour: #fcf29a; +$grey: #f3f3f3; +$link-hover: #6da0d7; diff --git a/frontend-beheer/src/assets/styles/_fonts.scss b/frontend-beheer/src/assets/styles/_fonts.scss new file mode 100644 index 00000000..cdb2168f --- /dev/null +++ b/frontend-beheer/src/assets/styles/_fonts.scss @@ -0,0 +1,18 @@ +@font-face { + font-family: 'Rijksoverheid Sans'; + src: url('@/assets/fonts/ROsanswebtextregular.woff') format('opentype'); + font-style: normal; + font-weight: 400; +} +@font-face { + font-family: 'Rijksoverheid Sans'; + src: url('@/assets/fonts/ROsanswebtextbold.woff') format('opentype'); + font-weight: 700; + font-style: normal; +} +@font-face { + font-family: 'Rijksoverheid Sans'; + src: url('@/assets/fonts/ROsanswebtextitalic.woff') format('opentype'); + font-style: italic; + font-weight: 400; +} diff --git a/frontend-beheer/src/assets/styles/_variables.scss b/frontend-beheer/src/assets/styles/_variables.scss new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/frontend-beheer/src/assets/styles/_variables.scss @@ -0,0 +1 @@ + diff --git a/frontend-beheer/src/assets/styles/main.scss b/frontend-beheer/src/assets/styles/main.scss new file mode 100644 index 00000000..0e55d250 --- /dev/null +++ b/frontend-beheer/src/assets/styles/main.scss @@ -0,0 +1,117 @@ +@import 'colors'; +@import 'variables'; + +body { + color: $primary-dark; + font-size: 127% !important; +} + +.sticky { + height: 100%; + position: sticky !important; + top: 0; +} + +.v-messages__message { + font-size: 1rem; + line-height: 1.2rem !important; +} + +.v-label { + font-size: 18px !important; +} + +.logo { + position: relative; +} +.logo > a { + display: inline-block; +} +.logo img { + width: 150px; + max-width: 150px; + margin: 0.5em 0; +} +@media (min-width: 51em) { + .logo img { + width: 180px; + max-width: 180px; + margin: 0; + } +} + +a { + color: $primary; +} + +.no-focus-border { + box-shadow: 0 0 0 0 #000 !important; + outline: 0; +} + +a:focus { + box-shadow: 0 0 0 0 #000 !important; + border: 2px dashed $primary-darker; + outline: 0; +} + +a { + border: 2px solid transparent; +} + +a.focus-border:focus { + border-left: 2px dashed $primary-darker; + border-right: 2px dashed $primary-darker; + border-bottom: 2px dashed $primary-darker; +} + +.row--footer { + background-color: #e5f1f9; + border-top: 0.75em solid #b2d7ee; + padding: 1.5em; + padding-bottom: 1.5em; +} + +.list--linked { + list-style: none; + padding-left: 0; +} +.list--linked li { + background-position: 0 0.5em; + background-repeat: no-repeat; + background-image: url(@/assets/images/icons/icon-dart-right-blue.svg); + background-size: 6px 9px; + padding-left: 1em; + clear: both; +} +.list--linked li a { + background-position: right 50%; +} +.list--linked li a:hover { + text-decoration: underline; +} + +.list { + margin-bottom: 0.5em; +} + +.is-external-icon { + content: ''; + margin: 0.15em 0.15em 0 0.25em; + width: 1em; + top: 1px; + height: 0.8em; + position: relative; +} + +a { + color: #154273; + text-decoration: underline; + -webkit-transition: color 150ms ease-in-out, outline-offset 150ms ease-in-out; + transition: color 150ms ease-in-out, outline-offset 150ms ease-in-out; + word-break: break-word; +} + +html { + padding-bottom: 0em !important; +} diff --git a/frontend-beheer/src/components/ExternalLink.vue b/frontend-beheer/src/components/ExternalLink.vue new file mode 100644 index 00000000..1ec65fa2 --- /dev/null +++ b/frontend-beheer/src/components/ExternalLink.vue @@ -0,0 +1,14 @@ + + + diff --git a/frontend-beheer/src/components/FormField.vue b/frontend-beheer/src/components/FormField.vue new file mode 100644 index 00000000..d7cc9104 --- /dev/null +++ b/frontend-beheer/src/components/FormField.vue @@ -0,0 +1,203 @@ + + + + + diff --git a/frontend-beheer/src/components/FormHeader.vue b/frontend-beheer/src/components/FormHeader.vue new file mode 100644 index 00000000..0db394ae --- /dev/null +++ b/frontend-beheer/src/components/FormHeader.vue @@ -0,0 +1,13 @@ + + + diff --git a/frontend-beheer/src/components/FormSideBlock.vue b/frontend-beheer/src/components/FormSideBlock.vue new file mode 100644 index 00000000..255a6c85 --- /dev/null +++ b/frontend-beheer/src/components/FormSideBlock.vue @@ -0,0 +1,295 @@ + + + + + diff --git a/frontend-beheer/src/components/MetadataManual.vue b/frontend-beheer/src/components/MetadataManual.vue new file mode 100644 index 00000000..8eb70db4 --- /dev/null +++ b/frontend-beheer/src/components/MetadataManual.vue @@ -0,0 +1,16 @@ + + + diff --git a/frontend-beheer/src/components/WarningDialog.vue b/frontend-beheer/src/components/WarningDialog.vue new file mode 100644 index 00000000..73687e74 --- /dev/null +++ b/frontend-beheer/src/components/WarningDialog.vue @@ -0,0 +1,76 @@ + + + + + diff --git a/frontend-beheer/src/components/layout/AppFooter.vue b/frontend-beheer/src/components/layout/AppFooter.vue new file mode 100644 index 00000000..9b4d0acf --- /dev/null +++ b/frontend-beheer/src/components/layout/AppFooter.vue @@ -0,0 +1,35 @@ + + + + + diff --git a/frontend-beheer/src/components/layout/AppHeader.vue b/frontend-beheer/src/components/layout/AppHeader.vue new file mode 100644 index 00000000..820687f1 --- /dev/null +++ b/frontend-beheer/src/components/layout/AppHeader.vue @@ -0,0 +1,118 @@ + + + + + diff --git a/frontend-beheer/src/components/layout/Breadcrumb.vue b/frontend-beheer/src/components/layout/Breadcrumb.vue new file mode 100644 index 00000000..e7b38103 --- /dev/null +++ b/frontend-beheer/src/components/layout/Breadcrumb.vue @@ -0,0 +1,46 @@ + + + + + diff --git a/frontend-beheer/src/config/footer.ts b/frontend-beheer/src/config/footer.ts new file mode 100644 index 00000000..5fb8fcef --- /dev/null +++ b/frontend-beheer/src/config/footer.ts @@ -0,0 +1,31 @@ +import type { FooterPage } from '@/types/footer' + +const footer: FooterPage[] = [ + { + key: 'manual', + label: 'Handleiding Publicatiestandaard', + path: 'https://algoritmes.pleio.nl/groups/view/fc9e6489-91e6-4177-b564-2cbea8e56132/kennisbank/files/6254c700-85ae-48dc-8f3b-31bcf6814cfc', + }, + { + key: 'pleio', + label: 'Algoritmes.pleio.nl', + path: 'https://algoritmes.pleio.nl/', + }, + { + key: 'digitaleoverheid_nl', + label: 'Digitale Overheid', + path: 'https://digitaleoverheid.nl/overzicht-van-alle-onderwerpen/algoritmes/', + }, + { + key: 'data_overheid_nl', + label: 'Data.overheid.nl', + path: 'https://data.overheid.nl', + }, + { + key: 'overheid_nl', + label: 'Overheid.nl', + path: 'https://overheid.nl/', + }, +] + +export default footer diff --git a/frontend-beheer/src/content.json b/frontend-beheer/src/content.json new file mode 100644 index 00000000..c7634347 --- /dev/null +++ b/frontend-beheer/src/content.json @@ -0,0 +1,76 @@ +{ + "shared": { + "error": { + "400": "Er is een fout opgetreden bij het verwerken van uw verzoek. Controleer de ingevoerde gegevens en probeer het opnieuw.", + "401": "U moet ingelogd zijn om deze actie uit te voeren. Log in of registreer om toegang te krijgen.", + "403": "U heeft geen toestemming om deze actie uit te voeren of toegang te krijgen tot deze bron.", + "404": "Het algoritme dat u zoekt is niet gevonden. Controleer de zoekopdracht of ga terug naar het overzicht van algoritmes.", + "500": "Er is een interne applicatiefout opgetreden. Neem contact op met de beheerder." + } + }, + "metadataManual": { + "title": "Handleiding metadatastandaard", + "url": "https://algoritmes.pleio.nl/groups/view/fc9e6489-91e6-4177-b564-2cbea8e56132/kennisbank/files/6254c700-85ae-48dc-8f3b-31bcf6814cfc" + }, + "overviewTable": { + "fetchAlgoritms": { + "error": "Er is een fout opgetreden bij het ophalen van de algoritmes." + } + }, + "formGenerator": { + "fetchMetadata": { + "error": "Er is een fout opgetreden bij het ophalen van het aanlevervoorschrift." + } + }, + "formDataStore": { + "fetch": { + "error": "Er is iets fout gegaan bij het opvragen van het algoritme." + }, + "create": { + "success": "Het algoritme is succesvol opgeslagen.", + "error": "Er is iets fout gegaan bij het aanmaken van het algoritme. De volgende velden geven een foutmelding:" + }, + "update": { + "success": "Het algoritme is succesvol opgeslagen.", + "error": "Er is iets fout gegaan bij het opslaan van het algoritme. De volgende velden geven een foutmelding:" + }, + "retract": { + "error": "Er is iets fout gegaan bij het intrekken van het algoritme.", + "success": "Dit algoritme is ingetrokken." + }, + "publish": { + "error": "Er is iets fout gegaan bij het publiceren van het algoritme.", + "success": "Het algoritme is succesvol gepubliceerd." + }, + "release": { + "error": "Er is iets fout gegaan bij het vrijgeven van het algoritme.", + "success": "Het algoritme is succesvol vrijgegeven." + }, + "preview": { + "error": "Er is iets fout gegaan bij het genereren van de voorbeeldpagina." + }, + "remove": { + "error": "Er is iets fout gegaan bij het verwijderen van het algoritme.", + "success": "Het algoritme is succesvol verwijderd." + } + }, + "Misc": { + "noOrgSelected": { + "error": "Er kan geen algoritme worden aangemaakt zonder een organisatie." + } + }, + "warningDialog": { + "publish": { + "text": "Weet u zeker dat u dit algoritme wilt publiceren? Het algoritme wordt dan gepubliceerd naar de conceptwebsite." + }, + "retract": { + "text": "Weet u zeker dat u de vrijgave van dit algoritme wilt intrekken? Het algoritme wordt dan verwijderd van de conceptwebsite." + }, + "release": { + "text": "Weet u zeker dat u dit algoritme wilt vrijgeven? Het algoritme kan dan worden gepubliceerd door BZK." + }, + "remove": { + "text": "Weet u zeker dat u dit algoritme wilt verwijderen? Het algoritme word volledig uit de database gehaald." + } + } +} \ No newline at end of file diff --git a/frontend-beheer/src/main.ts b/frontend-beheer/src/main.ts new file mode 100644 index 00000000..03946783 --- /dev/null +++ b/frontend-beheer/src/main.ts @@ -0,0 +1,89 @@ +import App from './App.vue' +import { createApp } from 'vue' +import { registerPlugins } from '@/plugins' + +import { useAuthStore } from '@/store/auth' +import Keycloak from 'keycloak-js' +import axios from 'axios' + +// ----------------------------------------------- Setup ----------------------------------------------- +let APIurl = 'http://localhost:8000/aanleverapi' +if (process.env.NODE_ENV === 'production') { + APIurl = `${window.location.origin}/aanleverapi` +} + +let keycloakConfigUrl = 'http://localhost:8000/conceptapi/config' +if (process.env.NODE_ENV === 'production') { + keycloakConfigUrl = `${window.location.origin}/conceptapi/config` +} + +export function getConfigs(): Promise { + // fetch configurations via backend + return new Promise((resolve) => { + axios.get(keycloakConfigUrl, { timeout: 2000 }) + .then((response: any) => { + resolve(response.data) + }).catch(function (err: any) { + console.log('failed to get config ' + err) + }) + }) +} + +// ----------------------------------------------- Create App ----------------------------------------------- + + +getConfigs().then((response: any) => { + const initOptions: any = { + url: `${response.keycloak_uri}`, + realm: `${response.keycloak_realm}`, + clientId: `${response.keycloak_client}`, + onLoad: 'login-required', + // onLoad: 'check-sso' + } + console.log('initializing keycloak at') + console.log(initOptions) + const keycloak = new Keycloak(initOptions) + + keycloak.init({ onLoad: initOptions.onLoad }).then((auth) => { + if (!auth) { + console.log('not yet Authenticated.') + } else { + console.log('Authenticated') + } + + // always add the authentication header to axios requests + axios.interceptors.request.use(function (config: any) { + const token = keycloak!.idToken as string + config.baseURL = APIurl + config.headers!.Authorization = `Bearer ${token}` + return config + }) + + const app = createApp(App) + registerPlugins(app) + // store keycloak object in pinia + const authStore = useAuthStore() + authStore.keycloak = keycloak + authStore.APIurl = APIurl + authStore.fetchOrganizations() + app.mount('#app') + + + //check token every 6 seconds + setInterval(() => { + keycloak.updateToken(70).then((refreshed) => { + if (refreshed) { + console.log('Token refreshed' + refreshed) + } else { + console.log('Token not refreshed, valid for ' + + Math.round(keycloak.tokenParsed!.exp! + keycloak.timeSkew! - new Date().getTime() / 1000) + ' seconds') + } + }).catch(() => { + console.error('Failed to refresh token') + }) + }, 6000) + + }).catch((error) => { + console.log(error) + }) +}) diff --git a/frontend-beheer/src/plugins/index.ts b/frontend-beheer/src/plugins/index.ts new file mode 100644 index 00000000..4e120eab --- /dev/null +++ b/frontend-beheer/src/plugins/index.ts @@ -0,0 +1,22 @@ +/** + * plugins/index.ts + * + * Automatically included in `./src/main.ts` + */ + +// Plugins +import { loadFonts } from './webfontloader' +import vuetify from './vuetify' +import pinia from '../store' +import router from '../router' + +// Types +import type { App } from 'vue' + +export function registerPlugins (app: App) { + loadFonts() + app + .use(vuetify) + .use(router) + .use(pinia) +} diff --git a/frontend-beheer/src/plugins/vuetify.ts b/frontend-beheer/src/plugins/vuetify.ts new file mode 100644 index 00000000..3df9b533 --- /dev/null +++ b/frontend-beheer/src/plugins/vuetify.ts @@ -0,0 +1,38 @@ +/** + * plugins/vuetify.ts + * + * Framework documentation: https://vuetifyjs.com` + */ + +// Styles +import '@mdi/font/css/materialdesignicons.css' +import 'vuetify/styles' +import { VDataTable } from 'vuetify/labs/VDataTable' + +// Composables +import { createVuetify } from 'vuetify' +import { nl } from 'vuetify/locale' + + +// https://vuetifyjs.com/en/introduction/why-vuetify/#feature-guides +export default createVuetify({ + components: { + VDataTable, + }, + theme: { + cspNonce: 'eQw4j9WgXcB', + themes: { + light: { + colors: { + primary: '#1867C0', + secondary: '#5CBBF6', + error: '#E53935', + }, + }, + }, + }, + locale: { + locale: 'nl', + messages: { nl }, + }, +}) diff --git a/frontend-beheer/src/plugins/webfontloader.ts b/frontend-beheer/src/plugins/webfontloader.ts new file mode 100644 index 00000000..0cf56148 --- /dev/null +++ b/frontend-beheer/src/plugins/webfontloader.ts @@ -0,0 +1,15 @@ +/** + * plugins/webfontloader.ts + * + * webfontloader documentation: https://github.com/typekit/webfontloader + */ + + export async function loadFonts () { + const webFontLoader = await import(/* webpackChunkName: "webfontloader" */'webfontloader') + + webFontLoader.load({ + google: { + families: ['Roboto:100,300,400,500,700,900&display=swap'], + }, + }) +} diff --git a/frontend-beheer/src/router/index.ts b/frontend-beheer/src/router/index.ts new file mode 100644 index 00000000..4dccdbcb --- /dev/null +++ b/frontend-beheer/src/router/index.ts @@ -0,0 +1,28 @@ +// Composables +import { createRouter, createWebHistory } from 'vue-router' + +const routes = [ + { + path: '/', + name: 'algorithm.index', + component: () => import('@/views/Overview.vue'), + }, + { + path: '/algoritme/aanmaken', + name: 'algorithm.create', + component: () => import('@/views/FormGenerator.vue'), + }, + { + path: '/algoritme/:lars/bewerken', + name: 'algorithm.edit', + component: () => import('@/views/FormGenerator.vue'), + props: true, + }, +] + +const router = createRouter({ + history: createWebHistory(import.meta.env.BASE_URL), + routes, +}) + +export default router diff --git a/frontend-beheer/src/services/index.ts b/frontend-beheer/src/services/index.ts new file mode 100644 index 00000000..ccd63e5b --- /dev/null +++ b/frontend-beheer/src/services/index.ts @@ -0,0 +1,160 @@ +import axios, { AxiosRequestConfig, AxiosResponse } from 'axios' +import config from '@/app-config' +import { Organization } from '@/types' +import { MetaDataResponse } from '@/types/form' +import { + AlgorithmForm, + AlgorithmListResponse, + AlgorithmResponse, + AlgorithmPreviewResponse, + UpdateAlgorithmResponse, + CreateAlgorithmResponse, + RemoveAlgorithmResponse, +} from '@/types/algorithm' + +const MDS_VERSION = + 'v' + config.metaDataStandard.preferredVersion.replace(/\./g, '_') + +function backendRequest( + config: AxiosRequestConfig +): Promise> { + return new Promise((resolve, reject) => { + axios(config) + .then((response) => { + resolve(response) + }) + .catch((error) => { + reject({ + status: error.response?.status ?? 500, + data: error.response?.data.detail ?? 'Er is iets misgegaan.', + }) + }) + }) +} + +export async function getMetaDataStandard( + version: string +): Promise { + const request: AxiosRequestConfig = { + method: 'GET', + url: `v${version.replace(/\./g, '_')}/openapi.json`, + } + return backendRequest(request) +} + +export async function getAlgorithm( + organization: Organization, + lars: string +): Promise { + const request: AxiosRequestConfig = { + method: 'GET', + url: `${MDS_VERSION}/organizations/${organization.id}/algorithms/${lars}`, + } + return backendRequest(request) +} + +export async function getAlgorithmList( + organization: Organization +): Promise { + const request: AxiosRequestConfig = { + method: 'GET', + url: `${MDS_VERSION}/organizations/${organization.id}/algorithms`, + } + return backendRequest(request) +} + +export async function createAlgorithm( + organization: Organization, + data: AlgorithmForm +): Promise { + delete data.created_by + delete data.create_dt + delete data.lars + delete data.released + delete data.published + + const request: AxiosRequestConfig = { + method: 'POST', + url: `v${data.standard_version.replace(/\./g, '_')}/organizations/${ + organization.id + }/algorithms`, + data, + } + return backendRequest(request) +} + +export async function updateAlgorithm( + organization: Organization, + lars: string, + data: AlgorithmForm +): Promise { + const sendData: AlgorithmForm = { ...data } + delete sendData.create_dt + delete sendData.lars + delete sendData.released + delete sendData.published + + const request: AxiosRequestConfig = { + method: 'PUT', + url: `v${sendData.standard_version.replace(/\./g, '_')}/organizations/${ + organization.id + }/algorithms/${lars}`, + data: sendData, + } + return backendRequest(request) +} + +export async function publishAlgorithm( + organization: Organization, + lars: string +): Promise { + const request: AxiosRequestConfig = { + method: 'PUT', + url: `${MDS_VERSION}/organizations/${organization.id}/algorithms/${lars}/publish`, + } + return backendRequest(request) +} + +export async function releaseAlgorithm( + organization: Organization, + lars: string +): Promise { + const request: AxiosRequestConfig = { + method: 'PUT', + url: `${MDS_VERSION}/organizations/${organization.id}/algorithms/${lars}/release`, + } + return backendRequest(request) +} + +export async function retractAlgorithm( + organization: Organization, + lars: string +): Promise { + const request: AxiosRequestConfig = { + method: 'DELETE', + url: `${MDS_VERSION}/organizations/${organization.id}/published-algorithms/${lars}/retract`, + } + return backendRequest(request) +} + +export async function generatePreview( + organization: Organization, + lars: string +): Promise { + const request: AxiosRequestConfig = { + method: 'GET', + url: `${MDS_VERSION}/organizations/${organization.id}/algorithms/${lars}/preview`, + } + return backendRequest(request) +} + +export async function removeAlgorithm( + organization: Organization, + lars: string +): Promise { + const request: AxiosRequestConfig = { + method: 'DELETE', + url: `${MDS_VERSION}/organizations/${organization.id}/algorithms/${lars}/remove`, + } + return backendRequest(request) +} diff --git a/frontend-beheer/src/store/auth.ts b/frontend-beheer/src/store/auth.ts new file mode 100644 index 00000000..5179255a --- /dev/null +++ b/frontend-beheer/src/store/auth.ts @@ -0,0 +1,58 @@ +// Utilities +import { defineStore } from 'pinia' +import Keycloak from 'keycloak-js' +import { Organization } from '@/types' +import { useLocalStorage } from '@vueuse/core' + +export const useAuthStore = defineStore('auth', { + state: () => ({ + keycloak: {} as Keycloak, + APIurl: 'http://localhost:8000/api', + organizations: [] as Organization[], + selectedOrg: useLocalStorage( + 'webform-selected-org', + {} as Organization + ), + }), + getters: { + canPublish(): boolean { + const role = this.keycloak.tokenParsed?.role + return role === 'publisher' || role === 'admin' + }, + canRemove(): boolean { + const role = this.keycloak.tokenParsed?.role + return role === 'admin' + }, + }, + actions: { + fetchOrganizations() { + const keycloakOrgStrings = this.keycloak.tokenParsed?.group + if (!keycloakOrgStrings || keycloakOrgStrings.length === 0) { + return + } + this.organizations = keycloakOrgStrings.map((orgString: string) => { + const orgId = orgString.split('/')?.pop() + if (!orgId) { + throw new Error('Could not parse Keycloak organization string.') + } + let orgName = orgId.replaceAll('-', ' ') + orgName = orgName.replace(/\b\w/g, (l: string) => l.toUpperCase()) + return { id: orgId, name: orgName } + }) + try { + this.selectOrganization(this.selectedOrg.id) + } catch { + this.selectedOrg = this.organizations[0]! + } + }, + selectOrganization(orgId: string) { + const organization = this.organizations.find((org) => org.id === orgId) + if (!organization) { + throw new Error( + 'Selected organization is not found in organizations array.' + ) + } + this.selectedOrg = organization! + }, + }, +}) diff --git a/frontend-beheer/src/store/form-data.ts b/frontend-beheer/src/store/form-data.ts new file mode 100644 index 00000000..7dbc557d --- /dev/null +++ b/frontend-beheer/src/store/form-data.ts @@ -0,0 +1,193 @@ +// Store for managing the algorithms that the user has access to. +import { defineStore } from 'pinia' +import { useAuthStore } from './auth' +import { useSchemaStore } from './schema' +import { + getAlgorithm, + updateAlgorithm, + createAlgorithm, + retractAlgorithm, + publishAlgorithm, + releaseAlgorithm, + generatePreview, + removeAlgorithm, +} from '@/services' +import { + AlgorithmForm, + CreateAlgorithmResponse, + RemoveAlgorithmResponse, + UpdateAlgorithmResponse, + NoOrgResponse, +} from '@/types/algorithm' +import content from '@/content.json' +import { Organization } from '@/types' +import { noOrgSelectedResponse } from '@/util' + +const authStore = useAuthStore() + +export const useFormDataStore = defineStore('form-data', { + state: () => ({ + schemaStore: useSchemaStore(), + data: {} as AlgorithmForm, + loaded: false, + feedback: { success: '', error: '', errorList: [] }, + previewLoading: false, + unsavedChanges: false, + }), + getters: { + cleanedData(): AlgorithmForm { + return Object.fromEntries( + Object.entries(this.data).filter(([, v]) => v !== '') + ) + }, + orgFromData(): Organization | undefined { + return authStore.organizations.find( + (org) => org.name == this.data.organization + ) + }, + }, + actions: { + async fetchData(lars: string): Promise { + this.loaded = false + this.data = {} + await getAlgorithm(authStore.selectedOrg, lars) + .then((response) => { + this.data = response.data + if ( + this.schemaStore.loadedSchema !== response.data.standard_version + ) { + this.schemaStore.fetchSchema(response.data.standard_version) + } + this.loaded = true + }) + .catch((error) => { + console.error(error.data) + this.feedback.error = content.formDataStore.fetch.error + this.loaded = true + }) + }, + resetFeedback(): void { + this.feedback = { success: '', error: '', errorList: [] } + }, + async handleUpdate( + lars: string + ): Promise { + if (!this.orgFromData) return noOrgSelectedResponse() + return await updateAlgorithm(this.orgFromData, lars, this.cleanedData) + .then((response) => { + if (response.data?.message != 'Version has no changes.') { + this.data.released = false + this.data.published = false + this.unsavedChanges = false + } + this.feedback.success = content.formDataStore.update.success + return response + }) + .catch((response) => { + if (response.status == 422) { + this.feedback.errorList = response.data.map( + (error: any) => + this.schemaStore.formProperties[error.loc[1]]!.title + ) + } + this.feedback.error = content.formDataStore.update.error + return response + }) + }, + async handleCreate(): Promise { + if (!this.orgFromData) return noOrgSelectedResponse() + return await createAlgorithm(this.orgFromData, this.cleanedData) + .then((response) => { + this.data.lars = response.data.lars_code + this.unsavedChanges = false + // Change organization based on the saved algorithm. Needed for loading from cookies + authStore.selectOrganization(this.orgFromData!.id) + this.feedback.success = content.formDataStore.create.success + return response + }) + .catch((response) => { + if (response.status == 422) { + this.feedback.errorList = response.data.map( + (error: any) => + this.schemaStore.formProperties[error.loc[1]]!.title + ) + } + this.feedback.error = content.formDataStore.create.error + return response + }) + }, + async handleRetract(lars: string): Promise { + if (!this.orgFromData) return noOrgSelectedResponse() + await retractAlgorithm(this.orgFromData, lars) + .then(() => { + this.data.published = false + this.data.released = false + this.feedback.success = content.formDataStore.retract.success + }) + .catch(() => { + this.feedback.error = content.formDataStore.retract.error + }) + }, + async handlePublish(lars: string): Promise { + if (!this.orgFromData) return noOrgSelectedResponse() + await publishAlgorithm(this.orgFromData, lars) + .then(() => { + this.data.published = true + this.feedback.success = content.formDataStore.publish.success + }) + .catch(() => { + this.feedback.error = content.formDataStore.publish.error + }) + }, + async handleRelease(lars: string): Promise { + if (!this.orgFromData) return noOrgSelectedResponse() + await releaseAlgorithm(this.orgFromData, lars) + .then(() => { + this.data.released = true + this.feedback.success = content.formDataStore.release.success + }) + .catch(() => { + this.feedback.error = content.formDataStore.release.error + }) + }, + async handleRemove( + lars: string + ): Promise { + if (!this.orgFromData) return noOrgSelectedResponse() + return await removeAlgorithm(this.orgFromData, lars) + .then((response) => { + this.unsavedChanges = false + this.feedback.success = content.formDataStore.remove.success + return response + }) + .catch((response) => { + this.feedback.error = content.formDataStore.remove.error + return response + }) + }, + async handlePreview(lars: string): Promise { + if (!this.orgFromData) return noOrgSelectedResponse() + this.previewLoading = true + generatePreview(this.orgFromData, lars) + .then((response) => { + // open response.url in new tab + window.open(response.data.url, '_blank') + }) + .catch(() => { + this.feedback.error = content.formDataStore.preview.error + }) + .finally(() => { + this.previewLoading = false + }) + }, + pruneData(): void { + // Removes all data keys that do not appear in the current schema + const formProperties = this.schemaStore.formProperties + Object.keys(this.data).forEach((element) => { + if (!(element in formProperties) && element != 'lars') { + delete this.data[element] + } + }) + }, + }, +}) diff --git a/frontend-beheer/src/store/index.ts b/frontend-beheer/src/store/index.ts new file mode 100644 index 00000000..15362525 --- /dev/null +++ b/frontend-beheer/src/store/index.ts @@ -0,0 +1,4 @@ +// Utilities +import { createPinia } from 'pinia' + +export default createPinia() diff --git a/frontend-beheer/src/store/overview.ts b/frontend-beheer/src/store/overview.ts new file mode 100644 index 00000000..0e01b1bc --- /dev/null +++ b/frontend-beheer/src/store/overview.ts @@ -0,0 +1,66 @@ +// Store for managing the algorithms that the user has access to. +import { defineStore } from 'pinia' +import { Algorithm } from '@/types/algorithm' +import { getAlgorithmList } from '@/services' +import content from '@/content.json' +import { Organization } from '@/types' + +export const useAlgorithmStore = defineStore('algorithm', { + state: () => ({ + algorithms: [] as Algorithm[], + loaded: false as boolean, + error: '', + success: '', + }), + getters: { + algorithmsFormatted(): Algorithm[] { + const algorithmsSorted = this.algorithms.sort( + (a, b) => + new Date(b.last_update_dt).getTime() - + new Date(a.last_update_dt).getTime() + ) + return algorithmsSorted.map((algorithm) => { + const date = new Date(algorithm.last_update_dt) + .toLocaleDateString() + .replaceAll('/', '-') + const time = new Date(algorithm.last_update_dt).toLocaleTimeString() + algorithm.last_update_dt = `${date} ${time}` + return algorithm + }) + }, + }, + actions: { + fetchAlgorithms(organization: Organization): void { + if (Object.keys(organization).length !== 0) { + this.loaded = false + this.algorithms = [] + getAlgorithmList(organization) + .then((response) => { + this.algorithms = response.data.map((a) => { + let overviewStatus + if (a.current_version_published) { + overviewStatus = 'Gepubliceerd' + } else if (a.current_version_released && !a.published) { + overviewStatus = 'Vrijgegeven' + } else if (a.published && a.current_version_released) { + overviewStatus = 'Gepubliceerd, nieuwe versie vrijgegeven' + } else if (a.published) { + overviewStatus = 'Gepubliceerd, nieuwe versie in ontwikkeling' + } else { + overviewStatus = 'In ontwikkeling' + } + return { ...a, overviewStatus: overviewStatus } + }) + this.loaded = true + }) + .catch((error) => { + console.error(error.data) + this.error = content.overviewTable.fetchAlgoritms.error + this.loaded = true + }) + } else { + this.loaded = true + } + }, + }, +}) diff --git a/frontend-beheer/src/store/schema.ts b/frontend-beheer/src/store/schema.ts new file mode 100644 index 00000000..e4a74937 --- /dev/null +++ b/frontend-beheer/src/store/schema.ts @@ -0,0 +1,128 @@ +// Store for managing the algorithms that the user has access to. +import { getMetaDataStandard } from '@/services' +import { + FormFieldProperties, + FormProperties, + OpenApiSchemas, +} from '@/types/form' +import { defineStore } from 'pinia' +import content from '@/content.json' +import { + buildRulesFromProperties, + buildPlaceholderFromSchema, +} from '@/util/form' +import { useAuthStore } from './auth' +import { useFormDataStore } from './form-data' + +const authStore = useAuthStore() + +export const useSchemaStore = defineStore('schema', { + state: () => ({ + rawSchemas: {} as OpenApiSchemas, + loadedSchema: '' as string, + loaded: false as boolean, + feedback: { success: '', error: '' }, + }), + getters: { + formProperties(self): FormProperties { + if (self.rawSchemas.AlgorithmIn) { + const schemaEntries = Object.entries( + self.rawSchemas.AlgorithmIn.properties + ) + const formProperties = Object.fromEntries( + schemaEntries.map(([k, v]) => { + let allowedValues = undefined + if (v.allOf) { + // The enumerations are in their own schema, on the same depth as the main schema. + // The $ref is a path string, but only the final bit is needed. + const schema: string | undefined = v.allOf[0]?.$ref + .split('/') + .slice(-1)[0] + if (schema) { + allowedValues = self.rawSchemas[schema].enum + } + } + + const dataStore = useFormDataStore() + let fixedValue: string | undefined = undefined + if (k == 'organization') { + const organizations = authStore.organizations + if (!dataStore.data.lars) { + if (organizations.length > 1) { + allowedValues = organizations.map((org) => org.name) + v.type = 'enum' + } else if (organizations.length == 1) { + fixedValue = organizations[0]!.name + dataStore.data.organization = fixedValue + v.type = 'fixed' + } + } else { + v.type = 'fixed' + if ( + organizations.includes( + dataStore.orgFromData || { id: '', name: '' } + ) + ) { + fixedValue = dataStore.data.organization + } else { + fixedValue = authStore.selectedOrg.name + dataStore.data.organization = fixedValue + } + } + } else if (k == 'standard_version') { + // Standard_version cannot be adjusted. + v.type = 'fixed' + fixedValue = allowedValues[0] + } + + const required: boolean = + self.rawSchemas.AlgorithmIn?.required?.includes(k) || false + + const placeholder: string = buildPlaceholderFromSchema(v) + + let formFieldProperties: FormFieldProperties = { + title: v.title, + maxLength: v.maxLength, + type: v.type, + example: v.example, + showAlways: v.show_always, + helpText: v.help_text, + instructions: v.instructions, + required, + allowedValues, + fixedValue, + placeholder, + } + + const rules = buildRulesFromProperties(formFieldProperties) + + formFieldProperties = { ...formFieldProperties, rules: rules } + + return [k, formFieldProperties] + }) + ) + return formProperties + } else { + return {} + } + }, + }, + actions: { + async fetchSchema(version: string): Promise { + this.loaded = false + await getMetaDataStandard(version) + .then((response) => { + this.rawSchemas = response.data.components.schemas + this.loaded = true + this.loadedSchema = version + }) + .catch((error) => { + console.error(error.data) + this.feedback.error = content.formGenerator.fetchMetadata.error + this.rawSchemas = {} + this.loaded = true + this.loadedSchema = '' + }) + }, + }, +}) diff --git a/frontend-beheer/src/types/algorithm.ts b/frontend-beheer/src/types/algorithm.ts new file mode 100644 index 00000000..c94943e3 --- /dev/null +++ b/frontend-beheer/src/types/algorithm.ts @@ -0,0 +1,55 @@ +import { FastApiResponse } from '@/types/index' + +export interface Algorithm { + name?: string + schema_version?: string + last_update_dt: string + lars: string + source_id?: number + published: boolean + current_version_released: boolean + current_version_published: boolean + last_update_by?: string + overviewStatus?: string +} + +export interface AlgorithmForm { + name?: string + organization?: string + published?: boolean + standard_version?: any + + [key: string]: any +} + +export interface AlgorithmListResponse extends FastApiResponse { + data: Algorithm[] +} + +export interface AlgorithmResponse extends FastApiResponse { + data: AlgorithmForm +} + +export interface CreateAlgorithmResponse extends FastApiResponse { + data: { + lars_code: string + } +} + +export interface UpdateAlgorithmResponse extends FastApiResponse { + data: null | { message: string } +} + +export interface RemoveAlgorithmResponse extends FastApiResponse { + data: null +} + +export interface AlgorithmPreviewResponse extends FastApiResponse { + data: { + url: string + } +} + +export interface NoOrgResponse extends FastApiResponse { + data: null +} diff --git a/frontend-beheer/src/types/footer.ts b/frontend-beheer/src/types/footer.ts new file mode 100644 index 00000000..4712890e --- /dev/null +++ b/frontend-beheer/src/types/footer.ts @@ -0,0 +1,5 @@ +export type FooterPage = { + path: string + key: string + label?: string +} diff --git a/frontend-beheer/src/types/form.ts b/frontend-beheer/src/types/form.ts new file mode 100644 index 00000000..8324a3fa --- /dev/null +++ b/frontend-beheer/src/types/form.ts @@ -0,0 +1,53 @@ +import { FastApiResponse } from '@/types/index' + +export interface FormFieldProperties { + title: string + maxLength?: number + type: string + example: string + showAlways: boolean + helpText: string + instructions: string + rules?: ((v: any) => boolean | string)[] + required: boolean + allowedValues?: string[] + fixedValue?: string + placeholder?: string +} + +export interface FormProperties { + [key: string]: FormFieldProperties +} + +export interface SchemaProperties { + title: string + maxLength?: number + type: string + allOf: { $ref: string }[] + example: string + show_always: boolean + help_text: string + instructions: string +} + +export interface OpenApiSchemas { + [key: string]: any + + AlgorithmIn?: { + [key: string]: any + properties: { + [key: string]: SchemaProperties + } + required?: string[] + } +} + +export interface MetaDataResponse extends FastApiResponse { + data: { + [key: string]: any + components: { + [key: string]: any + schemas: OpenApiSchemas + } + } +} diff --git a/frontend-beheer/src/types/index.ts b/frontend-beheer/src/types/index.ts new file mode 100644 index 00000000..c74bacb8 --- /dev/null +++ b/frontend-beheer/src/types/index.ts @@ -0,0 +1,16 @@ +export interface FastApiResponse { + status: number | null + data: any + + [key: string]: any +} + +export interface Organization { + id: string + name: string +} + +export interface Breadcrumb { + text: string; + to: string; +} diff --git a/frontend-beheer/src/util/form.ts b/frontend-beheer/src/util/form.ts new file mode 100644 index 00000000..79eb8d43 --- /dev/null +++ b/frontend-beheer/src/util/form.ts @@ -0,0 +1,37 @@ +import { FormFieldProperties, SchemaProperties } from '@/types/form' + +export function buildRulesFromProperties( + field: FormFieldProperties +): ((v: any) => boolean | string)[] { + const rules = [] + if (field.type == 'string') { + if (field.maxLength) { + rules.push( + (v: string | null) => + (v?.length || 0) <= field.maxLength! || + `Maximaal ${field.maxLength} karakters` + ) + } + } + if (field.type == 'enum') { + if (field.allowedValues) { + rules.push( + (v: string | null) => + (v ? Object.values(field.allowedValues!).includes(v) : true) || + 'Selecteer 1 van de toegestane waardes.' + ) + } + } + + if (field.required) { + rules.push((v: string | null) => !!v || 'Dit veld moet ingevuld zijn.') + } + return rules +} + +export function buildPlaceholderFromSchema(field: SchemaProperties): string { + if (field.show_always) { + return 'Dit veld is niet ingevuld' + } + return '' +} diff --git a/frontend-beheer/src/util/index.ts b/frontend-beheer/src/util/index.ts new file mode 100644 index 00000000..5cbb57de --- /dev/null +++ b/frontend-beheer/src/util/index.ts @@ -0,0 +1,9 @@ +import { NoOrgResponse } from '@/types/algorithm' +import { useFormDataStore } from '@/store/form-data' +import content from '@/content.json' + +export function noOrgSelectedResponse(): NoOrgResponse { + const dataStore = useFormDataStore() + dataStore.feedback.error = content.Misc.noOrgSelected.error + return { status: 400, data: null } +} diff --git a/frontend-beheer/src/views/FormGenerator.vue b/frontend-beheer/src/views/FormGenerator.vue new file mode 100644 index 00000000..bacbe85a --- /dev/null +++ b/frontend-beheer/src/views/FormGenerator.vue @@ -0,0 +1,139 @@ + + + + + diff --git a/frontend-beheer/src/views/Overview.vue b/frontend-beheer/src/views/Overview.vue new file mode 100644 index 00000000..61b157a5 --- /dev/null +++ b/frontend-beheer/src/views/Overview.vue @@ -0,0 +1,155 @@ + + + + + diff --git a/frontend-beheer/src/vite-env.d.ts b/frontend-beheer/src/vite-env.d.ts new file mode 100644 index 00000000..323c78a6 --- /dev/null +++ b/frontend-beheer/src/vite-env.d.ts @@ -0,0 +1,7 @@ +/// + +declare module '*.vue' { + import type { DefineComponent } from 'vue' + const component: DefineComponent<{}, {}, any> + export default component +} diff --git a/frontend-beheer/tsconfig.json b/frontend-beheer/tsconfig.json new file mode 100644 index 00000000..a03ee5cd --- /dev/null +++ b/frontend-beheer/tsconfig.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "types": ["vuetify", "node",], + "baseUrl": ".", + "target": "ESNext", + "useDefineForClassFields": true, + "module": "ESNext", + "moduleResolution": "Node", + "strict": true, + "jsx": "preserve", + "resolveJsonModule": true, + "isolatedModules": true, + "esModuleInterop": true, + "lib": ["ESNext", "DOM"], + "skipLibCheck": true, + "noUncheckedIndexedAccess": true, + + "noEmit": true, + "paths": { + "@/*": [ + "src/*" + ] + } + }, + "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"], + "references": [{ "path": "./tsconfig.node.json" }], + "exclude": ["node_modules"] +} diff --git a/frontend-beheer/tsconfig.node.json b/frontend-beheer/tsconfig.node.json new file mode 100644 index 00000000..9d31e2ae --- /dev/null +++ b/frontend-beheer/tsconfig.node.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "Node", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/frontend-beheer/vite.config.ts b/frontend-beheer/vite.config.ts new file mode 100644 index 00000000..e6c148b3 --- /dev/null +++ b/frontend-beheer/vite.config.ts @@ -0,0 +1,53 @@ +// Plugins +import vue from '@vitejs/plugin-vue' +import vuetify, { transformAssetUrls } from 'vite-plugin-vuetify' + +// Utilities +import { defineConfig } from 'vite' +import { fileURLToPath, URL } from 'node:url' + +// https://vitejs.dev/config/ +export default defineConfig({ + base: '/webformulier', + plugins: [ + vue({ + template: { transformAssetUrls }, + }), + // https://github.com/vuetifyjs/vuetify-loader/tree/next/packages/vite-plugin + vuetify({ + autoImport: true, + }), + ], + css: { + preprocessorOptions: { + scss: { + // https://stackoverflow.com/a/71071183 + // https://stackoverflow.com/a/71540999 + additionalData: ` + @import "@/assets/styles/main.scss"; + `, + }, + }, + }, + define: { 'process.env': {} }, + resolve: { + alias: [ + { + find: '@', + replacement: fileURLToPath(new URL('./src', import.meta.url)), + }, + { + find: 'public', + replacement: fileURLToPath(new URL('./public', import.meta.url)), + }, + { + find: 'assets', + replacement: fileURLToPath(new URL('./src/assets', import.meta.url)), + }, + ], + extensions: ['.js', '.json', '.jsx', '.mjs', '.ts', '.tsx', '.vue'], + }, + server: { + port: 8080, + }, +}) diff --git a/frontend/.env.dummy b/frontend/.env.dummy index 7b8853fe..1b031334 100644 --- a/frontend/.env.dummy +++ b/frontend/.env.dummy @@ -1 +1,2 @@ -NUXT_PUBLIC_API_BASE_URL=http://localhost:8000/api \ No newline at end of file +NUXT_PUBLIC_API_BASE_URL=http://localhost:8000/api +NUXT_AANLEVER_BASE_URL=http://localhost:8000/aanleverapi diff --git a/frontend/.eslintrc b/frontend/.eslintrc index ac02e0a8..ebd7d0cc 100644 --- a/frontend/.eslintrc +++ b/frontend/.eslintrc @@ -10,6 +10,7 @@ "plugin:prettier/recommended" ], "rules": { - "dot-notation": "off" + "dot-notation": "off", + "vue/no-v-html": "off" } } diff --git a/frontend/app.vue b/frontend/app.vue index f8eacfa7..4927fefc 100644 --- a/frontend/app.vue +++ b/frontend/app.vue @@ -1,5 +1,24 @@ - diff --git a/frontend/components/MailLink.vue b/frontend/components/MailLink.vue new file mode 100644 index 00000000..9e7ea903 --- /dev/null +++ b/frontend/components/MailLink.vue @@ -0,0 +1,16 @@ + + + diff --git a/frontend/components/NuxtIcon.vue b/frontend/components/NuxtIcon.vue index f93a623c..06564f31 100644 --- a/frontend/components/NuxtIcon.vue +++ b/frontend/components/NuxtIcon.vue @@ -1,5 +1,5 @@ diff --git a/frontend/components/TablePagination.vue b/frontend/components/TablePagination.vue index 4d1b172c..f24f4861 100644 --- a/frontend/components/TablePagination.vue +++ b/frontend/components/TablePagination.vue @@ -1,72 +1,86 @@ @@ -135,4 +154,8 @@ nav { .pagenumber-elipsis { display: inline-block; } + +.pagination-mobile { + font-size: 91%; +} diff --git a/frontend/components/algoritme/AccordionRow.vue b/frontend/components/algoritme/AccordionRow.vue index 40d9df54..6a0ad95f 100644 --- a/frontend/components/algoritme/AccordionRow.vue +++ b/frontend/components/algoritme/AccordionRow.vue @@ -1,32 +1,50 @@ - diff --git a/frontend/components/algoritme/AccordionRows.vue b/frontend/components/algoritme/AccordionRows.vue index 83198cb3..6eda0711 100644 --- a/frontend/components/algoritme/AccordionRows.vue +++ b/frontend/components/algoritme/AccordionRows.vue @@ -1,20 +1,19 @@ diff --git a/frontend/components/algoritme/AlgoritmeFilters.vue b/frontend/components/algoritme/AlgoritmeFilters.vue index 0ac7cd86..f16aa9a7 100644 --- a/frontend/components/algoritme/AlgoritmeFilters.vue +++ b/frontend/components/algoritme/AlgoritmeFilters.vue @@ -1,28 +1,26 @@ @@ -49,4 +48,8 @@ const footerKeys = Object.keys(footer) .bottom-margin { padding-bottom: 1.75em; } + +.after-footer { + padding: 1em 0; +} diff --git a/frontend/components/views/AppHeader.vue b/frontend/components/views/AppHeader.vue index 826f1ab6..613a7952 100644 --- a/frontend/components/views/AppHeader.vue +++ b/frontend/components/views/AppHeader.vue @@ -7,13 +7,14 @@ class="hidden-desktop button button--icon-hamburger" data-handler="toggle-nav" aria-controls="nav" + tabindex="3" :aria-expanded="menuExpanded ? 'true' : 'false'" @click="menuExpanded = !menuExpanded" > Menu

    -
    - -
    @@ -39,40 +37,39 @@
  1. - {{ item.label }} + + {{ item.label }} +
  2. - diff --git a/frontend/layouts/default.vue b/frontend/layouts/default.vue index fe05c82d..1f70a355 100644 --- a/frontend/layouts/default.vue +++ b/frontend/layouts/default.vue @@ -1,7 +1,7 @@ diff --git a/frontend/locales/en.json b/frontend/locales/en.json index 6627308f..e3dd9f6a 100644 --- a/frontend/locales/en.json +++ b/frontend/locales/en.json @@ -1,13 +1,28 @@ { + "algoritmeIndex": { + "pageTitle": "Search for algorithms", + "noResults": { + "p1": "Please try again. You can search in the following categories:", + "l1": "Words contained in the name (title) of the algorithm", + "l2": "Words contained in the description of the algorithm", + "l3": "The name of the responsible organisation of the algorithm." + } + }, "english?": "true", "home-highlight-algorithm-text": "Or go directly to one of these algorithms", "you-are-here": "You are here", "ontbreekt": "Field not filled in.", - "locale-en": "English", - "locale-nl": "Dutch", - "selectLanguage": "Choose language", - "foundResults": "No results found | 1 result found | {n} results found", + "locales": { + "en": "English", + "nl": "Dutch" + }, + "currentLanguage": "English", + "selectLanguage": "This website in other languages", + "foundResults": "No algorithms were found | 1 result found | {n} results found", + "forSearch": " for {searchQuery}", "noResults": "No algorithm was found for this search request.", + "externalLink": "Link to external page", + "mailLink": "Link to mailing address", "footer": { "text": "Note: this website is under development. Information will change often. Do you want to help?", "textAskApply": "Please apply", @@ -23,7 +38,8 @@ "ext_overheid_nl": "Overheid.nl", "ext_rijksoverheid_nl": "Rijksoverheid.nl", "ext_digitaleoverheid_nl": "Digitale Overheid", - "ext_data_overheid_nl": "Data.overheid.nl" + "ext_data_overheid_nl": "Data.overheid.nl", + "ext_pleio": "Algoritmes.pleio.nl" } }, "algoritmeRegister": "Algorithm register", @@ -40,13 +56,15 @@ "searchHint": "What are you looking for?", "search": "Search", "selectedAlgorithms": "Selected algorithms", - "switchToLanguage": { - "nl": "Toon in het Nederlands" + "filters": { + "aria/remove": "Remove {what} as filter" }, + "downloadAllAlgorithms": "Download all algorithms (.csv)", + "switchToLanguage": "Switch to {language}", "showFilters": "Show filters", "hideFilters": "Hide filters", "searchResultCard": { - "readMore": "read more" + "readMore": "Read more" }, "navigation": { "home": "Home", @@ -60,14 +78,17 @@ "db": "Dashboard" }, "pagination": { - "goTo": "Go to page {n}" + "page": "Page", + "goTo": "Go to page {n}", + "goToNextPage": "Go to next page", + "goToPreviousPage": "Go to previous page" }, "homePageText": { "paragraph1": "On this website governmental organisations publish the algorithms that are in use.", "paragraph2": "Effort is made to publish impactful algorithms. This to ensure the purpose of algorithms and to make sure people involved can examine the algorithms. ", "paragraph3Header": "Progress", - "paragraph3part1": "At this moment you will find ", - "paragraph3part2": " algorithms on this website." + "paragraph3part1": "At this moment there are ", + "paragraph3part2": " algorithms published on this website." }, "dashboard": { "informationType": "Information type", @@ -85,7 +106,24 @@ "numberOfMatches": "Matches", "loadingText": "Loading" }, + "getAlgorithmPropertyExplanation": "Explanation of algorithm property '{field}'", "algorithmProperties": { + "source_id": { + "label": "Source-ID", + "description": "The unique code the owner uses for this algorithm." + }, + "provider": { + "label": "External provider", + "description": "If applicable, the external provider of the algorithm." + }, + "process_index_url": { + "label": "Link to Processing Index", + "description": "The link to the GDPR-processing in a public register of the algorithm." + }, + "tags": { + "label": "Tags", + "description": "Keywords describing the algorithm to improve search engine results in this register." + }, "toegevoegd_op": { "label": "Toegevoegd op" }, @@ -236,11 +274,7 @@ "label": "Metadata", "description": "No description" }, - "schema_metadata": { - "label": "Scheme", - "description": "The registration scheme; in machine readable format." - }, - "schema": { + "standard_version": { "label": "Scheme", "description": "The registration scheme; in machine readable format." }, @@ -296,4 +330,4 @@ "11": "November", "12": "December" } -} +} \ No newline at end of file diff --git a/frontend/locales/nl.json b/frontend/locales/nl.json index e84fdab2..2308d18f 100644 --- a/frontend/locales/nl.json +++ b/frontend/locales/nl.json @@ -1,13 +1,28 @@ { + "algoritmeIndex": { + "pageTitle": "Zoek naar algoritmes", + "noResults": { + "p1": "Probeer het opnieuw. Je kan zoeken op de volgende woorden:", + "l1": "Woorden in de naam (titel) van het algoritme", + "l2": "Woorden in de omschrijving van het algoritme", + "l3": "De naam van de organisatie die verantwoordelijk is voor het algoritme." + } + }, "english?": "false", "home-highlight-algorithm-text": "Of bekijk direct een van de volgende algoritmes", "you-are-here": "U bent hier", "ontbreekt": "Veld niet ingevuld.", - "locale-en": "Engels", - "locale-nl": "Nederlands", - "selectLanguage": "Kies taal", - "foundResults": "Geen resultaten gevonden | 1 resultaat gevonden | {n} resultaten gevonden", + "locales": { + "en": "Engels", + "nl": "Nederlands" + }, + "currentLanguage": "Nederlands", + "selectLanguage": "Deze website in andere talen", + "foundResults": "Er zijn geen algoritmes gevonden | 1 resultaat gevonden | {n} resultaten gevonden", + "forSearch": " voor {searchQuery}", "noResults": "Geen algoritmes gevonden voor de huidige zoekopdracht.", + "externalLink": "Link naar externe pagina", + "mailLink": "Link naar een e-mailadres", "footer": { "text": "Let op: deze website is in ontwikkeling. De informatie verandert vaak. Wil je meehelpen?", "textAskApply": "Meld je dan aan", @@ -23,7 +38,8 @@ "ext_overheid_nl": "Overheid.nl", "ext_rijksoverheid_nl": "Rijksoverheid.nl", "ext_digitaleoverheid_nl": "Digitale Overheid", - "ext_data_overheid_nl": "Data.overheid.nl" + "ext_data_overheid_nl": "Data.overheid.nl", + "ext_pleio": "Algoritmes.pleio.nl" } }, "algoritmeRegister": "Algoritmeregister", @@ -40,13 +56,15 @@ "searchHint": "Waar ben je naar op zoek?", "search": "Zoeken", "selectedAlgorithms": "Geselecteerde algoritmes", - "switchToLanguage": { - "en": "Switch to English" + "filters": { + "aria/remove": "{what} verwijderen als filter" }, + "downloadAllAlgorithms": "Download alle algoritmes (.csv)", + "switchToLanguage": "Toon in het {language}", "showFilters": "Toon filters", "hideFilters": "Verberg filters", "searchResultCard": { - "readMore": "lees meer" + "readMore": "Lees meer" }, "navigation": { "home": "Home", @@ -60,7 +78,10 @@ "db": "Dashboard" }, "pagination": { - "goTo": "Ga naar pagina {n}" + "page": "Pagina", + "goTo": "Ga naar pagina {n}", + "goToNextPage": "Ga naar volgende pagina", + "goToPreviousPage": "Ga naar vorige pagina" }, "homePageText": { "paragraph1": "Op deze website publiceren overheidsorganisaties de algoritmes die zij gebruiken in hun werk.", @@ -85,7 +106,24 @@ "numberOfMatches": "Aantal", "loadingText": "Aan het laden" }, + "getAlgorithmPropertyExplanation": "Uitleg over het algoritme-eigenschap '{field}'", "algorithmProperties": { + "source_id": { + "label": "Bron-ID", + "description": "De unieke code van dit algoritme in het register van de eigenaar" + }, + "provider": { + "label": "Leverancier", + "description": "Indien van toepassing, de externe leverancier van het algoritme." + }, + "process_index_url": { + "label": "Link naar verwerkingsregister", + "description": "De link naar de AVG-verwerking in een publiek register van het algoritme." + }, + "tags": { + "label": "Tags", + "description": "Trefwoorden over het algoritme, om de vindbaarheid van een algoritmeregistratie te vergroten." + }, "toegevoegd_op": { "label": "Toegevoegd op" }, @@ -236,11 +274,7 @@ "label": "Metadata", "description": "Geen beschrijving" }, - "schema_metadata": { - "label": "Schema", - "description": "Het schema gebruikt voor deze registratie in machine leesbaar format." - }, - "schema": { + "standard_version": { "label": "Schema", "description": "Het schema gebruikt voor deze registratie in machine leesbaar format." }, @@ -296,4 +330,4 @@ "11": "november", "12": "december" } -} +} \ No newline at end of file diff --git a/frontend/nuxt.config.ts b/frontend/nuxt.config.ts index 24d96b3b..96a14dc1 100644 --- a/frontend/nuxt.config.ts +++ b/frontend/nuxt.config.ts @@ -1,6 +1,5 @@ -import { resolve, dirname } from 'node:path' -import { fileURLToPath } from 'url' -import VueI18nVitePlugin from '@intlify/unplugin-vue-i18n/vite' +import en from './locales/en.json' +import nl from './locales/nl.json' // https://next.vuetifyjs.com/en/features/treeshaking/#automatic-treeshaking // import vuetify from 'vite-plugin-vuetify' @@ -10,16 +9,21 @@ export default defineNuxtConfig({ link: [{ rel: 'icon', type: 'image/png', href: '/favicon.ico' }], }, }, - modules: [ - 'nuxt-icon', - // '@vueuse/nuxt', - // async (options, nuxt) => { - // nuxt.hooks.hook('vite:extendConfig', (config) => - // // @ts-ignore - // config.plugins.push(vuetify()) - // ) - // }, - ], + modules: ['nuxt-icon', '@nuxtjs/i18n'], + i18n: { + strategy: 'prefix', + locales: ['nl', 'en'], + defaultLocale: 'nl', + vueI18n: { + globalInjection: true, + locale: 'nl', + fallbackLocale: 'nl', + messages: { + en, + nl, + }, + }, + }, vite: { css: { preprocessorOptions: { @@ -30,21 +34,13 @@ export default defineNuxtConfig({ }, }, }, - plugins: [ - VueI18nVitePlugin({ - include: [ - resolve(dirname(fileURLToPath(import.meta.url)), './locales/*.json'), - ], - }), - ], }, css: ['@/assets/styles/main.scss'], - // build: { - // transpile: ['vuetify'], - // }, runtimeConfig: { public: { apiBaseUrl: process.env.NUXT_PUBLIC_API_BASE_URL || '', + NUXT_APP_BASE_URL: process.env.NUXT_APP_BASE_URL || '/', + aanleverBaseUrl: process.env.NUXT_AANLEVER_BASE_URL || '', }, }, typescript: { diff --git a/frontend/package-lock.json b/frontend/package-lock.json index d6934b2d..7a928d76 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -6,12 +6,14 @@ "": { "hasInstallScript": true, "dependencies": { + "@vitest/coverage-c8": "^0.29.2", "@vueuse/core": "^9.6.0", "@vueuse/nuxt": "^9.6.0", "axios": "^1.1.3", "qs": "^6.11.0", "sass": "^1.56.1", "vite-plugin-vuetify": "^1.0.0", + "vitest": "^0.29.2", "vue-i18n": "^9.2.2", "vue-matomo": "^4.2.0", "vuetify": "^3.0.1" @@ -21,6 +23,7 @@ "@intlify/unplugin-vue-i18n": "^0.8.0", "@mdi/font": "^7.0.96", "@nuxtjs/eslint-config-typescript": "^12.0.0", + "@nuxtjs/i18n": "^8.0.0-beta.10", "@types/qs": "^6.9.7", "eslint": "^8.28.0", "eslint-config-prettier": "^8.5.0", @@ -56,32 +59,32 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz", - "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==", + "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==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz", - "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.0.tgz", + "integrity": "sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==", "dependencies": { - "@ampproject/remapping": "^2.1.0", + "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.2", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-module-transforms": "^7.20.2", - "@babel/helpers": "^7.20.1", - "@babel/parser": "^7.20.2", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.1", - "@babel/types": "^7.20.2", + "@babel/generator": "^7.21.0", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.21.0", + "@babel/helpers": "^7.21.0", + "@babel/parser": "^7.21.0", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.0", + "@babel/types": "^7.21.0", "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": { @@ -111,12 +114,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.20.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.4.tgz", - "integrity": "sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==", + "version": "7.21.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.1.tgz", + "integrity": "sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==", "dependencies": { - "@babel/types": "^7.20.2", + "@babel/types": "^7.21.0", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "engines": { @@ -148,13 +152,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", - "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", + "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==", "dependencies": { - "@babel/compat-data": "^7.20.0", + "@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": { @@ -164,6 +169,19 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-compilation-targets/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==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, "node_modules/@babel/helper-create-class-features-plugin": { "version": "7.20.2", "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.2.tgz", @@ -193,12 +211,12 @@ } }, "node_modules/@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "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==", "dependencies": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" + "@babel/template": "^7.20.7", + "@babel/types": "^7.21.0" }, "engines": { "node": ">=6.9.0" @@ -238,18 +256,18 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", - "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", + "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==", "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.18.10", - "@babel/traverse": "^7.20.1", - "@babel/types": "^7.20.2" + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.2", + "@babel/types": "^7.21.2" }, "engines": { "node": ">=6.9.0" @@ -328,21 +346,21 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "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==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.1.tgz", - "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", + "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", "dependencies": { - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.1", - "@babel/types": "^7.20.0" + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.0", + "@babel/types": "^7.21.0" }, "engines": { "node": ">=6.9.0" @@ -362,9 +380,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.20.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz", - "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==", + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.2.tgz", + "integrity": "sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==", "bin": { "parser": "bin/babel-parser.js" }, @@ -417,39 +435,39 @@ } }, "node_modules/@babel/standalone": { - "version": "7.20.4", - "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.20.4.tgz", - "integrity": "sha512-27bv4h47jbaFZ7+e7gT1VEo9PNL1ynxqUX6/BERLz1qxm/5gzpbcHX+47VnSeYHyEyGZkRznpSOd8zPBhiz6tw==", + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.21.2.tgz", + "integrity": "sha512-ySP/TJcyqMJVg1M/lmnPVi6L+F+IJpQ4+0lqtf723LERbk1N8/0JgLgm346cRAzfHaoXkLq/M/mJBd2uo25RBA==", "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.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", "dependencies": { "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz", - "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==", + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.2.tgz", + "integrity": "sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw==", "dependencies": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.1", + "@babel/generator": "^7.21.1", "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", + "@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.20.1", - "@babel/types": "^7.20.0", + "@babel/parser": "^7.21.2", + "@babel/types": "^7.21.2", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -458,9 +476,9 @@ } }, "node_modules/@babel/types": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", - "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.2.tgz", + "integrity": "sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==", "dependencies": { "@babel/helper-string-parser": "^7.19.4", "@babel/helper-validator-identifier": "^7.19.1", @@ -470,6 +488,11 @@ "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==" + }, "node_modules/@cloudflare/kv-asset-handler": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.2.0.tgz", @@ -478,36 +501,6 @@ "mime": "^3.0.0" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.15.tgz", - "integrity": "sha512-JJjZjJi2eBL01QJuWjfCdZxcIgot+VoK6Fq7eKF9w4YHm9hwl7nhBR1o2Wnt/WcANk5l9SkpvrldW1PLuXxcbw==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.15.tgz", - "integrity": "sha512-lhz6UNPMDXUhtXSulw8XlFAtSYO26WmHQnCi2Lg2p+/TMiJKNLtZCYUxV4wG6rZMzXmr8InGpNwk+DLT2Hm0PA==", - "cpu": [ - "loong64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@eslint/eslintrc": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", @@ -613,9 +606,9 @@ } }, "node_modules/@intlify/bundle-utils": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@intlify/bundle-utils/-/bundle-utils-3.4.0.tgz", - "integrity": "sha512-2UQkqiSAOSPEHMGWlybqWm4G2K0X+FyYho5AwXz6QklSX1EY5EDmOSxZmwscn2qmKBnp6OYsme5kUrnN9xrWzQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@intlify/bundle-utils/-/bundle-utils-4.0.0.tgz", + "integrity": "sha512-klXrYT9VXyKEXsD6UY3pShg0O5MPC07n0TZ5RrSs5ry6T1eZVolIFGJi9c3qcDrh1qjJxgikRnPBmD7qGDqbjw==", "dev": true, "dependencies": { "@intlify/message-compiler": "next", @@ -690,12 +683,12 @@ } }, "node_modules/@intlify/message-compiler": { - "version": "9.3.0-beta.10", - "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.3.0-beta.10.tgz", - "integrity": "sha512-RoOC6yceOykLRhN0NlbkNOBUx1el6iphx3W8NfOx3jHVNtfT1FYokx14/5sU3F1F0uxeG4sp6q+ppKvaF8o+ww==", + "version": "9.3.0-beta.16", + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.3.0-beta.16.tgz", + "integrity": "sha512-CGQI3xRcs1ET75eDQ0DUy3MRYOqTauRIIgaMoISKiF83gqRWg93FqN8lGMKcpBqaF4tI0JhsfosCaGiBL9+dnw==", "dev": true, "dependencies": { - "@intlify/shared": "9.3.0-beta.10", + "@intlify/shared": "9.3.0-beta.16", "source-map": "0.6.1" }, "engines": { @@ -706,9 +699,9 @@ } }, "node_modules/@intlify/shared": { - "version": "9.3.0-beta.10", - "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.3.0-beta.10.tgz", - "integrity": "sha512-h93uAanbAt/XgjDHclrVB7xix6r7Uz11wx0iGNOCdHP7aA2LCJjUT3uNbekJjjbo+Fl5jzTSJZdm2SexzoqhRA==", + "version": "9.3.0-beta.16", + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.3.0-beta.16.tgz", + "integrity": "sha512-kXbm4svALe3lX+EjdJxfnabOphqS4yQ1Ge/iIlR8tvUiYRCoNz3hig1M4336iY++Dfx5ytEQJPNjIcknNIuvig==", "dev": true, "engines": { "node": ">= 14" @@ -718,12 +711,12 @@ } }, "node_modules/@intlify/unplugin-vue-i18n": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@intlify/unplugin-vue-i18n/-/unplugin-vue-i18n-0.8.0.tgz", - "integrity": "sha512-bqMDYrbmV0oMLGHTdYMUXfcEsy2rPwQnGrQAg4gvw5FimvJfTQt3RliLVayT5ldOfeT2g0IUc/0t7LPeGrFUag==", + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@intlify/unplugin-vue-i18n/-/unplugin-vue-i18n-0.8.2.tgz", + "integrity": "sha512-cRnzPqSEZQOmTD+p4pwc3RTS9HxreLqfID0keoqZDZweCy/CGRMLLTNd15S4TUf1vSBhPF03DItEFDr1F+8MDA==", "dev": true, "dependencies": { - "@intlify/bundle-utils": "^3.4.0", + "@intlify/bundle-utils": "^4.0.0", "@intlify/shared": "next", "@rollup/pluginutils": "^4.2.0", "@vue/compiler-sfc": "^3.2.45", @@ -781,6 +774,14 @@ "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==" }, + "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==", + "engines": { + "node": ">=8" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", @@ -864,59 +865,6 @@ "node-pre-gyp": "bin/node-pre-gyp" } }, - "node_modules/@mapbox/node-pre-gyp/node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/@mapbox/node-pre-gyp/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==", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/minipass": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz", - "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@mapbox/node-pre-gyp/node_modules/node-fetch": { "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", @@ -950,27 +898,6 @@ "node": ">=10" } }, - "node_modules/@mapbox/node-pre-gyp/node_modules/tar": { - "version": "6.1.12", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.12.tgz", - "integrity": "sha512-jU4TdemS31uABHd+Lt5WEYJuzn+TJTCBLljvIAHZOz6M9Os5pJ4dD+vRFLxPa/n3T0iEFzpi+0x1UfuDZYbRMw==", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/@mdi/font": { "version": "7.0.96", "resolved": "https://registry.npmjs.org/@mdi/font/-/font-7.0.96.tgz", @@ -1190,51 +1117,529 @@ "vue": "^3.2.45" } }, - "node_modules/@nuxt/vite-builder/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==", + "node_modules/@nuxt/vite-builder/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==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nuxtjs/eslint-config": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@nuxtjs/eslint-config/-/eslint-config-12.0.0.tgz", + "integrity": "sha512-ewenelo75x0eYEUK+9EBXjc/OopQCvdkmYmlZuoHq5kub/vtiRpyZ/autppwokpHUq8tiVyl2ejMakoiHiDTrg==", + "dev": true, + "dependencies": { + "eslint-config-standard": "^17.0.0", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-n": "^15.5.1", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-unicorn": "^44.0.2", + "eslint-plugin-vue": "^9.7.0", + "local-pkg": "^0.4.2" + }, + "peerDependencies": { + "eslint": "^8.23.0" + } + }, + "node_modules/@nuxtjs/eslint-config-typescript": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@nuxtjs/eslint-config-typescript/-/eslint-config-typescript-12.0.0.tgz", + "integrity": "sha512-HJR0ho5MYuOCFjkL+eMX/VXbUwy36J12DUMVy+dj3Qz1GYHwX92Saxap3urFzr8oPkzzFiuOknDivfCeRBWakg==", + "dev": true, + "dependencies": { + "@nuxtjs/eslint-config": "^12.0.0", + "@typescript-eslint/eslint-plugin": "^5.42.1", + "@typescript-eslint/parser": "^5.42.1", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-vue": "^9.7.0" + }, + "peerDependencies": { + "eslint": "^8.23.0" + } + }, + "node_modules/@nuxtjs/i18n": { + "version": "8.0.0-beta.10", + "resolved": "https://registry.npmjs.org/@nuxtjs/i18n/-/i18n-8.0.0-beta.10.tgz", + "integrity": "sha512-a7xcWKSJvABxF6O7W7MKscyT3OJxaKpBQZ84PGuTop9YrlBFkTV+bUQX3cayQqd0EYVLjgdE9R0uri5JMIVQWQ==", + "dev": true, + "dependencies": { + "@intlify/bundle-utils": "^4.0.0", + "@intlify/shared": "9.3.0-beta.16", + "@intlify/unplugin-vue-i18n": "^0.8.1", + "@nuxt/kit": "^3.1.2", + "@vue/compiler-sfc": "^3.2.47", + "cookie-es": "^0.5.0", + "debug": "^4.3.4", + "estree-walker": "^3.0.1", + "is-https": "^4.0.0", + "js-cookie": "^3.0.1", + "knitwork": "^1.0.0", + "magic-string": "^0.27.0", + "mlly": "^1.1.0", + "pathe": "^1.1.0", + "pkg-types": "^1.0.1", + "ufo": "^1.0.1", + "unplugin": "^1.0.1", + "vue-i18n": "9.3.0-beta.16", + "vue-i18n-routing": "^0.12.2" + }, + "engines": { + "node": "^14.16.0 || ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@nuxtjs/i18n/node_modules/@intlify/core-base": { + "version": "9.3.0-beta.16", + "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.3.0-beta.16.tgz", + "integrity": "sha512-BoAxVoPIJoPKCCMdsuNXKaaJxvetvHrW2KA43IpkwgPd2/w6zPebh/+v8e4zpXKjFVSgcF97zP87KeVcM/Lxwg==", + "dev": true, + "dependencies": { + "@intlify/devtools-if": "9.3.0-beta.16", + "@intlify/message-compiler": "9.3.0-beta.16", + "@intlify/shared": "9.3.0-beta.16", + "@intlify/vue-devtools": "9.3.0-beta.16" + }, + "engines": { + "node": ">= 14" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@nuxtjs/i18n/node_modules/@intlify/devtools-if": { + "version": "9.3.0-beta.16", + "resolved": "https://registry.npmjs.org/@intlify/devtools-if/-/devtools-if-9.3.0-beta.16.tgz", + "integrity": "sha512-9WXn8YMAnL/DHdoWqCy6yLTXcLFxd8eXB9UNsViQA5JJV7neR+yahr+23X1wP0prhG338MruxAu65khRf+AJCw==", + "dev": true, + "dependencies": { + "@intlify/shared": "9.3.0-beta.16" + }, + "engines": { + "node": ">= 14" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@nuxtjs/i18n/node_modules/@intlify/vue-devtools": { + "version": "9.3.0-beta.16", + "resolved": "https://registry.npmjs.org/@intlify/vue-devtools/-/vue-devtools-9.3.0-beta.16.tgz", + "integrity": "sha512-rQ/jSW0gBciYLBBi+XN65r80B59Ypege9oqUi+EZ2QpOaK54wDcy1xq9w6Zbj6WpY1qgf34KtYawKIF10mMr6w==", + "dev": true, + "dependencies": { + "@intlify/core-base": "9.3.0-beta.16", + "@intlify/shared": "9.3.0-beta.16" + }, + "engines": { + "node": ">= 14" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@nuxtjs/i18n/node_modules/@nuxt/kit": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-3.2.3.tgz", + "integrity": "sha512-wcsVlQLwGkh1cRhAFWHc3uYHdIxFTRNdRUzNyfqoX9DL0Fuga3K75q/PBY0xg1viA9R6F5BMPhc7KDLSWbXtWg==", + "dev": true, + "dependencies": { + "@nuxt/schema": "3.2.3", + "c12": "^1.1.2", + "consola": "^2.15.3", + "defu": "^6.1.2", + "globby": "^13.1.3", + "hash-sum": "^2.0.0", + "ignore": "^5.2.4", + "jiti": "^1.17.1", + "knitwork": "^1.0.0", + "lodash.template": "^4.5.0", + "mlly": "^1.1.1", + "pathe": "^1.1.0", + "pkg-types": "^1.0.2", + "scule": "^1.0.0", + "semver": "^7.3.8", + "unctx": "^2.1.2", + "unimport": "^2.2.4", + "untyped": "^1.2.2" + }, + "engines": { + "node": "^14.18.0 || ^16.10.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@nuxtjs/i18n/node_modules/@nuxt/schema": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@nuxt/schema/-/schema-3.2.3.tgz", + "integrity": "sha512-AXzRnBivCwn5RpNFWjUkvOPGPSHl5BM+6GfOpSNglPXi0tiQJ+rawSl7no7BkxGDmQ44Bx9AXwvHTrgjpcuo4g==", + "dev": true, + "dependencies": { + "c12": "^1.1.2", + "create-require": "^1.1.1", + "defu": "^6.1.2", + "hookable": "^5.4.2", + "jiti": "^1.17.1", + "pathe": "^1.1.0", + "pkg-types": "^1.0.2", + "postcss-import-resolver": "^2.0.0", + "scule": "^1.0.0", + "std-env": "^3.3.2", + "ufo": "^1.1.1", + "unimport": "^2.2.4", + "untyped": "^1.2.2" + }, + "engines": { + "node": "^14.18.0 || ^16.10.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@nuxtjs/i18n/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==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@nuxtjs/i18n/node_modules/@rollup/pluginutils/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 + }, + "node_modules/@nuxtjs/i18n/node_modules/@vue/compiler-core": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.47.tgz", + "integrity": "sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.16.4", + "@vue/shared": "3.2.47", + "estree-walker": "^2.0.2", + "source-map": "^0.6.1" + } + }, + "node_modules/@nuxtjs/i18n/node_modules/@vue/compiler-core/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 + }, + "node_modules/@nuxtjs/i18n/node_modules/@vue/compiler-dom": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz", + "integrity": "sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==", + "dev": true, + "dependencies": { + "@vue/compiler-core": "3.2.47", + "@vue/shared": "3.2.47" + } + }, + "node_modules/@nuxtjs/i18n/node_modules/@vue/compiler-sfc": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz", + "integrity": "sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.47", + "@vue/compiler-dom": "3.2.47", + "@vue/compiler-ssr": "3.2.47", + "@vue/reactivity-transform": "3.2.47", + "@vue/shared": "3.2.47", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7", + "postcss": "^8.1.10", + "source-map": "^0.6.1" + } + }, + "node_modules/@nuxtjs/i18n/node_modules/@vue/compiler-sfc/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 + }, + "node_modules/@nuxtjs/i18n/node_modules/@vue/compiler-sfc/node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/@nuxtjs/i18n/node_modules/@vue/compiler-ssr": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz", + "integrity": "sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==", + "dev": true, + "dependencies": { + "@vue/compiler-dom": "3.2.47", + "@vue/shared": "3.2.47" + } + }, + "node_modules/@nuxtjs/i18n/node_modules/@vue/reactivity-transform": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz", + "integrity": "sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.47", + "@vue/shared": "3.2.47", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7" + } + }, + "node_modules/@nuxtjs/i18n/node_modules/@vue/reactivity-transform/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 + }, + "node_modules/@nuxtjs/i18n/node_modules/@vue/reactivity-transform/node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/@nuxtjs/i18n/node_modules/@vue/shared": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.47.tgz", + "integrity": "sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==", + "dev": true + }, + "node_modules/@nuxtjs/i18n/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/@nuxtjs/i18n/node_modules/magic-string": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@nuxtjs/i18n/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/@nuxtjs/i18n/node_modules/unimport": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/unimport/-/unimport-2.2.4.tgz", + "integrity": "sha512-qMgmeEGqqrrmEtm0dqxMG37J6xBtrriqxq9hILvDb+e6l2F0yTnJomLoCCp0eghLR7bYGeBsUU5Y0oyiUYhViw==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.0.2", + "escape-string-regexp": "^5.0.0", + "fast-glob": "^3.2.12", + "local-pkg": "^0.4.3", + "magic-string": "^0.27.0", + "mlly": "^1.1.0", + "pathe": "^1.1.0", + "pkg-types": "^1.0.1", + "scule": "^1.0.0", + "strip-literal": "^1.0.0", + "unplugin": "^1.0.1" + } + }, + "node_modules/@nuxtjs/i18n/node_modules/vue-i18n": { + "version": "9.3.0-beta.16", + "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.3.0-beta.16.tgz", + "integrity": "sha512-huhBeRB0SEvv2gIgCS7Zo06nb8AAhbPQCoB/vwDfbDNs8F+giv9QCmhEed+TkLTih/54JGnXkxN6tw1VZqVY/w==", + "dev": true, + "dependencies": { + "@intlify/core-base": "9.3.0-beta.16", + "@intlify/shared": "9.3.0-beta.16", + "@intlify/vue-devtools": "9.3.0-beta.16", + "@vue/devtools-api": "^6.2.1" + }, + "engines": { + "node": ">= 14" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/@nuxtjs/i18n/node_modules/vue-i18n-routing": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/vue-i18n-routing/-/vue-i18n-routing-0.12.2.tgz", + "integrity": "sha512-VzYUzbUJyPHUP74t973dN42/sJnZUzBwdcYX+TJgr9YHD08+9uouw5Ume2jHO2Pi8Nymu4cz/UiHWDPeMyc/bQ==", + "dev": true, + "dependencies": { + "@intlify/shared": "next", + "@intlify/vue-i18n-bridge": "^0.8.0", + "@intlify/vue-router-bridge": "^0.8.0", + "ufo": "^1.0.0", + "vue-demi": "^0.13.11" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^2.6.14 || ^2.7.0 || ^3.2.0", + "vue-i18n": "^8.26.1 || ^9.2.0 || ^9.3.0-beta.10", + "vue-i18n-bridge": "^9.2.0 || ^9.3.0-beta.10", + "vue-router": "^3.5.3 || ^3.6.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + }, + "vue": { + "optional": true + }, + "vue-i18n": { + "optional": true + }, + "vue-i18n-bridge": { + "optional": true + }, + "vue-router": { + "optional": true + } + } + }, + "node_modules/@nuxtjs/i18n/node_modules/vue-i18n-routing/node_modules/@intlify/vue-i18n-bridge": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@intlify/vue-i18n-bridge/-/vue-i18n-bridge-0.8.0.tgz", + "integrity": "sha512-wQ18fSccm9QaWpUW2vq2QHvojgKIog7s+UMj9LeY3pUV3yD9bU4YZI+1PTNoX3tOA+BE71gQyqVGox/TVQKP6Q==", + "dev": true, + "hasInstallScript": true, + "bin": { + "vue-i18n-fix": "bin/fix.js", + "vue-i18n-switch": "bin/switch.js" + }, "engines": { - "node": ">=12" + "node": ">= 12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/kazupon" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue-i18n": "^8.26.1 || ^9.2.0-beta.25 || ^9.3.0-beta.5", + "vue-i18n-bridge": "^9.2.0-beta.25 || ^9.3.0-beta.5" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + }, + "vue-i18n": { + "optional": true + }, + "vue-i18n-bridge": { + "optional": true + } } }, - "node_modules/@nuxtjs/eslint-config": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@nuxtjs/eslint-config/-/eslint-config-12.0.0.tgz", - "integrity": "sha512-ewenelo75x0eYEUK+9EBXjc/OopQCvdkmYmlZuoHq5kub/vtiRpyZ/autppwokpHUq8tiVyl2ejMakoiHiDTrg==", + "node_modules/@nuxtjs/i18n/node_modules/vue-i18n-routing/node_modules/@intlify/vue-router-bridge": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@intlify/vue-router-bridge/-/vue-router-bridge-0.8.0.tgz", + "integrity": "sha512-CNxOgvyQcRhtGmRrksicL+HGjDijXtz+J/x04C/RslZ74CFdZkxjCe8MABkeD3xr+ry8G8tCm2nV2hLjZbynQw==", "dev": true, + "hasInstallScript": true, "dependencies": { - "eslint-config-standard": "^17.0.0", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-n": "^15.5.1", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-promise": "^6.1.1", - "eslint-plugin-unicorn": "^44.0.2", - "eslint-plugin-vue": "^9.7.0", - "local-pkg": "^0.4.2" + "vue-demi": "^0.13.5" + }, + "bin": { + "vue-router-fix": "bin/fix.js", + "vue-router-switch": "bin/switch.js" + }, + "engines": { + "node": ">= 12" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" }, "peerDependencies": { - "eslint": "^8.23.0" + "@vue/composition-api": "^1.0.0-rc.1", + "vue-router": "^4.0.0-0 || ^3.0.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + }, + "vue-router": { + "optional": true + } } }, - "node_modules/@nuxtjs/eslint-config-typescript": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@nuxtjs/eslint-config-typescript/-/eslint-config-typescript-12.0.0.tgz", - "integrity": "sha512-HJR0ho5MYuOCFjkL+eMX/VXbUwy36J12DUMVy+dj3Qz1GYHwX92Saxap3urFzr8oPkzzFiuOknDivfCeRBWakg==", + "node_modules/@nuxtjs/i18n/node_modules/vue-i18n-routing/node_modules/vue-demi": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz", + "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==", "dev": true, - "dependencies": { - "@nuxtjs/eslint-config": "^12.0.0", - "@typescript-eslint/eslint-plugin": "^5.42.1", - "@typescript-eslint/parser": "^5.42.1", - "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-vue": "^9.7.0" + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" }, "peerDependencies": { - "eslint": "^8.23.0" + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } } }, "node_modules/@pkgr/utils": { @@ -1557,11 +1962,29 @@ "node": ">=10.13.0" } }, + "node_modules/@types/chai": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==" + }, + "node_modules/@types/chai-subset": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", + "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", + "dependencies": { + "@types/chai": "*" + } + }, "node_modules/@types/estree": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==" }, + "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==" + }, "node_modules/@types/json-schema": { "version": "7.0.11", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", @@ -2008,6 +2431,86 @@ "vue": "^3.0.0" } }, + "node_modules/@vitest/coverage-c8": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/@vitest/coverage-c8/-/coverage-c8-0.29.8.tgz", + "integrity": "sha512-y+sEMQMctWokjnSqm3FCQEYFkjLrYaznsxEZHxcx8z2aftpYg3A5tvI1S5himfdEFo7o+OeHzh40bPSWZHW4oQ==", + "dependencies": { + "c8": "^7.13.0", + "picocolors": "^1.0.0", + "std-env": "^3.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vitest": ">=0.29.0 <1" + } + }, + "node_modules/@vitest/expect": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.29.8.tgz", + "integrity": "sha512-xlcVXn5I5oTq6NiZSY3ykyWixBxr5mG8HYtjvpgg6KaqHm0mvhX18xuwl5YGxIRNt/A5jidd7CWcNHrSvgaQqQ==", + "dependencies": { + "@vitest/spy": "0.29.8", + "@vitest/utils": "0.29.8", + "chai": "^4.3.7" + } + }, + "node_modules/@vitest/runner": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.29.8.tgz", + "integrity": "sha512-FzdhnRDwEr/A3Oo1jtIk/B952BBvP32n1ObMEb23oEJNO+qO5cBet6M2XWIDQmA7BDKGKvmhUf2naXyp/2JEwQ==", + "dependencies": { + "@vitest/utils": "0.29.8", + "p-limit": "^4.0.0", + "pathe": "^1.1.0" + } + }, + "node_modules/@vitest/runner/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==", + "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/@vitest/runner/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==", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/spy": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.29.8.tgz", + "integrity": "sha512-VdjBe9w34vOMl5I5mYEzNX8inTxrZ+tYUVk9jxaZJmHFwmDFC/GV3KBFTA/JKswr3XHvZL+FE/yq5EVhb6pSAw==", + "dependencies": { + "tinyspy": "^1.0.2" + } + }, + "node_modules/@vitest/utils": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.29.8.tgz", + "integrity": "sha512-qGzuf3vrTbnoY+RjjVVIBYfuWMjn3UMUqyQtdGNZ6ZIIyte7B37exj6LaVkrZiUTvzSadVvO/tJm8AEgbGCBPg==", + "dependencies": { + "cli-truncate": "^3.1.0", + "diff": "^5.1.0", + "loupe": "^2.3.6", + "pretty-format": "^27.5.1" + } + }, "node_modules/@volar/language-core": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.0.13.tgz", @@ -2410,9 +2913,9 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, "node_modules/acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", "bin": { "acorn": "bin/acorn" }, @@ -2429,6 +2932,14 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.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==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -2672,6 +3183,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "engines": { + "node": "*" + } + }, "node_modules/async": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", @@ -2914,18 +3433,150 @@ } }, "node_modules/c12": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/c12/-/c12-1.0.1.tgz", - "integrity": "sha512-EN9Rqix2q9X3PseFkUvRFZ/0fvncF35ZR5nykLDwv4Ml/Q1WYPLkcdqlrczFll2G9t4qmxgM4my3EF3IrRGl5Q==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/c12/-/c12-1.1.2.tgz", + "integrity": "sha512-fHT5HDEHNMb2oImnqJ88/UlpEOkY/chdyYxSd3YCpvBqBvU0IDlHTkNc7GnjObDMxdis2lL+rwlQcNq8VeZESA==", "dependencies": { - "defu": "^6.1.1", + "defu": "^6.1.2", "dotenv": "^16.0.3", - "gittar": "^0.1.1", - "jiti": "^1.16.0", - "mlly": "^1.0.0", - "pathe": "^1.0.0", - "pkg-types": "^1.0.1", - "rc9": "^2.0.0" + "giget": "^1.1.0", + "jiti": "^1.17.1", + "mlly": "^1.1.1", + "pathe": "^1.1.0", + "pkg-types": "^1.0.2", + "rc9": "^2.0.1" + } + }, + "node_modules/c8": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/c8/-/c8-7.13.0.tgz", + "integrity": "sha512-/NL4hQTv1gBL6J6ei80zu3IiTrmePDKXKXOTLpHvcIWZTVYQlDhVWjjWvkhICylE8EwwnMVzDZugCvdx0/DIIA==", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@istanbuljs/schema": "^0.1.3", + "find-up": "^5.0.0", + "foreground-child": "^2.0.0", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-reports": "^3.1.4", + "rimraf": "^3.0.2", + "test-exclude": "^6.0.0", + "v8-to-istanbul": "^9.0.0", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9" + }, + "bin": { + "c8": "bin/c8.js" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/c8/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/c8/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==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/c8/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/c8/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/c8/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==" + }, + "node_modules/c8/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/c8/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==", + "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/c8/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/c8/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==", + "engines": { + "node": ">=10" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "engines": { + "node": ">=8" } }, "node_modules/call-bind": { @@ -2986,6 +3637,23 @@ } ] }, + "node_modules/chai": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -3004,6 +3672,14 @@ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" }, + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "engines": { + "node": "*" + } + }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -3042,9 +3718,12 @@ } }, "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } }, "node_modules/ci-info": { "version": "3.6.1", @@ -3091,6 +3770,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "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==", + "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" + } + }, "node_modules/cli-width": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.0.0.tgz", @@ -3532,6 +4226,17 @@ } } }, + "node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -3582,9 +4287,9 @@ } }, "node_modules/defu": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.1.tgz", - "integrity": "sha512-aA964RUCsBt0FGoNIlA3uFgo2hO+WWC0fiC6DBps/0SFzkKcYoM/3CzVLIa5xSsrFjdioMdYgAIbwo80qp2MoA==" + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.2.tgz", + "integrity": "sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ==" }, "node_modules/delayed-stream": { "version": "1.0.0", @@ -3616,9 +4321,9 @@ } }, "node_modules/destr": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/destr/-/destr-1.2.1.tgz", - "integrity": "sha512-ud8w0qMLlci6iFG7CNgeRr8OcbUWMsbfjtWft1eJ5Luqrz/M8Ebqk/KCzne8rKUlIQWWfLv0wD6QHrqOf4GshA==" + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/destr/-/destr-1.2.2.tgz", + "integrity": "sha512-lrbCJwD9saUQrqUfXvl6qoM+QN3W7tLV5pAOs+OqOmopCCz/JkE05MHedJR1xfk4IAnZuJXPVuN5+7jNA2ZCiA==" }, "node_modules/destroy": { "version": "1.2.0", @@ -3637,6 +4342,14 @@ "node": ">=8" } }, + "node_modules/diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -3926,111 +4639,6 @@ "esbuild-windows-arm64": "0.15.15" } }, - "node_modules/esbuild-android-64": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.15.tgz", - "integrity": "sha512-F+WjjQxO+JQOva3tJWNdVjouFMLK6R6i5gjDvgUthLYJnIZJsp1HlF523k73hELY20WPyEO8xcz7aaYBVkeg5Q==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-android-arm64": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.15.tgz", - "integrity": "sha512-attlyhD6Y22jNyQ0fIIQ7mnPvDWKw7k6FKnsXlBvQE6s3z6s6cuEHcSgoirquQc7TmZgVCK5fD/2uxmRN+ZpcQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-64": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.15.tgz", - "integrity": "sha512-ohZtF8W1SHJ4JWldsPVdk8st0r9ExbAOSrBOh5L+Mq47i696GVwv1ab/KlmbUoikSTNoXEhDzVpxUR/WIO19FQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-arm64": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.15.tgz", - "integrity": "sha512-P8jOZ5zshCNIuGn+9KehKs/cq5uIniC+BeCykvdVhx/rBXSxmtj3CUIKZz4sDCuESMbitK54drf/2QX9QHG5Ag==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-64": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.15.tgz", - "integrity": "sha512-KkTg+AmDXz1IvA9S1gt8dE24C8Thx0X5oM0KGF322DuP+P3evwTL9YyusHAWNsh4qLsR80nvBr/EIYs29VSwuA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-arm64": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.15.tgz", - "integrity": "sha512-FUcML0DRsuyqCMfAC+HoeAqvWxMeq0qXvclZZ/lt2kLU6XBnDA5uKTLUd379WYEyVD4KKFctqWd9tTuk8C/96g==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-32": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.15.tgz", - "integrity": "sha512-q28Qn5pZgHNqug02aTkzw5sW9OklSo96b5nm17Mq0pDXrdTBcQ+M6Q9A1B+dalFeynunwh/pvfrNucjzwDXj+Q==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/esbuild-linux-64": { "version": "0.15.15", "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.15.tgz", @@ -4046,186 +4654,6 @@ "node": ">=12" } }, - "node_modules/esbuild-linux-arm": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.15.tgz", - "integrity": "sha512-RYVW9o2yN8yM7SB1yaWr378CwrjvGCyGybX3SdzPHpikUHkME2AP55Ma20uNwkNyY2eSYFX9D55kDrfQmQBR4w==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm64": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.15.tgz", - "integrity": "sha512-/ltmNFs0FivZkYsTzAsXIfLQX38lFnwJTWCJts0IbCqWZQe+jjj0vYBNbI0kmXLb3y5NljiM5USVAO1NVkdh2g==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-mips64le": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.15.tgz", - "integrity": "sha512-PksEPb321/28GFFxtvL33yVPfnMZihxkEv5zME2zapXGp7fA1X2jYeiTUK+9tJ/EGgcNWuwvtawPxJG7Mmn86A==", - "cpu": [ - "mips64el" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-ppc64le": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.15.tgz", - "integrity": "sha512-ek8gJBEIhcpGI327eAZigBOHl58QqrJrYYIZBWQCnH3UnXoeWMrMZLeeZL8BI2XMBhP+sQ6ERctD5X+ajL/AIA==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-riscv64": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.15.tgz", - "integrity": "sha512-H5ilTZb33/GnUBrZMNJtBk7/OXzDHDXjIzoLXHSutwwsLxSNaLxzAaMoDGDd/keZoS+GDBqNVxdCkpuiRW4OSw==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-s390x": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.15.tgz", - "integrity": "sha512-jKaLUg78mua3rrtrkpv4Or2dNTJU7bgHN4bEjT4OX4GR7nLBSA9dfJezQouTxMmIW7opwEC5/iR9mpC18utnxQ==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-netbsd-64": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.15.tgz", - "integrity": "sha512-aOvmF/UkjFuW6F36HbIlImJTTx45KUCHJndtKo+KdP8Dhq3mgLRKW9+6Ircpm8bX/RcS3zZMMmaBLkvGY06Gvw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-openbsd-64": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.15.tgz", - "integrity": "sha512-HFFX+WYedx1w2yJ1VyR1Dfo8zyYGQZf1cA69bLdrHzu9svj6KH6ZLK0k3A1/LFPhcEY9idSOhsB2UyU0tHPxgQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sunos-64": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.15.tgz", - "integrity": "sha512-jOPBudffG4HN8yJXcK9rib/ZTFoTA5pvIKbRrt3IKAGMq1EpBi4xoVoSRrq/0d4OgZLaQbmkHp8RO9eZIn5atA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-32": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.15.tgz", - "integrity": "sha512-MDkJ3QkjnCetKF0fKxCyYNBnOq6dmidcwstBVeMtXSgGYTy8XSwBeIE4+HuKiSsG6I/mXEb++px3IGSmTN0XiA==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-64": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.15.tgz", - "integrity": "sha512-xaAUIB2qllE888SsMU3j9nrqyLbkqqkpQyWVkfwSil6BBPgcPk3zOFitTTncEKCLTQy3XV9RuH7PDj3aJDljWA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-arm64": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.15.tgz", - "integrity": "sha512-ttuoCYCIJAFx4UUKKWYnFdrVpoXa3+3WWkXVI6s09U+YjhnyM5h96ewTq/WgQj9LFSIlABQvadHSOQyAVjW5xQ==", - "cpu": [ - "arm64" - ], - "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", @@ -5236,7 +5664,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "devOptional": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -5294,6 +5721,18 @@ } } }, + "node_modules/foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -5362,11 +5801,25 @@ "integrity": "sha512-YEexkCpL4j03jn5SxaMHqcO6IuWuqm8JFUYhyCep7Ao89JIYmB8xoKhK7zXXJ9cCaNXpyNH5L3QtAmoxjoHW2w==" }, "node_modules/fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "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==", "dependencies": { - "minipass": "^2.6.0" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/fs.realpath": { @@ -5374,19 +5827,6 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "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", @@ -5472,6 +5912,14 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "engines": { + "node": "*" + } + }, "node_modules/get-intrinsic": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", @@ -5529,6 +5977,23 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, + "node_modules/giget": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/giget/-/giget-1.1.2.tgz", + "integrity": "sha512-HsLoS07HiQ5oqvObOI+Qb2tyZH4Gj5nYGfF9qQcZNrPw+uEFhdXtgJr01aO2pWadGHucajYDLxxbtQkm97ON2A==", + "dependencies": { + "colorette": "^2.0.19", + "defu": "^6.1.2", + "https-proxy-agent": "^5.0.1", + "mri": "^1.2.0", + "node-fetch-native": "^1.0.2", + "pathe": "^1.1.0", + "tar": "^6.1.13" + }, + "bin": { + "giget": "dist/cli.mjs" + } + }, "node_modules/git-config-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/git-config-path/-/git-config-path-2.0.0.tgz", @@ -5554,18 +6019,6 @@ "git-up": "^7.0.0" } }, - "node_modules/gittar": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/gittar/-/gittar-0.1.1.tgz", - "integrity": "sha512-p+XuqWJpW9ahUuNTptqeFjudFq31o6Jd+maMBarkMAR5U3K9c7zJB4sQ4BV8mIqrTOV29TtqikDhnZfCD4XNfQ==", - "dependencies": { - "mkdirp": "^0.5.1", - "tar": "^4.4.1" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/glob": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", @@ -5630,9 +6083,9 @@ "dev": true }, "node_modules/globby": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", - "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", + "version": "13.1.3", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz", + "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==", "dependencies": { "dir-glob": "^3.0.1", "fast-glob": "^3.2.11", @@ -5797,6 +6250,11 @@ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, + "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==" + }, "node_modules/html-tags": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", @@ -5896,9 +6354,9 @@ ] }, "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "engines": { "node": ">= 4" } @@ -6208,6 +6666,12 @@ "node": ">=0.10.0" } }, + "node_modules/is-https": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-https/-/is-https-4.0.0.tgz", + "integrity": "sha512-FeMLiqf8E5g6SdiVJsPcNZX8k4h2fBs1wp5Bb6uaNxn58ufK1axBqQZdmAQsqh0t9BuwFObybrdVJh6MKyPlyg==", + "dev": true + }, "node_modules/is-interactive": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", @@ -6424,6 +6888,58 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, + "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==", + "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==", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/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/istanbul-lib-report/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/istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-worker": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", @@ -6457,13 +6973,22 @@ } }, "node_modules/jiti": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.16.0.tgz", - "integrity": "sha512-L3BJStEf5NAqNuzrpfbN71dp43mYIcBUlCRea/vdyv5dW/AYa1d4bpelko4SHdY3I6eN9Wzyasxirj1/vv5kmg==", + "version": "1.17.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.17.2.tgz", + "integrity": "sha512-Xf0nU8+8wuiQpLcqdb2HRyHqYwGk2Pd+F7kstyp20ZuqTyCmB9dqpX2NxaxFc1kovraa2bG6c1RL3W7XfapiZg==", "bin": { "jiti": "bin/jiti.js" } }, + "node_modules/js-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.1.tgz", + "integrity": "sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/js-sdsl": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", @@ -6521,9 +7046,9 @@ "devOptional": true }, "node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "bin": { "json5": "lib/cli.js" }, @@ -6707,9 +7232,9 @@ } }, "node_modules/local-pkg": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.2.tgz", - "integrity": "sha512-mlERgSPrbxU3BP4qBqAvvwlgW4MTg78iwJdGGnv7kibKjWcJksrG3t6LB5lXI93wXRDvG4NpUgJFmTG4T6rdrg==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", "engines": { "node": ">=14" }, @@ -6721,7 +7246,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "devOptional": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -6841,6 +7365,14 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dependencies": { + "get-func-name": "^2.0.0" + } + }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -6852,11 +7384,6 @@ "node": ">=10" } }, - "node_modules/lru-cache/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/magic-string": { "version": "0.26.7", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz", @@ -7013,25 +7540,40 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "dependencies": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.4.tgz", + "integrity": "sha512-lwycX3cBMTvcejsHITUgYj6Gy6A7Nh4Q6h9NP4sTHY1ccJlC7yKzDmiShEHsJ16Jf1nKGDEaiHxiltsJEvk0nQ==", + "engines": { + "node": ">=8" } }, "node_modules/minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "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==", "dependencies": { - "minipass": "^2.9.0" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/mkdir": { @@ -7043,25 +7585,25 @@ } }, "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==", - "dependencies": { - "minimist": "^1.2.6" - }, + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "bin": { "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/mlly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.0.0.tgz", - "integrity": "sha512-QL108Hwt+u9bXdWgOI0dhzZfACovn5Aen4Xvc8Jasd9ouRH4NjnrXEiyP3nVvJo91zPlYjVRckta0Nt2zfoR6g==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.1.1.tgz", + "integrity": "sha512-Jnlh4W/aI4GySPo6+DyTN17Q75KKbLTyFK8BrGhjNP4rxuUjbRWhE6gHg3bs33URWAF44FRm7gdQA348i3XxRw==", "dependencies": { - "acorn": "^8.8.1", - "pathe": "^1.0.0", - "pkg-types": "^1.0.0", - "ufo": "^1.0.0" + "acorn": "^8.8.2", + "pathe": "^1.1.0", + "pkg-types": "^1.0.1", + "ufo": "^1.1.0" } }, "node_modules/mri": { @@ -7281,9 +7823,9 @@ } }, "node_modules/node-fetch-native": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.0.1.tgz", - "integrity": "sha512-VzW+TAk2wE4X9maiKMlT+GsPU4OMmR1U9CrHSmd3DFLn2IcZ9VJ6M6BBugGfYUnPCLSYxXdZy17M0BEJyhUTwg==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.0.2.tgz", + "integrity": "sha512-KIkvH1jl6b3O7es/0ShyCgWLcfXxlBrLBbP3rOr23WArC66IMcU4DeZEeYEOwnopYhawLTn7/y+YtmASe8DFVQ==" }, "node_modules/node-forge": { "version": "1.3.1", @@ -7742,7 +8284,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "devOptional": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -7757,7 +8298,6 @@ "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==", - "devOptional": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -7880,9 +8420,17 @@ } }, "node_modules/pathe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.0.0.tgz", - "integrity": "sha512-nPdMG0Pd09HuSsr7QOKUXO2Jr9eqaDiZvDwdyIhNG5SHYujkQHYKDfGQkulBxvbDHz8oHLsTgKN86LSwYzSHAg==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.0.tgz", + "integrity": "sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==" + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "engines": { + "node": "*" + } }, "node_modules/perfect-debounce": { "version": "0.1.3", @@ -7973,13 +8521,13 @@ } }, "node_modules/pkg-types": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.1.tgz", - "integrity": "sha512-jHv9HB+Ho7dj6ItwppRDDl0iZRYBD0jsakHXtFgoLr+cHSF6xC+QL54sJmWxyGxOLYSHm0afhXhXcQDQqH9z8g==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.2.tgz", + "integrity": "sha512-hM58GKXOcj8WTqUXnsQyJYXdeAPbythQgEF3nTcEo+nkD49chjQ9IKm/QJy9xf6JakXptz86h7ecP2024rrLaQ==", "dependencies": { "jsonc-parser": "^3.2.0", - "mlly": "^1.0.0", - "pathe": "^1.0.0" + "mlly": "^1.1.1", + "pathe": "^1.1.0" } }, "node_modules/pluralize": { @@ -8552,6 +9100,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -8636,15 +9208,20 @@ } }, "node_modules/rc9": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.0.0.tgz", - "integrity": "sha512-yVeYJHOpJLOhs3V6RKwz7RPPwPurrx3JjwK264sPgvo/lFdhuUrLien7iSvAO6STVkN0gSMk/MehQNHQhflqZw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.0.1.tgz", + "integrity": "sha512-9EfjLgNmzP9255YX8bGnILQcmdtOXKtUlFTu8bOZPJVtaUDZ2imswcUdpK51tMjTRQyB7r5RebNijrzuyGXcVA==", "dependencies": { - "defu": "^6.1.1", - "destr": "^1.2.1", + "defu": "^6.1.2", + "destr": "^1.2.2", "flat": "^5.0.2" } }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -9269,6 +9846,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==" + }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -9285,6 +9867,43 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "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==", + "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" + } + }, + "node_modules/slice-ansi/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==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slice-ansi/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==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -9353,6 +9972,11 @@ "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility" }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==" + }, "node_modules/standard-as-callback": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", @@ -9367,9 +9991,9 @@ } }, "node_modules/std-env": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.1.tgz", - "integrity": "sha512-3H20QlwQsSm2OvAxWIYhs+j01MzzqwMwGiiO1NQaJYZgJZFPuAbf95/DiKRBSTYIJ2FeGUc+B/6mPGcWP9dO3Q==" + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.2.tgz", + "integrity": "sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==" }, "node_modules/streamsearch": { "version": "1.1.0", @@ -9606,20 +10230,19 @@ } }, "node_modules/tar": { - "version": "4.4.19", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", - "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", + "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", "dependencies": { - "chownr": "^1.1.4", - "fs-minipass": "^1.2.7", - "minipass": "^2.9.0", - "minizlib": "^1.3.3", - "mkdirp": "^0.5.5", - "safe-buffer": "^5.2.1", - "yallist": "^3.1.1" + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^4.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" }, "engines": { - "node": ">=4.5" + "node": ">=10" } }, "node_modules/tar-stream": { @@ -9692,6 +10315,38 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, + "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==", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=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==", + "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/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -9718,6 +10373,27 @@ "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" }, + "node_modules/tinybench": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.4.0.tgz", + "integrity": "sha512-iyziEiyFxX4kyxSp+MtY1oCH/lvjH3PxFN8PGCDeqcZWAJ/i+9y+nL85w99PxVzrIvew/GSkSbDYtiGVa85Afg==" + }, + "node_modules/tinypool": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.4.0.tgz", + "integrity": "sha512-2ksntHOKf893wSAH4z/+JbPpi92esw8Gn9N2deXX+B0EO92hexAVI9GIZZPx7P5aYo5KULfeOSt3kMOmSOy6uA==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-1.1.1.tgz", + "integrity": "sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -9774,9 +10450,9 @@ } }, "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "dependencies": { "minimist": "^1.2.0" @@ -9823,6 +10499,14 @@ "node": ">= 0.8.0" } }, + "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==", + "engines": { + "node": ">=4" + } + }, "node_modules/type-fest": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.2.0.tgz", @@ -9848,9 +10532,9 @@ } }, "node_modules/ufo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.0.0.tgz", - "integrity": "sha512-DRty0ZBNlJ2R59y4mEupJRKLbkLQsc4qtxjpQv78AwEDuBkaUogMc2LkeqW3HddFlw6NwnXYfdThEZOiNgkmmQ==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.1.1.tgz", + "integrity": "sha512-MvlCc4GHrmZdAllBc0iUDowff36Q9Ndw/UzqmEKyrfSzokTd9ZCy1i+IIk5hrYKkjoYVQyNbrw7/F8XJ2rEwTg==" }, "node_modules/ultrahtml": { "version": "1.0.1", @@ -9873,20 +10557,39 @@ } }, "node_modules/unctx": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unctx/-/unctx-2.1.0.tgz", - "integrity": "sha512-Q3UdS5IAlVRIWsWDd8Rr9g2zqBAZaecBgQ+XXFiKbZzovDMMTEU+Ki0SAVf/ZgWsoeG0/c1kzO2/k6BVhbkUHw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/unctx/-/unctx-2.1.2.tgz", + "integrity": "sha512-KK18aLRKe3OlbPyHbXAkIWSU3xK8GInomXfA7fzDMGFXQ1crX1UWrCzKesVXeUyHIayHUrnTvf87IPCKMyeKTg==", "dependencies": { - "acorn": "^8.8.1", - "estree-walker": "^3.0.1", - "magic-string": "^0.26.7", - "unplugin": "^1.0.0" + "acorn": "^8.8.2", + "estree-walker": "^3.0.3", + "magic-string": "^0.27.0", + "unplugin": "^1.0.1" + } + }, + "node_modules/unctx/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/unctx/node_modules/magic-string": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" } }, "node_modules/undici": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.12.0.tgz", - "integrity": "sha512-zMLamCG62PGjd9HHMpo05bSLvvwWOZgGeiWlN/vlqu3+lRo3elxktVGEyLMX+IO7c2eflLjcW74AlkhEZm15mg==", + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.20.0.tgz", + "integrity": "sha512-J3j60dYzuo6Eevbawwp1sdg16k5Tf768bxYK4TUJRH7cBM4kFCbf3mOnM/0E3vQYXvpxITbbWmBafaDbxLDz3g==", "dependencies": { "busboy": "^1.6.0" }, @@ -9982,14 +10685,14 @@ } }, "node_modules/unplugin": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.0.0.tgz", - "integrity": "sha512-H5UnBUxfhTXBXGo2AwKsl0UaLSHzSNDZNehPQSgdhVfO/t+XAS1Yoj3vmLrrlBrS9ZwtH5tejbX/TCp5DcyCKg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.1.0.tgz", + "integrity": "sha512-I8obQ8Rs/hnkxokRV6g8JKOQFgYNnTd9DL58vcSt5IJ9AkK8wbrtsnzD5hi4BJlvcY536JzfEXj9L6h7j559/A==", "dependencies": { - "acorn": "^8.8.1", + "acorn": "^8.8.2", "chokidar": "^3.5.3", "webpack-sources": "^3.2.3", - "webpack-virtual-modules": "^0.4.6" + "webpack-virtual-modules": "^0.5.0" } }, "node_modules/unstorage": { @@ -10011,13 +10714,13 @@ } }, "node_modules/untyped": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/untyped/-/untyped-1.0.0.tgz", - "integrity": "sha512-aBeR3Z51038d7zVzsNShYEdO7u/VCp5R17fxpPXlD2QvG9g6uVJ+JM+zMJ7KFPIt1BNf3I6bU6PhAlsAFkIfdA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/untyped/-/untyped-1.2.2.tgz", + "integrity": "sha512-EANYd5L6AdpgfldlgMcmvOOnj092nWhy0ybhc7uhEH12ipytDYz89EOegBQKj8qWL3u1wgYnmFjADhsuCJs5Aw==", "dependencies": { - "@babel/core": "^7.20.2", - "@babel/standalone": "^7.20.4", - "@babel/types": "^7.20.2", + "@babel/core": "^7.20.12", + "@babel/standalone": "^7.20.12", + "@babel/types": "^7.20.7", "scule": "^1.0.0" } }, @@ -10069,6 +10772,19 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, + "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==", + "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/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", @@ -10314,6 +11030,104 @@ "vuetify": "^3.0.0-beta.4" } }, + "node_modules/vitest": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.29.8.tgz", + "integrity": "sha512-JIAVi2GK5cvA6awGpH0HvH/gEG9PZ0a/WoxdiV3PmqK+3CjQMf8c+J/Vhv4mdZ2nRyXFw66sAg6qz7VNkaHfDQ==", + "dependencies": { + "@types/chai": "^4.3.4", + "@types/chai-subset": "^1.3.3", + "@types/node": "*", + "@vitest/expect": "0.29.8", + "@vitest/runner": "0.29.8", + "@vitest/spy": "0.29.8", + "@vitest/utils": "0.29.8", + "acorn": "^8.8.1", + "acorn-walk": "^8.2.0", + "cac": "^6.7.14", + "chai": "^4.3.7", + "debug": "^4.3.4", + "local-pkg": "^0.4.2", + "pathe": "^1.1.0", + "picocolors": "^1.0.0", + "source-map": "^0.6.1", + "std-env": "^3.3.1", + "strip-literal": "^1.0.0", + "tinybench": "^2.3.1", + "tinypool": "^0.4.0", + "tinyspy": "^1.0.2", + "vite": "^3.0.0 || ^4.0.0", + "vite-node": "0.29.8", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": ">=v14.16.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@vitest/browser": "*", + "@vitest/ui": "*", + "happy-dom": "*", + "jsdom": "*", + "playwright": "*", + "safaridriver": "*", + "webdriverio": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "playwright": { + "optional": true + }, + "safaridriver": { + "optional": true + }, + "webdriverio": { + "optional": true + } + } + }, + "node_modules/vitest/node_modules/vite-node": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.29.8.tgz", + "integrity": "sha512-b6OtCXfk65L6SElVM20q5G546yu10/kNrhg08afEoWlFRJXFq9/6glsvSVY+aI6YeC1tu2TtAqI2jHEQmOmsFw==", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "mlly": "^1.1.0", + "pathe": "^1.1.0", + "picocolors": "^1.0.0", + "vite": "^3.0.0 || ^4.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": ">=v14.16.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/vscode-jsonrpc": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz", @@ -10612,9 +11426,9 @@ } }, "node_modules/webpack-virtual-modules": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.4.6.tgz", - "integrity": "sha512-5tyDlKLqPfMqjT3Q9TAqf2YqjwmnUleZwzJi1A5qXnlBCdj2AtOJ6wAWdglTIDOPgOiOrXeBeFcsQ8+aGQ6QbA==" + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz", + "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==" }, "node_modules/whatwg-url": { "version": "5.0.0", @@ -10655,6 +11469,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/why-is-node-running": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", + "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/wide-align": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", @@ -10793,9 +11622,9 @@ } }, "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/yaml": { "version": "1.10.2", @@ -10872,7 +11701,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "devOptional": true, "engines": { "node": ">=10" }, @@ -10913,29 +11741,29 @@ } }, "@babel/compat-data": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz", - "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==" + "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==" }, "@babel/core": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz", - "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.0.tgz", + "integrity": "sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==", "requires": { - "@ampproject/remapping": "^2.1.0", + "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.2", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-module-transforms": "^7.20.2", - "@babel/helpers": "^7.20.1", - "@babel/parser": "^7.20.2", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.1", - "@babel/types": "^7.20.2", + "@babel/generator": "^7.21.0", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.21.0", + "@babel/helpers": "^7.21.0", + "@babel/parser": "^7.21.0", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.0", + "@babel/types": "^7.21.0", "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" } }, @@ -10951,12 +11779,13 @@ } }, "@babel/generator": { - "version": "7.20.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.4.tgz", - "integrity": "sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==", + "version": "7.21.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.1.tgz", + "integrity": "sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==", "requires": { - "@babel/types": "^7.20.2", + "@babel/types": "^7.21.0", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "dependencies": { @@ -10981,14 +11810,30 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", - "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", + "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==", "requires": { - "@babel/compat-data": "^7.20.0", + "@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" + }, + "dependencies": { + "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==", + "requires": { + "yallist": "^3.0.2" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } } }, "@babel/helper-create-class-features-plugin": { @@ -11011,12 +11856,12 @@ "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==" }, "@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "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==", "requires": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" + "@babel/template": "^7.20.7", + "@babel/types": "^7.21.0" } }, "@babel/helper-hoist-variables": { @@ -11044,18 +11889,18 @@ } }, "@babel/helper-module-transforms": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", - "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", + "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==", "requires": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-module-imports": "^7.18.6", "@babel/helper-simple-access": "^7.20.2", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.1", - "@babel/types": "^7.20.2" + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.2", + "@babel/types": "^7.21.2" } }, "@babel/helper-optimise-call-expression": { @@ -11110,18 +11955,18 @@ "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==" }, "@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==" + "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==" }, "@babel/helpers": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.1.tgz", - "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", + "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", "requires": { - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.1", - "@babel/types": "^7.20.0" + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.0", + "@babel/types": "^7.21.0" } }, "@babel/highlight": { @@ -11135,9 +11980,9 @@ } }, "@babel/parser": { - "version": "7.20.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz", - "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==" + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.2.tgz", + "integrity": "sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==" }, "@babel/plugin-syntax-jsx": { "version": "7.18.6", @@ -11166,47 +12011,52 @@ } }, "@babel/standalone": { - "version": "7.20.4", - "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.20.4.tgz", - "integrity": "sha512-27bv4h47jbaFZ7+e7gT1VEo9PNL1ynxqUX6/BERLz1qxm/5gzpbcHX+47VnSeYHyEyGZkRznpSOd8zPBhiz6tw==" + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.21.2.tgz", + "integrity": "sha512-ySP/TJcyqMJVg1M/lmnPVi6L+F+IJpQ4+0lqtf723LERbk1N8/0JgLgm346cRAzfHaoXkLq/M/mJBd2uo25RBA==" }, "@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", "requires": { "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" } }, "@babel/traverse": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz", - "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==", + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.2.tgz", + "integrity": "sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw==", "requires": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.1", + "@babel/generator": "^7.21.1", "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", + "@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.20.1", - "@babel/types": "^7.20.0", + "@babel/parser": "^7.21.2", + "@babel/types": "^7.21.2", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", - "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.2.tgz", + "integrity": "sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==", "requires": { "@babel/helper-string-parser": "^7.19.4", "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" } }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" + }, "@cloudflare/kv-asset-handler": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.2.0.tgz", @@ -11215,18 +12065,6 @@ "mime": "^3.0.0" } }, - "@esbuild/android-arm": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.15.tgz", - "integrity": "sha512-JJjZjJi2eBL01QJuWjfCdZxcIgot+VoK6Fq7eKF9w4YHm9hwl7nhBR1o2Wnt/WcANk5l9SkpvrldW1PLuXxcbw==", - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.15.tgz", - "integrity": "sha512-lhz6UNPMDXUhtXSulw8XlFAtSYO26WmHQnCi2Lg2p+/TMiJKNLtZCYUxV4wG6rZMzXmr8InGpNwk+DLT2Hm0PA==", - "optional": true - }, "@eslint/eslintrc": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", @@ -11300,9 +12138,9 @@ } }, "@intlify/bundle-utils": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@intlify/bundle-utils/-/bundle-utils-3.4.0.tgz", - "integrity": "sha512-2UQkqiSAOSPEHMGWlybqWm4G2K0X+FyYho5AwXz6QklSX1EY5EDmOSxZmwscn2qmKBnp6OYsme5kUrnN9xrWzQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@intlify/bundle-utils/-/bundle-utils-4.0.0.tgz", + "integrity": "sha512-klXrYT9VXyKEXsD6UY3pShg0O5MPC07n0TZ5RrSs5ry6T1eZVolIFGJi9c3qcDrh1qjJxgikRnPBmD7qGDqbjw==", "dev": true, "requires": { "@intlify/message-compiler": "next", @@ -11355,28 +12193,28 @@ } }, "@intlify/message-compiler": { - "version": "9.3.0-beta.10", - "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.3.0-beta.10.tgz", - "integrity": "sha512-RoOC6yceOykLRhN0NlbkNOBUx1el6iphx3W8NfOx3jHVNtfT1FYokx14/5sU3F1F0uxeG4sp6q+ppKvaF8o+ww==", + "version": "9.3.0-beta.16", + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.3.0-beta.16.tgz", + "integrity": "sha512-CGQI3xRcs1ET75eDQ0DUy3MRYOqTauRIIgaMoISKiF83gqRWg93FqN8lGMKcpBqaF4tI0JhsfosCaGiBL9+dnw==", "dev": true, "requires": { - "@intlify/shared": "9.3.0-beta.10", + "@intlify/shared": "9.3.0-beta.16", "source-map": "0.6.1" } }, "@intlify/shared": { - "version": "9.3.0-beta.10", - "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.3.0-beta.10.tgz", - "integrity": "sha512-h93uAanbAt/XgjDHclrVB7xix6r7Uz11wx0iGNOCdHP7aA2LCJjUT3uNbekJjjbo+Fl5jzTSJZdm2SexzoqhRA==", + "version": "9.3.0-beta.16", + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.3.0-beta.16.tgz", + "integrity": "sha512-kXbm4svALe3lX+EjdJxfnabOphqS4yQ1Ge/iIlR8tvUiYRCoNz3hig1M4336iY++Dfx5ytEQJPNjIcknNIuvig==", "dev": true }, "@intlify/unplugin-vue-i18n": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@intlify/unplugin-vue-i18n/-/unplugin-vue-i18n-0.8.0.tgz", - "integrity": "sha512-bqMDYrbmV0oMLGHTdYMUXfcEsy2rPwQnGrQAg4gvw5FimvJfTQt3RliLVayT5ldOfeT2g0IUc/0t7LPeGrFUag==", + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@intlify/unplugin-vue-i18n/-/unplugin-vue-i18n-0.8.2.tgz", + "integrity": "sha512-cRnzPqSEZQOmTD+p4pwc3RTS9HxreLqfID0keoqZDZweCy/CGRMLLTNd15S4TUf1vSBhPF03DItEFDr1F+8MDA==", "dev": true, "requires": { - "@intlify/bundle-utils": "^3.4.0", + "@intlify/bundle-utils": "^4.0.0", "@intlify/shared": "next", "@rollup/pluginutils": "^4.2.0", "@vue/compiler-sfc": "^3.2.45", @@ -11411,6 +12249,11 @@ "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==" }, + "@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==" + }, "@jridgewell/gen-mapping": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", @@ -11481,41 +12324,6 @@ "tar": "^6.1.11" }, "dependencies": { - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz", - "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==", - "requires": { - "yallist": "^4.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - }, "node-fetch": { "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", @@ -11531,24 +12339,6 @@ "requires": { "lru-cache": "^6.0.0" } - }, - "tar": { - "version": "6.1.12", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.12.tgz", - "integrity": "sha512-jU4TdemS31uABHd+Lt5WEYJuzn+TJTCBLljvIAHZOz6M9Os5pJ4dD+vRFLxPa/n3T0iEFzpi+0x1UfuDZYbRMw==", - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "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==" } } }, @@ -11743,36 +12533,366 @@ } } }, - "@nuxtjs/eslint-config": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@nuxtjs/eslint-config/-/eslint-config-12.0.0.tgz", - "integrity": "sha512-ewenelo75x0eYEUK+9EBXjc/OopQCvdkmYmlZuoHq5kub/vtiRpyZ/autppwokpHUq8tiVyl2ejMakoiHiDTrg==", - "dev": true, - "requires": { - "eslint-config-standard": "^17.0.0", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-n": "^15.5.1", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-promise": "^6.1.1", - "eslint-plugin-unicorn": "^44.0.2", - "eslint-plugin-vue": "^9.7.0", - "local-pkg": "^0.4.2" - } - }, - "@nuxtjs/eslint-config-typescript": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@nuxtjs/eslint-config-typescript/-/eslint-config-typescript-12.0.0.tgz", - "integrity": "sha512-HJR0ho5MYuOCFjkL+eMX/VXbUwy36J12DUMVy+dj3Qz1GYHwX92Saxap3urFzr8oPkzzFiuOknDivfCeRBWakg==", - "dev": true, - "requires": { - "@nuxtjs/eslint-config": "^12.0.0", - "@typescript-eslint/eslint-plugin": "^5.42.1", - "@typescript-eslint/parser": "^5.42.1", - "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-vue": "^9.7.0" - } - }, + "@nuxtjs/eslint-config": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@nuxtjs/eslint-config/-/eslint-config-12.0.0.tgz", + "integrity": "sha512-ewenelo75x0eYEUK+9EBXjc/OopQCvdkmYmlZuoHq5kub/vtiRpyZ/autppwokpHUq8tiVyl2ejMakoiHiDTrg==", + "dev": true, + "requires": { + "eslint-config-standard": "^17.0.0", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-n": "^15.5.1", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-unicorn": "^44.0.2", + "eslint-plugin-vue": "^9.7.0", + "local-pkg": "^0.4.2" + } + }, + "@nuxtjs/eslint-config-typescript": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@nuxtjs/eslint-config-typescript/-/eslint-config-typescript-12.0.0.tgz", + "integrity": "sha512-HJR0ho5MYuOCFjkL+eMX/VXbUwy36J12DUMVy+dj3Qz1GYHwX92Saxap3urFzr8oPkzzFiuOknDivfCeRBWakg==", + "dev": true, + "requires": { + "@nuxtjs/eslint-config": "^12.0.0", + "@typescript-eslint/eslint-plugin": "^5.42.1", + "@typescript-eslint/parser": "^5.42.1", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-vue": "^9.7.0" + } + }, + "@nuxtjs/i18n": { + "version": "8.0.0-beta.10", + "resolved": "https://registry.npmjs.org/@nuxtjs/i18n/-/i18n-8.0.0-beta.10.tgz", + "integrity": "sha512-a7xcWKSJvABxF6O7W7MKscyT3OJxaKpBQZ84PGuTop9YrlBFkTV+bUQX3cayQqd0EYVLjgdE9R0uri5JMIVQWQ==", + "dev": true, + "requires": { + "@intlify/bundle-utils": "^4.0.0", + "@intlify/shared": "9.3.0-beta.16", + "@intlify/unplugin-vue-i18n": "^0.8.1", + "@nuxt/kit": "^3.1.2", + "@vue/compiler-sfc": "^3.2.47", + "cookie-es": "^0.5.0", + "debug": "^4.3.4", + "estree-walker": "^3.0.1", + "is-https": "^4.0.0", + "js-cookie": "^3.0.1", + "knitwork": "^1.0.0", + "magic-string": "^0.27.0", + "mlly": "^1.1.0", + "pathe": "^1.1.0", + "pkg-types": "^1.0.1", + "ufo": "^1.0.1", + "unplugin": "^1.0.1", + "vue-i18n": "9.3.0-beta.16", + "vue-i18n-routing": "^0.12.2" + }, + "dependencies": { + "@intlify/core-base": { + "version": "9.3.0-beta.16", + "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.3.0-beta.16.tgz", + "integrity": "sha512-BoAxVoPIJoPKCCMdsuNXKaaJxvetvHrW2KA43IpkwgPd2/w6zPebh/+v8e4zpXKjFVSgcF97zP87KeVcM/Lxwg==", + "dev": true, + "requires": { + "@intlify/devtools-if": "9.3.0-beta.16", + "@intlify/message-compiler": "9.3.0-beta.16", + "@intlify/shared": "9.3.0-beta.16", + "@intlify/vue-devtools": "9.3.0-beta.16" + } + }, + "@intlify/devtools-if": { + "version": "9.3.0-beta.16", + "resolved": "https://registry.npmjs.org/@intlify/devtools-if/-/devtools-if-9.3.0-beta.16.tgz", + "integrity": "sha512-9WXn8YMAnL/DHdoWqCy6yLTXcLFxd8eXB9UNsViQA5JJV7neR+yahr+23X1wP0prhG338MruxAu65khRf+AJCw==", + "dev": true, + "requires": { + "@intlify/shared": "9.3.0-beta.16" + } + }, + "@intlify/vue-devtools": { + "version": "9.3.0-beta.16", + "resolved": "https://registry.npmjs.org/@intlify/vue-devtools/-/vue-devtools-9.3.0-beta.16.tgz", + "integrity": "sha512-rQ/jSW0gBciYLBBi+XN65r80B59Ypege9oqUi+EZ2QpOaK54wDcy1xq9w6Zbj6WpY1qgf34KtYawKIF10mMr6w==", + "dev": true, + "requires": { + "@intlify/core-base": "9.3.0-beta.16", + "@intlify/shared": "9.3.0-beta.16" + } + }, + "@nuxt/kit": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-3.2.3.tgz", + "integrity": "sha512-wcsVlQLwGkh1cRhAFWHc3uYHdIxFTRNdRUzNyfqoX9DL0Fuga3K75q/PBY0xg1viA9R6F5BMPhc7KDLSWbXtWg==", + "dev": true, + "requires": { + "@nuxt/schema": "3.2.3", + "c12": "^1.1.2", + "consola": "^2.15.3", + "defu": "^6.1.2", + "globby": "^13.1.3", + "hash-sum": "^2.0.0", + "ignore": "^5.2.4", + "jiti": "^1.17.1", + "knitwork": "^1.0.0", + "lodash.template": "^4.5.0", + "mlly": "^1.1.1", + "pathe": "^1.1.0", + "pkg-types": "^1.0.2", + "scule": "^1.0.0", + "semver": "^7.3.8", + "unctx": "^2.1.2", + "unimport": "^2.2.4", + "untyped": "^1.2.2" + } + }, + "@nuxt/schema": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@nuxt/schema/-/schema-3.2.3.tgz", + "integrity": "sha512-AXzRnBivCwn5RpNFWjUkvOPGPSHl5BM+6GfOpSNglPXi0tiQJ+rawSl7no7BkxGDmQ44Bx9AXwvHTrgjpcuo4g==", + "dev": true, + "requires": { + "c12": "^1.1.2", + "create-require": "^1.1.1", + "defu": "^6.1.2", + "hookable": "^5.4.2", + "jiti": "^1.17.1", + "pathe": "^1.1.0", + "pkg-types": "^1.0.2", + "postcss-import-resolver": "^2.0.0", + "scule": "^1.0.0", + "std-env": "^3.3.2", + "ufo": "^1.1.1", + "unimport": "^2.2.4", + "untyped": "^1.2.2" + } + }, + "@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": { + "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 + } + } + }, + "@vue/compiler-core": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.47.tgz", + "integrity": "sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==", + "dev": true, + "requires": { + "@babel/parser": "^7.16.4", + "@vue/shared": "3.2.47", + "estree-walker": "^2.0.2", + "source-map": "^0.6.1" + }, + "dependencies": { + "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 + } + } + }, + "@vue/compiler-dom": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz", + "integrity": "sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==", + "dev": true, + "requires": { + "@vue/compiler-core": "3.2.47", + "@vue/shared": "3.2.47" + } + }, + "@vue/compiler-sfc": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz", + "integrity": "sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==", + "dev": true, + "requires": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.47", + "@vue/compiler-dom": "3.2.47", + "@vue/compiler-ssr": "3.2.47", + "@vue/reactivity-transform": "3.2.47", + "@vue/shared": "3.2.47", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7", + "postcss": "^8.1.10", + "source-map": "^0.6.1" + }, + "dependencies": { + "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 + }, + "magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.8" + } + } + } + }, + "@vue/compiler-ssr": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz", + "integrity": "sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==", + "dev": true, + "requires": { + "@vue/compiler-dom": "3.2.47", + "@vue/shared": "3.2.47" + } + }, + "@vue/reactivity-transform": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz", + "integrity": "sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==", + "dev": true, + "requires": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.47", + "@vue/shared": "3.2.47", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7" + }, + "dependencies": { + "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 + }, + "magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.8" + } + } + } + }, + "@vue/shared": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.47.tgz", + "integrity": "sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==", + "dev": true + }, + "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 + }, + "magic-string": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "dev": true, + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.13" + } + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "unimport": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/unimport/-/unimport-2.2.4.tgz", + "integrity": "sha512-qMgmeEGqqrrmEtm0dqxMG37J6xBtrriqxq9hILvDb+e6l2F0yTnJomLoCCp0eghLR7bYGeBsUU5Y0oyiUYhViw==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^5.0.2", + "escape-string-regexp": "^5.0.0", + "fast-glob": "^3.2.12", + "local-pkg": "^0.4.3", + "magic-string": "^0.27.0", + "mlly": "^1.1.0", + "pathe": "^1.1.0", + "pkg-types": "^1.0.1", + "scule": "^1.0.0", + "strip-literal": "^1.0.0", + "unplugin": "^1.0.1" + } + }, + "vue-i18n": { + "version": "9.3.0-beta.16", + "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.3.0-beta.16.tgz", + "integrity": "sha512-huhBeRB0SEvv2gIgCS7Zo06nb8AAhbPQCoB/vwDfbDNs8F+giv9QCmhEed+TkLTih/54JGnXkxN6tw1VZqVY/w==", + "dev": true, + "requires": { + "@intlify/core-base": "9.3.0-beta.16", + "@intlify/shared": "9.3.0-beta.16", + "@intlify/vue-devtools": "9.3.0-beta.16", + "@vue/devtools-api": "^6.2.1" + } + }, + "vue-i18n-routing": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/vue-i18n-routing/-/vue-i18n-routing-0.12.2.tgz", + "integrity": "sha512-VzYUzbUJyPHUP74t973dN42/sJnZUzBwdcYX+TJgr9YHD08+9uouw5Ume2jHO2Pi8Nymu4cz/UiHWDPeMyc/bQ==", + "dev": true, + "requires": { + "@intlify/shared": "next", + "@intlify/vue-i18n-bridge": "^0.8.0", + "@intlify/vue-router-bridge": "^0.8.0", + "ufo": "^1.0.0", + "vue-demi": "^0.13.11" + }, + "dependencies": { + "@intlify/vue-i18n-bridge": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@intlify/vue-i18n-bridge/-/vue-i18n-bridge-0.8.0.tgz", + "integrity": "sha512-wQ18fSccm9QaWpUW2vq2QHvojgKIog7s+UMj9LeY3pUV3yD9bU4YZI+1PTNoX3tOA+BE71gQyqVGox/TVQKP6Q==", + "dev": true, + "requires": {} + }, + "@intlify/vue-router-bridge": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@intlify/vue-router-bridge/-/vue-router-bridge-0.8.0.tgz", + "integrity": "sha512-CNxOgvyQcRhtGmRrksicL+HGjDijXtz+J/x04C/RslZ74CFdZkxjCe8MABkeD3xr+ry8G8tCm2nV2hLjZbynQw==", + "dev": true, + "requires": { + "vue-demi": "^0.13.5" + } + }, + "vue-demi": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz", + "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==", + "dev": true, + "requires": {} + } + } + } + } + }, "@pkgr/utils": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.3.1.tgz", @@ -11962,11 +13082,29 @@ "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==" }, + "@types/chai": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==" + }, + "@types/chai-subset": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", + "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", + "requires": { + "@types/chai": "*" + } + }, "@types/estree": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==" }, + "@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==" + }, "@types/json-schema": { "version": "7.0.11", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", @@ -12264,6 +13402,70 @@ "@vue/babel-plugin-jsx": "^1.1.1" } }, + "@vitest/coverage-c8": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/@vitest/coverage-c8/-/coverage-c8-0.29.8.tgz", + "integrity": "sha512-y+sEMQMctWokjnSqm3FCQEYFkjLrYaznsxEZHxcx8z2aftpYg3A5tvI1S5himfdEFo7o+OeHzh40bPSWZHW4oQ==", + "requires": { + "c8": "^7.13.0", + "picocolors": "^1.0.0", + "std-env": "^3.3.1" + } + }, + "@vitest/expect": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.29.8.tgz", + "integrity": "sha512-xlcVXn5I5oTq6NiZSY3ykyWixBxr5mG8HYtjvpgg6KaqHm0mvhX18xuwl5YGxIRNt/A5jidd7CWcNHrSvgaQqQ==", + "requires": { + "@vitest/spy": "0.29.8", + "@vitest/utils": "0.29.8", + "chai": "^4.3.7" + } + }, + "@vitest/runner": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.29.8.tgz", + "integrity": "sha512-FzdhnRDwEr/A3Oo1jtIk/B952BBvP32n1ObMEb23oEJNO+qO5cBet6M2XWIDQmA7BDKGKvmhUf2naXyp/2JEwQ==", + "requires": { + "@vitest/utils": "0.29.8", + "p-limit": "^4.0.0", + "pathe": "^1.1.0" + }, + "dependencies": { + "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==", + "requires": { + "yocto-queue": "^1.0.0" + } + }, + "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==" + } + } + }, + "@vitest/spy": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.29.8.tgz", + "integrity": "sha512-VdjBe9w34vOMl5I5mYEzNX8inTxrZ+tYUVk9jxaZJmHFwmDFC/GV3KBFTA/JKswr3XHvZL+FE/yq5EVhb6pSAw==", + "requires": { + "tinyspy": "^1.0.2" + } + }, + "@vitest/utils": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.29.8.tgz", + "integrity": "sha512-qGzuf3vrTbnoY+RjjVVIBYfuWMjn3UMUqyQtdGNZ6ZIIyte7B37exj6LaVkrZiUTvzSadVvO/tJm8AEgbGCBPg==", + "requires": { + "cli-truncate": "^3.1.0", + "diff": "^5.1.0", + "loupe": "^2.3.6", + "pretty-format": "^27.5.1" + } + }, "@volar/language-core": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.0.13.tgz", @@ -12592,9 +13794,9 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, "acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==" + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==" }, "acorn-jsx": { "version": "5.3.2", @@ -12603,6 +13805,11 @@ "devOptional": 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==" + }, "agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -12782,6 +13989,11 @@ "es-shim-unscopables": "^1.0.0" } }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" + }, "async": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", @@ -12939,20 +14151,121 @@ } }, "c12": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/c12/-/c12-1.0.1.tgz", - "integrity": "sha512-EN9Rqix2q9X3PseFkUvRFZ/0fvncF35ZR5nykLDwv4Ml/Q1WYPLkcdqlrczFll2G9t4qmxgM4my3EF3IrRGl5Q==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/c12/-/c12-1.1.2.tgz", + "integrity": "sha512-fHT5HDEHNMb2oImnqJ88/UlpEOkY/chdyYxSd3YCpvBqBvU0IDlHTkNc7GnjObDMxdis2lL+rwlQcNq8VeZESA==", "requires": { - "defu": "^6.1.1", + "defu": "^6.1.2", "dotenv": "^16.0.3", - "gittar": "^0.1.1", - "jiti": "^1.16.0", - "mlly": "^1.0.0", - "pathe": "^1.0.0", - "pkg-types": "^1.0.1", - "rc9": "^2.0.0" + "giget": "^1.1.0", + "jiti": "^1.17.1", + "mlly": "^1.1.1", + "pathe": "^1.1.0", + "pkg-types": "^1.0.2", + "rc9": "^2.0.1" + } + }, + "c8": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/c8/-/c8-7.13.0.tgz", + "integrity": "sha512-/NL4hQTv1gBL6J6ei80zu3IiTrmePDKXKXOTLpHvcIWZTVYQlDhVWjjWvkhICylE8EwwnMVzDZugCvdx0/DIIA==", + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@istanbuljs/schema": "^0.1.3", + "find-up": "^5.0.0", + "foreground-child": "^2.0.0", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-reports": "^3.1.4", + "rimraf": "^3.0.2", + "test-exclude": "^6.0.0", + "v8-to-istanbul": "^9.0.0", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9" + }, + "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": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.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==" + }, + "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==" + }, + "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==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "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==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "requires": { + "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" + } + }, + "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==" + } } }, + "cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==" + }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -12989,6 +14302,20 @@ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz", "integrity": "sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA==" }, + "chai": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + } + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -13004,6 +14331,11 @@ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==" + }, "chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -13030,9 +14362,9 @@ } }, "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" }, "ci-info": { "version": "3.6.1", @@ -13061,6 +14393,15 @@ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==" }, + "cli-truncate": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", + "requires": { + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" + } + }, "cli-width": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.0.0.tgz", @@ -13386,6 +14727,14 @@ "ms": "2.1.2" } }, + "deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "requires": { + "type-detect": "^4.0.0" + } + }, "deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -13421,9 +14770,9 @@ } }, "defu": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.1.tgz", - "integrity": "sha512-aA964RUCsBt0FGoNIlA3uFgo2hO+WWC0fiC6DBps/0SFzkKcYoM/3CzVLIa5xSsrFjdioMdYgAIbwo80qp2MoA==" + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.2.tgz", + "integrity": "sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ==" }, "delayed-stream": { "version": "1.0.0", @@ -13446,9 +14795,9 @@ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" }, "destr": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/destr/-/destr-1.2.1.tgz", - "integrity": "sha512-ud8w0qMLlci6iFG7CNgeRr8OcbUWMsbfjtWft1eJ5Luqrz/M8Ebqk/KCzne8rKUlIQWWfLv0wD6QHrqOf4GshA==" + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/destr/-/destr-1.2.2.tgz", + "integrity": "sha512-lrbCJwD9saUQrqUfXvl6qoM+QN3W7tLV5pAOs+OqOmopCCz/JkE05MHedJR1xfk4IAnZuJXPVuN5+7jNA2ZCiA==" }, "destroy": { "version": "1.2.0", @@ -13460,6 +14809,11 @@ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" }, + "diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==" + }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -13658,147 +15012,33 @@ "integrity": "sha512-TEw/lwK4Zzld9x3FedV6jy8onOUHqcEX3ADFk4k+gzPUwrxn8nWV62tH0udo8jOtjFodlEfc4ypsqX3e+WWO6w==", "requires": { "@esbuild/android-arm": "0.15.15", - "@esbuild/linux-loong64": "0.15.15", - "esbuild-android-64": "0.15.15", - "esbuild-android-arm64": "0.15.15", - "esbuild-darwin-64": "0.15.15", - "esbuild-darwin-arm64": "0.15.15", - "esbuild-freebsd-64": "0.15.15", - "esbuild-freebsd-arm64": "0.15.15", - "esbuild-linux-32": "0.15.15", - "esbuild-linux-64": "0.15.15", - "esbuild-linux-arm": "0.15.15", - "esbuild-linux-arm64": "0.15.15", - "esbuild-linux-mips64le": "0.15.15", - "esbuild-linux-ppc64le": "0.15.15", - "esbuild-linux-riscv64": "0.15.15", - "esbuild-linux-s390x": "0.15.15", - "esbuild-netbsd-64": "0.15.15", - "esbuild-openbsd-64": "0.15.15", - "esbuild-sunos-64": "0.15.15", - "esbuild-windows-32": "0.15.15", - "esbuild-windows-64": "0.15.15", - "esbuild-windows-arm64": "0.15.15" - } - }, - "esbuild-android-64": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.15.tgz", - "integrity": "sha512-F+WjjQxO+JQOva3tJWNdVjouFMLK6R6i5gjDvgUthLYJnIZJsp1HlF523k73hELY20WPyEO8xcz7aaYBVkeg5Q==", - "optional": true - }, - "esbuild-android-arm64": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.15.tgz", - "integrity": "sha512-attlyhD6Y22jNyQ0fIIQ7mnPvDWKw7k6FKnsXlBvQE6s3z6s6cuEHcSgoirquQc7TmZgVCK5fD/2uxmRN+ZpcQ==", - "optional": true - }, - "esbuild-darwin-64": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.15.tgz", - "integrity": "sha512-ohZtF8W1SHJ4JWldsPVdk8st0r9ExbAOSrBOh5L+Mq47i696GVwv1ab/KlmbUoikSTNoXEhDzVpxUR/WIO19FQ==", - "optional": true - }, - "esbuild-darwin-arm64": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.15.tgz", - "integrity": "sha512-P8jOZ5zshCNIuGn+9KehKs/cq5uIniC+BeCykvdVhx/rBXSxmtj3CUIKZz4sDCuESMbitK54drf/2QX9QHG5Ag==", - "optional": true - }, - "esbuild-freebsd-64": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.15.tgz", - "integrity": "sha512-KkTg+AmDXz1IvA9S1gt8dE24C8Thx0X5oM0KGF322DuP+P3evwTL9YyusHAWNsh4qLsR80nvBr/EIYs29VSwuA==", - "optional": true - }, - "esbuild-freebsd-arm64": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.15.tgz", - "integrity": "sha512-FUcML0DRsuyqCMfAC+HoeAqvWxMeq0qXvclZZ/lt2kLU6XBnDA5uKTLUd379WYEyVD4KKFctqWd9tTuk8C/96g==", - "optional": true - }, - "esbuild-linux-32": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.15.tgz", - "integrity": "sha512-q28Qn5pZgHNqug02aTkzw5sW9OklSo96b5nm17Mq0pDXrdTBcQ+M6Q9A1B+dalFeynunwh/pvfrNucjzwDXj+Q==", - "optional": true - }, - "esbuild-linux-64": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.15.tgz", - "integrity": "sha512-217KPmWMirkf8liO+fj2qrPwbIbhNTGNVtvqI1TnOWJgcMjUWvd677Gq3fTzXEjilkx2yWypVnTswM2KbXgoAg==", - "optional": true - }, - "esbuild-linux-arm": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.15.tgz", - "integrity": "sha512-RYVW9o2yN8yM7SB1yaWr378CwrjvGCyGybX3SdzPHpikUHkME2AP55Ma20uNwkNyY2eSYFX9D55kDrfQmQBR4w==", - "optional": true - }, - "esbuild-linux-arm64": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.15.tgz", - "integrity": "sha512-/ltmNFs0FivZkYsTzAsXIfLQX38lFnwJTWCJts0IbCqWZQe+jjj0vYBNbI0kmXLb3y5NljiM5USVAO1NVkdh2g==", - "optional": true - }, - "esbuild-linux-mips64le": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.15.tgz", - "integrity": "sha512-PksEPb321/28GFFxtvL33yVPfnMZihxkEv5zME2zapXGp7fA1X2jYeiTUK+9tJ/EGgcNWuwvtawPxJG7Mmn86A==", - "optional": true - }, - "esbuild-linux-ppc64le": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.15.tgz", - "integrity": "sha512-ek8gJBEIhcpGI327eAZigBOHl58QqrJrYYIZBWQCnH3UnXoeWMrMZLeeZL8BI2XMBhP+sQ6ERctD5X+ajL/AIA==", - "optional": true - }, - "esbuild-linux-riscv64": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.15.tgz", - "integrity": "sha512-H5ilTZb33/GnUBrZMNJtBk7/OXzDHDXjIzoLXHSutwwsLxSNaLxzAaMoDGDd/keZoS+GDBqNVxdCkpuiRW4OSw==", - "optional": true - }, - "esbuild-linux-s390x": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.15.tgz", - "integrity": "sha512-jKaLUg78mua3rrtrkpv4Or2dNTJU7bgHN4bEjT4OX4GR7nLBSA9dfJezQouTxMmIW7opwEC5/iR9mpC18utnxQ==", - "optional": true - }, - "esbuild-netbsd-64": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.15.tgz", - "integrity": "sha512-aOvmF/UkjFuW6F36HbIlImJTTx45KUCHJndtKo+KdP8Dhq3mgLRKW9+6Ircpm8bX/RcS3zZMMmaBLkvGY06Gvw==", - "optional": true - }, - "esbuild-openbsd-64": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.15.tgz", - "integrity": "sha512-HFFX+WYedx1w2yJ1VyR1Dfo8zyYGQZf1cA69bLdrHzu9svj6KH6ZLK0k3A1/LFPhcEY9idSOhsB2UyU0tHPxgQ==", - "optional": true - }, - "esbuild-sunos-64": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.15.tgz", - "integrity": "sha512-jOPBudffG4HN8yJXcK9rib/ZTFoTA5pvIKbRrt3IKAGMq1EpBi4xoVoSRrq/0d4OgZLaQbmkHp8RO9eZIn5atA==", - "optional": true - }, - "esbuild-windows-32": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.15.tgz", - "integrity": "sha512-MDkJ3QkjnCetKF0fKxCyYNBnOq6dmidcwstBVeMtXSgGYTy8XSwBeIE4+HuKiSsG6I/mXEb++px3IGSmTN0XiA==", - "optional": true - }, - "esbuild-windows-64": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.15.tgz", - "integrity": "sha512-xaAUIB2qllE888SsMU3j9nrqyLbkqqkpQyWVkfwSil6BBPgcPk3zOFitTTncEKCLTQy3XV9RuH7PDj3aJDljWA==", - "optional": true + "@esbuild/linux-loong64": "0.15.15", + "esbuild-android-64": "0.15.15", + "esbuild-android-arm64": "0.15.15", + "esbuild-darwin-64": "0.15.15", + "esbuild-darwin-arm64": "0.15.15", + "esbuild-freebsd-64": "0.15.15", + "esbuild-freebsd-arm64": "0.15.15", + "esbuild-linux-32": "0.15.15", + "esbuild-linux-64": "0.15.15", + "esbuild-linux-arm": "0.15.15", + "esbuild-linux-arm64": "0.15.15", + "esbuild-linux-mips64le": "0.15.15", + "esbuild-linux-ppc64le": "0.15.15", + "esbuild-linux-riscv64": "0.15.15", + "esbuild-linux-s390x": "0.15.15", + "esbuild-netbsd-64": "0.15.15", + "esbuild-openbsd-64": "0.15.15", + "esbuild-sunos-64": "0.15.15", + "esbuild-windows-32": "0.15.15", + "esbuild-windows-64": "0.15.15", + "esbuild-windows-arm64": "0.15.15" + } }, - "esbuild-windows-arm64": { + "esbuild-linux-64": { "version": "0.15.15", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.15.tgz", - "integrity": "sha512-ttuoCYCIJAFx4UUKKWYnFdrVpoXa3+3WWkXVI6s09U+YjhnyM5h96ewTq/WgQj9LFSIlABQvadHSOQyAVjW5xQ==", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.15.tgz", + "integrity": "sha512-217KPmWMirkf8liO+fj2qrPwbIbhNTGNVtvqI1TnOWJgcMjUWvd677Gq3fTzXEjilkx2yWypVnTswM2KbXgoAg==", "optional": true }, "escalade": { @@ -14523,7 +15763,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "devOptional": true, "requires": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -14555,6 +15794,15 @@ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" }, + "foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + } + }, "form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -14604,11 +15852,21 @@ "integrity": "sha512-YEexkCpL4j03jn5SxaMHqcO6IuWuqm8JFUYhyCep7Ao89JIYmB8xoKhK7zXXJ9cCaNXpyNH5L3QtAmoxjoHW2w==" }, "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "requires": { - "minipass": "^2.6.0" + "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==", + "requires": { + "yallist": "^4.0.0" + } + } } }, "fs.realpath": { @@ -14616,12 +15874,6 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "optional": true - }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -14688,6 +15940,11 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==" + }, "get-intrinsic": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", @@ -14727,6 +15984,20 @@ "integrity": "sha512-X8u8fREiYOE6S8hLbq99PeykTDoLVnxvF4DjWKJmz9xy2nNRdUcV8ZN9tniJFeKyTU3qnC9lL8n4Chd6LmVKHg==", "dev": true }, + "giget": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/giget/-/giget-1.1.2.tgz", + "integrity": "sha512-HsLoS07HiQ5oqvObOI+Qb2tyZH4Gj5nYGfF9qQcZNrPw+uEFhdXtgJr01aO2pWadGHucajYDLxxbtQkm97ON2A==", + "requires": { + "colorette": "^2.0.19", + "defu": "^6.1.2", + "https-proxy-agent": "^5.0.1", + "mri": "^1.2.0", + "node-fetch-native": "^1.0.2", + "pathe": "^1.1.0", + "tar": "^6.1.13" + } + }, "git-config-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/git-config-path/-/git-config-path-2.0.0.tgz", @@ -14749,15 +16020,6 @@ "git-up": "^7.0.0" } }, - "gittar": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/gittar/-/gittar-0.1.1.tgz", - "integrity": "sha512-p+XuqWJpW9ahUuNTptqeFjudFq31o6Jd+maMBarkMAR5U3K9c7zJB4sQ4BV8mIqrTOV29TtqikDhnZfCD4XNfQ==", - "requires": { - "mkdirp": "^0.5.1", - "tar": "^4.4.1" - } - }, "glob": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", @@ -14809,9 +16071,9 @@ "dev": true }, "globby": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", - "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", + "version": "13.1.3", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz", + "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==", "requires": { "dir-glob": "^3.0.1", "fast-glob": "^3.2.11", @@ -14934,6 +16196,11 @@ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + }, "html-tags": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", @@ -14994,9 +16261,9 @@ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==" + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==" }, "immutable": { "version": "4.1.0", @@ -15205,6 +16472,12 @@ "is-extglob": "^2.1.1" } }, + "is-https": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-https/-/is-https-4.0.0.tgz", + "integrity": "sha512-FeMLiqf8E5g6SdiVJsPcNZX8k4h2fBs1wp5Bb6uaNxn58ufK1axBqQZdmAQsqh0t9BuwFObybrdVJh6MKyPlyg==", + "dev": true + }, "is-interactive": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", @@ -15348,6 +16621,45 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, + "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==" + }, + "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==", + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.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==" + }, + "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" + } + } + } + }, + "istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, "jest-worker": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", @@ -15374,9 +16686,15 @@ } }, "jiti": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.16.0.tgz", - "integrity": "sha512-L3BJStEf5NAqNuzrpfbN71dp43mYIcBUlCRea/vdyv5dW/AYa1d4bpelko4SHdY3I6eN9Wzyasxirj1/vv5kmg==" + "version": "1.17.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.17.2.tgz", + "integrity": "sha512-Xf0nU8+8wuiQpLcqdb2HRyHqYwGk2Pd+F7kstyp20ZuqTyCmB9dqpX2NxaxFc1kovraa2bG6c1RL3W7XfapiZg==" + }, + "js-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.1.tgz", + "integrity": "sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw==", + "dev": true }, "js-sdsl": { "version": "4.2.0", @@ -15422,9 +16740,9 @@ "devOptional": true }, "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" }, "jsonc-eslint-parser": { "version": "1.4.1", @@ -15571,15 +16889,14 @@ } }, "local-pkg": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.2.tgz", - "integrity": "sha512-mlERgSPrbxU3BP4qBqAvvwlgW4MTg78iwJdGGnv7kibKjWcJksrG3t6LB5lXI93wXRDvG4NpUgJFmTG4T6rdrg==" + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==" }, "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==", - "devOptional": true, "requires": { "p-locate": "^5.0.0" } @@ -15683,19 +17000,20 @@ } } }, + "loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "requires": { + "get-func-name": "^2.0.0" + } + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "requires": { "yallist": "^4.0.0" - }, - "dependencies": { - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } } }, "magic-string": { @@ -15816,23 +17134,31 @@ "minimist": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "dev": true }, "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.4.tgz", + "integrity": "sha512-lwycX3cBMTvcejsHITUgYj6Gy6A7Nh4Q6h9NP4sTHY1ccJlC7yKzDmiShEHsJ16Jf1nKGDEaiHxiltsJEvk0nQ==" }, "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "requires": { - "minipass": "^2.9.0" + "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==", + "requires": { + "yallist": "^4.0.0" + } + } } }, "mkdir": { @@ -15841,22 +17167,19 @@ "integrity": "sha512-98OnjcWaNEIRUJJe9rFoWlbkQ5n9z8F86wIPCrI961YEViiVybTuJln919WuuSHSnlrqXy0ELKCntoPy8C7lqg==" }, "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "requires": { - "minimist": "^1.2.6" - } + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" }, "mlly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.0.0.tgz", - "integrity": "sha512-QL108Hwt+u9bXdWgOI0dhzZfACovn5Aen4Xvc8Jasd9ouRH4NjnrXEiyP3nVvJo91zPlYjVRckta0Nt2zfoR6g==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.1.1.tgz", + "integrity": "sha512-Jnlh4W/aI4GySPo6+DyTN17Q75KKbLTyFK8BrGhjNP4rxuUjbRWhE6gHg3bs33URWAF44FRm7gdQA348i3XxRw==", "requires": { - "acorn": "^8.8.1", - "pathe": "^1.0.0", - "pkg-types": "^1.0.0", - "ufo": "^1.0.0" + "acorn": "^8.8.2", + "pathe": "^1.1.0", + "pkg-types": "^1.0.1", + "ufo": "^1.1.0" } }, "mri": { @@ -16013,9 +17336,9 @@ } }, "node-fetch-native": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.0.1.tgz", - "integrity": "sha512-VzW+TAk2wE4X9maiKMlT+GsPU4OMmR1U9CrHSmd3DFLn2IcZ9VJ6M6BBugGfYUnPCLSYxXdZy17M0BEJyhUTwg==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.0.2.tgz", + "integrity": "sha512-KIkvH1jl6b3O7es/0ShyCgWLcfXxlBrLBbP3rOr23WArC66IMcU4DeZEeYEOwnopYhawLTn7/y+YtmASe8DFVQ==" }, "node-forge": { "version": "1.3.1", @@ -16355,7 +17678,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "devOptional": true, "requires": { "yocto-queue": "^0.1.0" } @@ -16364,7 +17686,6 @@ "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==", - "devOptional": true, "requires": { "p-limit": "^3.0.2" } @@ -16451,9 +17772,14 @@ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" }, "pathe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.0.0.tgz", - "integrity": "sha512-nPdMG0Pd09HuSsr7QOKUXO2Jr9eqaDiZvDwdyIhNG5SHYujkQHYKDfGQkulBxvbDHz8oHLsTgKN86LSwYzSHAg==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.0.tgz", + "integrity": "sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==" + }, + "pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==" }, "perfect-debounce": { "version": "0.1.3", @@ -16519,13 +17845,13 @@ } }, "pkg-types": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.1.tgz", - "integrity": "sha512-jHv9HB+Ho7dj6ItwppRDDl0iZRYBD0jsakHXtFgoLr+cHSF6xC+QL54sJmWxyGxOLYSHm0afhXhXcQDQqH9z8g==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.2.tgz", + "integrity": "sha512-hM58GKXOcj8WTqUXnsQyJYXdeAPbythQgEF3nTcEo+nkD49chjQ9IKm/QJy9xf6JakXptz86h7ecP2024rrLaQ==", "requires": { "jsonc-parser": "^3.2.0", - "mlly": "^1.0.0", - "pathe": "^1.0.0" + "mlly": "^1.1.1", + "pathe": "^1.1.0" } }, "pluralize": { @@ -16877,6 +18203,23 @@ "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.0.0.tgz", "integrity": "sha512-6UqkYefdogmzqAZWzJ7laYeJnaXDy2/J+ZqiiMtS7t7OfpXWTlaeGMwX8U6EFvPV/YWWEKRkS8hKS4k60WHTOg==" }, + "pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "requires": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "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==" + } + } + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -16935,15 +18278,20 @@ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "rc9": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.0.0.tgz", - "integrity": "sha512-yVeYJHOpJLOhs3V6RKwz7RPPwPurrx3JjwK264sPgvo/lFdhuUrLien7iSvAO6STVkN0gSMk/MehQNHQhflqZw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.0.1.tgz", + "integrity": "sha512-9EfjLgNmzP9255YX8bGnILQcmdtOXKtUlFTu8bOZPJVtaUDZ2imswcUdpK51tMjTRQyB7r5RebNijrzuyGXcVA==", "requires": { - "defu": "^6.1.1", - "destr": "^1.2.1", + "defu": "^6.1.2", + "destr": "^1.2.2", "flat": "^5.0.2" } }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, "read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -17400,6 +18748,11 @@ "object-inspect": "^1.9.0" } }, + "siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==" + }, "signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -17410,6 +18763,27 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==" }, + "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==", + "requires": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" + }, + "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==" + } + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -17471,6 +18845,11 @@ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" }, + "stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==" + }, "standard-as-callback": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", @@ -17482,9 +18861,9 @@ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" }, "std-env": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.1.tgz", - "integrity": "sha512-3H20QlwQsSm2OvAxWIYhs+j01MzzqwMwGiiO1NQaJYZgJZFPuAbf95/DiKRBSTYIJ2FeGUc+B/6mPGcWP9dO3Q==" + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.2.tgz", + "integrity": "sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==" }, "streamsearch": { "version": "1.1.0", @@ -17645,17 +19024,16 @@ "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" }, "tar": { - "version": "4.4.19", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", - "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", + "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", "requires": { - "chownr": "^1.1.4", - "fs-minipass": "^1.2.7", - "minipass": "^2.9.0", - "minizlib": "^1.3.3", - "mkdirp": "^0.5.5", - "safe-buffer": "^5.2.1", - "yallist": "^3.1.1" + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^4.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" } }, "tar-stream": { @@ -17709,6 +19087,31 @@ } } }, + "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==", + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "dependencies": { + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -17735,6 +19138,21 @@ "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" }, + "tinybench": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.4.0.tgz", + "integrity": "sha512-iyziEiyFxX4kyxSp+MtY1oCH/lvjH3PxFN8PGCDeqcZWAJ/i+9y+nL85w99PxVzrIvew/GSkSbDYtiGVa85Afg==" + }, + "tinypool": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.4.0.tgz", + "integrity": "sha512-2ksntHOKf893wSAH4z/+JbPpi92esw8Gn9N2deXX+B0EO92hexAVI9GIZZPx7P5aYo5KULfeOSt3kMOmSOy6uA==" + }, + "tinyspy": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-1.1.1.tgz", + "integrity": "sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==" + }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -17779,9 +19197,9 @@ }, "dependencies": { "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "requires": { "minimist": "^1.2.0" @@ -17820,6 +19238,11 @@ "prelude-ls": "^1.2.1" } }, + "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==" + }, "type-fest": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.2.0.tgz", @@ -17832,9 +19255,9 @@ "devOptional": true }, "ufo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.0.0.tgz", - "integrity": "sha512-DRty0ZBNlJ2R59y4mEupJRKLbkLQsc4qtxjpQv78AwEDuBkaUogMc2LkeqW3HddFlw6NwnXYfdThEZOiNgkmmQ==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.1.1.tgz", + "integrity": "sha512-MvlCc4GHrmZdAllBc0iUDowff36Q9Ndw/UzqmEKyrfSzokTd9ZCy1i+IIk5hrYKkjoYVQyNbrw7/F8XJ2rEwTg==" }, "ultrahtml": { "version": "1.0.1", @@ -17854,20 +19277,38 @@ } }, "unctx": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unctx/-/unctx-2.1.0.tgz", - "integrity": "sha512-Q3UdS5IAlVRIWsWDd8Rr9g2zqBAZaecBgQ+XXFiKbZzovDMMTEU+Ki0SAVf/ZgWsoeG0/c1kzO2/k6BVhbkUHw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/unctx/-/unctx-2.1.2.tgz", + "integrity": "sha512-KK18aLRKe3OlbPyHbXAkIWSU3xK8GInomXfA7fzDMGFXQ1crX1UWrCzKesVXeUyHIayHUrnTvf87IPCKMyeKTg==", "requires": { - "acorn": "^8.8.1", - "estree-walker": "^3.0.1", - "magic-string": "^0.26.7", - "unplugin": "^1.0.0" + "acorn": "^8.8.2", + "estree-walker": "^3.0.3", + "magic-string": "^0.27.0", + "unplugin": "^1.0.1" + }, + "dependencies": { + "estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "requires": { + "@types/estree": "^1.0.0" + } + }, + "magic-string": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.13" + } + } } }, "undici": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.12.0.tgz", - "integrity": "sha512-zMLamCG62PGjd9HHMpo05bSLvvwWOZgGeiWlN/vlqu3+lRo3elxktVGEyLMX+IO7c2eflLjcW74AlkhEZm15mg==", + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.20.0.tgz", + "integrity": "sha512-J3j60dYzuo6Eevbawwp1sdg16k5Tf768bxYK4TUJRH7cBM4kFCbf3mOnM/0E3vQYXvpxITbbWmBafaDbxLDz3g==", "requires": { "busboy": "^1.6.0" } @@ -17939,14 +19380,14 @@ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" }, "unplugin": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.0.0.tgz", - "integrity": "sha512-H5UnBUxfhTXBXGo2AwKsl0UaLSHzSNDZNehPQSgdhVfO/t+XAS1Yoj3vmLrrlBrS9ZwtH5tejbX/TCp5DcyCKg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.1.0.tgz", + "integrity": "sha512-I8obQ8Rs/hnkxokRV6g8JKOQFgYNnTd9DL58vcSt5IJ9AkK8wbrtsnzD5hi4BJlvcY536JzfEXj9L6h7j559/A==", "requires": { - "acorn": "^8.8.1", + "acorn": "^8.8.2", "chokidar": "^3.5.3", "webpack-sources": "^3.2.3", - "webpack-virtual-modules": "^0.4.6" + "webpack-virtual-modules": "^0.5.0" } }, "unstorage": { @@ -17968,13 +19409,13 @@ } }, "untyped": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/untyped/-/untyped-1.0.0.tgz", - "integrity": "sha512-aBeR3Z51038d7zVzsNShYEdO7u/VCp5R17fxpPXlD2QvG9g6uVJ+JM+zMJ7KFPIt1BNf3I6bU6PhAlsAFkIfdA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/untyped/-/untyped-1.2.2.tgz", + "integrity": "sha512-EANYd5L6AdpgfldlgMcmvOOnj092nWhy0ybhc7uhEH12ipytDYz89EOegBQKj8qWL3u1wgYnmFjADhsuCJs5Aw==", "requires": { - "@babel/core": "^7.20.2", - "@babel/standalone": "^7.20.4", - "@babel/types": "^7.20.2", + "@babel/core": "^7.20.12", + "@babel/standalone": "^7.20.12", + "@babel/types": "^7.20.7", "scule": "^1.0.0" } }, @@ -18006,6 +19447,16 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, + "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==", + "requires": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + } + }, "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", @@ -18143,6 +19594,52 @@ "upath": "^2.0.1" } }, + "vitest": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.29.8.tgz", + "integrity": "sha512-JIAVi2GK5cvA6awGpH0HvH/gEG9PZ0a/WoxdiV3PmqK+3CjQMf8c+J/Vhv4mdZ2nRyXFw66sAg6qz7VNkaHfDQ==", + "requires": { + "@types/chai": "^4.3.4", + "@types/chai-subset": "^1.3.3", + "@types/node": "*", + "@vitest/expect": "0.29.8", + "@vitest/runner": "0.29.8", + "@vitest/spy": "0.29.8", + "@vitest/utils": "0.29.8", + "acorn": "^8.8.1", + "acorn-walk": "^8.2.0", + "cac": "^6.7.14", + "chai": "^4.3.7", + "debug": "^4.3.4", + "local-pkg": "^0.4.2", + "pathe": "^1.1.0", + "picocolors": "^1.0.0", + "source-map": "^0.6.1", + "std-env": "^3.3.1", + "strip-literal": "^1.0.0", + "tinybench": "^2.3.1", + "tinypool": "^0.4.0", + "tinyspy": "^1.0.2", + "vite": "^3.0.0 || ^4.0.0", + "vite-node": "0.29.8", + "why-is-node-running": "^2.2.2" + }, + "dependencies": { + "vite-node": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.29.8.tgz", + "integrity": "sha512-b6OtCXfk65L6SElVM20q5G546yu10/kNrhg08afEoWlFRJXFq9/6glsvSVY+aI6YeC1tu2TtAqI2jHEQmOmsFw==", + "requires": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "mlly": "^1.1.0", + "pathe": "^1.1.0", + "picocolors": "^1.0.0", + "vite": "^3.0.0 || ^4.0.0" + } + } + } + }, "vscode-jsonrpc": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz", @@ -18354,9 +19851,9 @@ "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==" }, "webpack-virtual-modules": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.4.6.tgz", - "integrity": "sha512-5tyDlKLqPfMqjT3Q9TAqf2YqjwmnUleZwzJi1A5qXnlBCdj2AtOJ6wAWdglTIDOPgOiOrXeBeFcsQ8+aGQ6QbA==" + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz", + "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==" }, "whatwg-url": { "version": "5.0.0", @@ -18388,6 +19885,15 @@ "is-symbol": "^1.0.3" } }, + "why-is-node-running": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", + "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", + "requires": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + } + }, "wide-align": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", @@ -18480,9 +19986,9 @@ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" }, "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "yaml": { "version": "1.10.2", @@ -18547,8 +20053,7 @@ "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==", - "devOptional": true + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" }, "zip-stream": { "version": "4.1.0", diff --git a/frontend/package.json b/frontend/package.json index 8828cf21..4e577095 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,22 +1,25 @@ { "private": true, "scripts": { + "coverage":"vitest run --coverage", "build": "nuxt build", "dev": "nuxt dev", "generate": "nuxt generate", "preview": "nuxt preview", "postinstall": "nuxt prepare", - "lint": "eslint '**/*'", + "lint": "eslint '**/*' --max-warnings 0", "lint:fix": "eslint . --fix", "typecheck": "nuxt typecheck" }, "dependencies": { + "@vitest/coverage-c8": "^0.29.2", "@vueuse/core": "^9.6.0", "@vueuse/nuxt": "^9.6.0", "axios": "^1.1.3", "qs": "^6.11.0", "sass": "^1.56.1", "vite-plugin-vuetify": "^1.0.0", + "vitest": "^0.29.2", "vue-i18n": "^9.2.2", "vue-matomo": "^4.2.0", "vuetify": "^3.0.1" @@ -26,6 +29,7 @@ "@intlify/unplugin-vue-i18n": "^0.8.0", "@mdi/font": "^7.0.96", "@nuxtjs/eslint-config-typescript": "^12.0.0", + "@nuxtjs/i18n": "^8.0.0-beta.10", "@types/qs": "^6.9.7", "eslint": "^8.28.0", "eslint-config-prettier": "^8.5.0", diff --git a/frontend/pages/algoritme/[lars].vue b/frontend/pages/algoritme/[lars].vue new file mode 100644 index 00000000..3b985e7c --- /dev/null +++ b/frontend/pages/algoritme/[lars].vue @@ -0,0 +1,131 @@ + + + diff --git a/frontend/pages/algoritme/[slug].vue b/frontend/pages/algoritme/[slug].vue deleted file mode 100644 index 05af872d..00000000 --- a/frontend/pages/algoritme/[slug].vue +++ /dev/null @@ -1,120 +0,0 @@ - - - diff --git a/frontend/pages/algoritme/index.vue b/frontend/pages/algoritme/index.vue index ddf50361..3be7060e 100644 --- a/frontend/pages/algoritme/index.vue +++ b/frontend/pages/algoritme/index.vue @@ -1,17 +1,20 @@ diff --git a/frontend-beheer/src/components/FormSideBlock.vue b/frontend-beheer/src/components/FormSideBlock.vue index 255a6c85..870167c1 100644 --- a/frontend-beheer/src/components/FormSideBlock.vue +++ b/frontend-beheer/src/components/FormSideBlock.vue @@ -8,7 +8,7 @@ @@ -216,7 +218,7 @@ const handlePreview = async (lars?: string) => { dataStore.resetFeedback() const response = await handleSubmit(lars) if (response.status == 200) { - dataStore.handlePreview( + await dataStore.handlePreview( lars ? lars : (response.data as { lars_code: string }).lars_code ) } @@ -247,11 +249,11 @@ const handlePublish = async (lars?: string) => { const response = await handleSubmit(lars) if (response.status == 200) { if (!isReleased.value) { - dataStore.handleRelease( + await dataStore.handleRelease( lars ? lars : (response.data as { lars_code: string }).lars_code ) } - dataStore.handlePublish( + await dataStore.handlePublish( lars ? lars : (response.data as { lars_code: string }).lars_code ) } diff --git a/frontend-beheer/src/components/layout/AppHeader.vue b/frontend-beheer/src/components/layout/AppHeader.vue index 820687f1..3e1ee466 100644 --- a/frontend-beheer/src/components/layout/AppHeader.vue +++ b/frontend-beheer/src/components/layout/AppHeader.vue @@ -1,20 +1,24 @@ diff --git a/frontend-beheer/src/config/organization.ts b/frontend-beheer/src/config/organization.ts new file mode 100644 index 00000000..2e94f260 --- /dev/null +++ b/frontend-beheer/src/config/organization.ts @@ -0,0 +1,26 @@ +export interface OrganizationNames { + [key: string]: string +} + +// Only needs to be appended by names that don't fit the default string matching: +// this-is-an-id become This Is An Id. +export const organizationNames: OrganizationNames = { + 'provincie-noord-brabant': 'Provincie Noord-Brabant', + 'provincie-noord-holland': 'Provincie Noord-Holland', + 'provincie-zuid-holland': 'Provincie Zuid-Holland', + 'ministerie-fin': 'Ministerie van Financiën', + 'ministerie-ezk': 'Ministerie van Economische Zaken en Klimaat', + 'ministerie-az': 'Ministerie van Algemene Zaken', + 'ministerie-bzk': 'Ministerie van Binnenlandse Zaken en Koninkrijksrelaties', + 'ministerie-bz': 'Ministerie van Buitenlandse Zaken', + 'ministerie-def': 'Ministerie van Defensie', + 'ministerie-ienw': 'Ministerie van Infrastructuur en Waterstaat', + 'ministerie-jenv': 'Ministerie van Justitie en Veiligheid', + 'ministerie-lnw': 'Ministerie van Landbouw, Natuur en Voedselkwaliteit', + 'ministerie-ocw': 'Ministerie van Onderwijs, Cultuur en Wetenschap', + 'ministerie-szw': 'Ministerie van Sociale Zaken en Werkgelegenheid', + 'ministerie-vws': 'Ministerie van Volksgezondheid, Welzijn en Sport', + 'justitiele-informatiedienst': 'Justitiële Informatiedienst', + rvig: 'Rijksdienst voor Identiteitsgegevens', + 'directie-financieel-economische-zaken': 'Directie Financieel-Economische Zaken', +} diff --git a/frontend-beheer/src/content.json b/frontend-beheer/src/content.json index c7634347..254c5ce8 100644 --- a/frontend-beheer/src/content.json +++ b/frontend-beheer/src/content.json @@ -44,6 +44,7 @@ }, "release": { "error": "Er is iets fout gegaan bij het vrijgeven van het algoritme.", + "noReleaseOnPublished": "Dit algoritme kan niet worden vrijgegeven. Deze fout kan voorkomen als een gepubliceerd en ongewijzigd algoritme word vrijgegeven.", "success": "Het algoritme is succesvol vrijgegeven." }, "preview": { diff --git a/frontend-beheer/src/main.ts b/frontend-beheer/src/main.ts index 03946783..393e6ed0 100644 --- a/frontend-beheer/src/main.ts +++ b/frontend-beheer/src/main.ts @@ -20,10 +20,12 @@ if (process.env.NODE_ENV === 'production') { export function getConfigs(): Promise { // fetch configurations via backend return new Promise((resolve) => { - axios.get(keycloakConfigUrl, { timeout: 2000 }) + axios + .get(keycloakConfigUrl, { timeout: 2000 }) .then((response: any) => { resolve(response.data) - }).catch(function (err: any) { + }) + .catch(function (err: any) { console.log('failed to get config ' + err) }) }) @@ -31,7 +33,6 @@ export function getConfigs(): Promise { // ----------------------------------------------- Create App ----------------------------------------------- - getConfigs().then((response: any) => { const initOptions: any = { url: `${response.keycloak_uri}`, @@ -40,50 +41,61 @@ getConfigs().then((response: any) => { onLoad: 'login-required', // onLoad: 'check-sso' } - console.log('initializing keycloak at') - console.log(initOptions) + // console.log('initializing keycloak at') + // console.log(initOptions) const keycloak = new Keycloak(initOptions) - keycloak.init({ onLoad: initOptions.onLoad }).then((auth) => { - if (!auth) { - console.log('not yet Authenticated.') - } else { - console.log('Authenticated') - } + keycloak + .init({ onLoad: initOptions.onLoad }) + .then((auth) => { + // if (!auth) { + // console.log('not yet Authenticated.') + // } else { + // console.log('Authenticated') + // } - // always add the authentication header to axios requests - axios.interceptors.request.use(function (config: any) { - const token = keycloak!.idToken as string - config.baseURL = APIurl - config.headers!.Authorization = `Bearer ${token}` - return config - }) + // always add the authentication header to axios requests + axios.interceptors.request.use(function (config: any) { + const token = keycloak!.idToken as string + config.baseURL = APIurl + config.headers!.Authorization = `Bearer ${token}` + return config + }) - const app = createApp(App) - registerPlugins(app) - // store keycloak object in pinia - const authStore = useAuthStore() - authStore.keycloak = keycloak - authStore.APIurl = APIurl - authStore.fetchOrganizations() - app.mount('#app') + const app = createApp(App) + registerPlugins(app) + // store keycloak object in pinia + const authStore = useAuthStore() + authStore.keycloak = keycloak + authStore.APIurl = APIurl + authStore.fetchOrganizations() + app.mount('#app') - //check token every 6 seconds - setInterval(() => { - keycloak.updateToken(70).then((refreshed) => { - if (refreshed) { - console.log('Token refreshed' + refreshed) - } else { - console.log('Token not refreshed, valid for ' - + Math.round(keycloak.tokenParsed!.exp! + keycloak.timeSkew! - new Date().getTime() / 1000) + ' seconds') - } - }).catch(() => { - console.error('Failed to refresh token') - }) - }, 6000) - - }).catch((error) => { - console.log(error) - }) + //check token every 6 seconds + setInterval(() => { + keycloak.updateToken(70) + // .then((refreshed) => { + // if (refreshed) { + // console.log('Token refreshed' + refreshed) + // } else { + // console.log( + // 'Token not refreshed, valid for ' + + // Math.round( + // keycloak.tokenParsed!.exp! + + // keycloak.timeSkew! - + // new Date().getTime() / 1000 + // ) + + // ' seconds' + // ) + // } + // }) + // .catch(() => { + // console.error('Failed to refresh token') + // }) + }, 6000) + }) + .catch((error) => { + console.log(error) + }) }) diff --git a/frontend-beheer/src/services/index.ts b/frontend-beheer/src/services/index.ts index ccd63e5b..8bbd78ae 100644 --- a/frontend-beheer/src/services/index.ts +++ b/frontend-beheer/src/services/index.ts @@ -158,3 +158,12 @@ export async function removeAlgorithm( } return backendRequest(request) } + +export async function getExcelFile(organization: Organization) { + const request: AxiosRequestConfig = { + method: 'GET', + responseType: 'blob', + url: `${MDS_VERSION}/organizations/${organization.id}/algorithms/download-excel`, + } + return backendRequest(request) +} diff --git a/frontend-beheer/src/store/auth.ts b/frontend-beheer/src/store/auth.ts index 5179255a..0db0747c 100644 --- a/frontend-beheer/src/store/auth.ts +++ b/frontend-beheer/src/store/auth.ts @@ -2,6 +2,7 @@ import { defineStore } from 'pinia' import Keycloak from 'keycloak-js' import { Organization } from '@/types' +import { OrganizationNames, organizationNames } from '@/config/organization' import { useLocalStorage } from '@vueuse/core' export const useAuthStore = defineStore('auth', { @@ -9,10 +10,7 @@ export const useAuthStore = defineStore('auth', { keycloak: {} as Keycloak, APIurl: 'http://localhost:8000/api', organizations: [] as Organization[], - selectedOrg: useLocalStorage( - 'webform-selected-org', - {} as Organization - ), + selectedOrg: null as Organization | null, }), getters: { canPublish(): boolean { @@ -35,15 +33,14 @@ export const useAuthStore = defineStore('auth', { if (!orgId) { throw new Error('Could not parse Keycloak organization string.') } - let orgName = orgId.replaceAll('-', ' ') - orgName = orgName.replace(/\b\w/g, (l: string) => l.toUpperCase()) - return { id: orgId, name: orgName } + let defaultOrgName = orgId.replaceAll('-', ' ') + // Regex detects first letter of each word. + defaultOrgName = defaultOrgName.replace(/\b\w/g, (l: string) => + l.toUpperCase() + ) + const orgName = organizationNames[orgId as keyof OrganizationNames] + return { id: orgId, name: orgName || defaultOrgName } }) - try { - this.selectOrganization(this.selectedOrg.id) - } catch { - this.selectedOrg = this.organizations[0]! - } }, selectOrganization(orgId: string) { const organization = this.organizations.find((org) => org.id === orgId) @@ -52,6 +49,7 @@ export const useAuthStore = defineStore('auth', { 'Selected organization is not found in organizations array.' ) } + useLocalStorage('webform-selected-org', {}).value = organization! this.selectedOrg = organization! }, }, diff --git a/frontend-beheer/src/store/form-data.ts b/frontend-beheer/src/store/form-data.ts index 7dbc557d..1aad36f3 100644 --- a/frontend-beheer/src/store/form-data.ts +++ b/frontend-beheer/src/store/form-data.ts @@ -22,6 +22,7 @@ import { import content from '@/content.json' import { Organization } from '@/types' import { noOrgSelectedResponse } from '@/util' +import router from '@/router' const authStore = useAuthStore() @@ -29,7 +30,7 @@ export const useFormDataStore = defineStore('form-data', { state: () => ({ schemaStore: useSchemaStore(), data: {} as AlgorithmForm, - loaded: false, + loaded: true, feedback: { success: '', error: '', errorList: [] }, previewLoading: false, unsavedChanges: false, @@ -37,7 +38,11 @@ export const useFormDataStore = defineStore('form-data', { getters: { cleanedData(): AlgorithmForm { return Object.fromEntries( - Object.entries(this.data).filter(([, v]) => v !== '') + Object.entries(this.data).filter(([, v]) => { + if (Array.isArray(v) && v.length == 0) return false + if (v === '') return false + return true + }) ) }, orgFromData(): Organization | undefined { @@ -48,23 +53,35 @@ export const useFormDataStore = defineStore('form-data', { }, actions: { async fetchData(lars: string): Promise { - this.loaded = false + // We do not know which organisation the algorithm belongs to. this.data = {} - await getAlgorithm(authStore.selectedOrg, lars) - .then((response) => { - this.data = response.data - if ( - this.schemaStore.loadedSchema !== response.data.standard_version - ) { - this.schemaStore.fetchSchema(response.data.standard_version) + this.loaded = false + // A good try is to use the current selected org (= sometimes based on localStorage) + try { + this.data = (await getAlgorithm(authStore.selectedOrg!, lars)).data + } catch (error) { + // Loop through all of them. + for (let i = 0; i < authStore.organizations.length; i++) { + try { + this.data = ( + await getAlgorithm(authStore.organizations[i]!, lars) + ).data + break + } catch (error) { + continue } - this.loaded = true - }) - .catch((error) => { - console.error(error.data) - this.feedback.error = content.formDataStore.fetch.error - this.loaded = true - }) + } + } + this.loaded = true + if (Object.keys(this.data).length == 0) { + // Data not available, push to home + router.push({ name: 'algorithm.index' }) + return + } + // No duplicate loading if the schema in local cache is already good. + if (this.schemaStore.loadedSchema !== this.data.standard_version) { + this.schemaStore.fetchSchema(this.data.standard_version) + } }, resetFeedback(): void { this.feedback = { success: '', error: '', errorList: [] } @@ -146,8 +163,13 @@ export const useFormDataStore = defineStore('form-data', { this.data.released = true this.feedback.success = content.formDataStore.release.success }) - .catch(() => { - this.feedback.error = content.formDataStore.release.error + .catch((response) => { + if (response.status == 409) { + this.feedback.error = + content.formDataStore.release.noReleaseOnPublished + } else { + this.feedback.error = content.formDataStore.release.error + } }) }, async handleRemove( diff --git a/frontend-beheer/src/store/overview.ts b/frontend-beheer/src/store/overview.ts index 0e01b1bc..08fb3d22 100644 --- a/frontend-beheer/src/store/overview.ts +++ b/frontend-beheer/src/store/overview.ts @@ -4,11 +4,12 @@ import { Algorithm } from '@/types/algorithm' import { getAlgorithmList } from '@/services' import content from '@/content.json' import { Organization } from '@/types' +import { useAuthStore } from './auth' export const useAlgorithmStore = defineStore('algorithm', { state: () => ({ algorithms: [] as Algorithm[], - loaded: false as boolean, + loaded: true as boolean, error: '', success: '', }), @@ -30,37 +31,41 @@ export const useAlgorithmStore = defineStore('algorithm', { }, }, actions: { - fetchAlgorithms(organization: Organization): void { - if (Object.keys(organization).length !== 0) { - this.loaded = false - this.algorithms = [] - getAlgorithmList(organization) - .then((response) => { - this.algorithms = response.data.map((a) => { - let overviewStatus - if (a.current_version_published) { - overviewStatus = 'Gepubliceerd' - } else if (a.current_version_released && !a.published) { - overviewStatus = 'Vrijgegeven' - } else if (a.published && a.current_version_released) { - overviewStatus = 'Gepubliceerd, nieuwe versie vrijgegeven' - } else if (a.published) { - overviewStatus = 'Gepubliceerd, nieuwe versie in ontwikkeling' - } else { - overviewStatus = 'In ontwikkeling' - } - return { ...a, overviewStatus: overviewStatus } - }) - this.loaded = true - }) - .catch((error) => { - console.error(error.data) - this.error = content.overviewTable.fetchAlgoritms.error - this.loaded = true - }) - } else { + async fetchAlgorithms(organization: Organization): Promise { + this.algorithms = [] + + const authStore = useAuthStore() + // User has no organizations, exit + if (authStore.organizations.length == 0) { + return + } + + this.loaded = false + try { + this.algorithms = (await getAlgorithmList(organization)).data + } catch (error: any) { + console.error(error.data) + this.error = content.overviewTable.fetchAlgoritms.error this.loaded = true + return } + + this.algorithms = this.algorithms.map((a) => { + let overviewStatus + if (a.current_version_published) { + overviewStatus = 'Gepubliceerd' + } else if (a.current_version_released && !a.published) { + overviewStatus = 'Vrijgegeven' + } else if (a.published && a.current_version_released) { + overviewStatus = 'Gepubliceerd, nieuwe versie vrijgegeven' + } else if (a.published) { + overviewStatus = 'Gepubliceerd, nieuwe versie in ontwikkeling' + } else { + overviewStatus = 'In ontwikkeling' + } + return { ...a, overviewStatus: overviewStatus } + }) + this.loaded = true }, }, }) diff --git a/frontend-beheer/src/store/schema.ts b/frontend-beheer/src/store/schema.ts index e4a74937..734b8e3a 100644 --- a/frontend-beheer/src/store/schema.ts +++ b/frontend-beheer/src/store/schema.ts @@ -20,7 +20,7 @@ export const useSchemaStore = defineStore('schema', { state: () => ({ rawSchemas: {} as OpenApiSchemas, loadedSchema: '' as string, - loaded: false as boolean, + loaded: true as boolean, feedback: { success: '', error: '' }, }), getters: { @@ -31,48 +31,62 @@ export const useSchemaStore = defineStore('schema', { ) const formProperties = Object.fromEntries( schemaEntries.map(([k, v]) => { - let allowedValues = undefined - if (v.allOf) { + let allowedItems: string[] | undefined = undefined + let recommendedItems: string[] | undefined = undefined + let type: string | undefined = undefined + if (v.type == 'enum' && v.allOf) { // The enumerations are in their own schema, on the same depth as the main schema. // The $ref is a path string, but only the final bit is needed. const schema: string | undefined = v.allOf[0]?.$ref .split('/') .slice(-1)[0] if (schema) { - allowedValues = self.rawSchemas[schema].enum + allowedItems = self.rawSchemas[schema].enum } + } else if (v.type == 'array' && v.items?.$ref) { + const schema: string | undefined = v.items?.$ref + .split('/') + .slice(-1)[0] + if (schema) { + allowedItems = self.rawSchemas[schema].enum + } + } else if ( + v.type == 'array' && + v.items?.type == 'string' && + v.recommended_items + ) { + recommendedItems = v.recommended_items } const dataStore = useFormDataStore() let fixedValue: string | undefined = undefined if (k == 'organization') { const organizations = authStore.organizations + // absence of ...data.lars means organization can still be chosen. if (!dataStore.data.lars) { if (organizations.length > 1) { - allowedValues = organizations.map((org) => org.name) - v.type = 'enum' + allowedItems = organizations.map((org) => org.name) + type = 'enum' } else if (organizations.length == 1) { fixedValue = organizations[0]!.name dataStore.data.organization = fixedValue - v.type = 'fixed' + type = 'fixed' } } else { - v.type = 'fixed' if ( - organizations.includes( - dataStore.orgFromData || { id: '', name: '' } - ) + dataStore.data.organization === authStore.selectedOrg?.name ) { fixedValue = dataStore.data.organization + type = 'fixed' } else { - fixedValue = authStore.selectedOrg.name - dataStore.data.organization = fixedValue + allowedItems = organizations.map((org) => org.name) + type = 'enum' } } } else if (k == 'standard_version') { // Standard_version cannot be adjusted. - v.type = 'fixed' - fixedValue = allowedValues[0] + type = 'fixed' + fixedValue = allowedItems![0] } const required: boolean = @@ -83,13 +97,14 @@ export const useSchemaStore = defineStore('schema', { let formFieldProperties: FormFieldProperties = { title: v.title, maxLength: v.maxLength, - type: v.type, + type: type || v.type, example: v.example, showAlways: v.show_always, helpText: v.help_text, instructions: v.instructions, required, - allowedValues, + allowedItems, + recommendedItems, fixedValue, placeholder, } @@ -110,19 +125,18 @@ export const useSchemaStore = defineStore('schema', { actions: { async fetchSchema(version: string): Promise { this.loaded = false - await getMetaDataStandard(version) - .then((response) => { - this.rawSchemas = response.data.components.schemas - this.loaded = true - this.loadedSchema = version - }) - .catch((error) => { - console.error(error.data) - this.feedback.error = content.formGenerator.fetchMetadata.error - this.rawSchemas = {} - this.loaded = true - this.loadedSchema = '' - }) + this.rawSchemas = {} + this.loadedSchema = '' + try { + const data = (await getMetaDataStandard(version)).data + this.rawSchemas = data.components.schemas + this.loadedSchema = version + } catch (error) { + console.error(error) + this.feedback.error = content.formGenerator.fetchMetadata.error + } finally { + this.loaded = true + } }, }, }) diff --git a/frontend-beheer/src/types/form.ts b/frontend-beheer/src/types/form.ts index 8324a3fa..6e01bc9c 100644 --- a/frontend-beheer/src/types/form.ts +++ b/frontend-beheer/src/types/form.ts @@ -10,7 +10,8 @@ export interface FormFieldProperties { instructions: string rules?: ((v: any) => boolean | string)[] required: boolean - allowedValues?: string[] + allowedItems?: string[] + recommendedItems?: string[] fixedValue?: string placeholder?: string } @@ -24,10 +25,12 @@ export interface SchemaProperties { maxLength?: number type: string allOf: { $ref: string }[] + items?: { $ref?: string; type?: string } example: string show_always: boolean help_text: string instructions: string + recommended_items?: string[] } export interface OpenApiSchemas { diff --git a/frontend-beheer/src/util/form.ts b/frontend-beheer/src/util/form.ts index 79eb8d43..40a7e2cd 100644 --- a/frontend-beheer/src/util/form.ts +++ b/frontend-beheer/src/util/form.ts @@ -14,10 +14,10 @@ export function buildRulesFromProperties( } } if (field.type == 'enum') { - if (field.allowedValues) { + if (field.allowedItems) { rules.push( (v: string | null) => - (v ? Object.values(field.allowedValues!).includes(v) : true) || + (v ? Object.values(field.allowedItems!).includes(v) : true) || 'Selecteer 1 van de toegestane waardes.' ) } diff --git a/frontend-beheer/src/views/FormGenerator.vue b/frontend-beheer/src/views/FormGenerator.vue index bacbe85a..4f164b6c 100644 --- a/frontend-beheer/src/views/FormGenerator.vue +++ b/frontend-beheer/src/views/FormGenerator.vue @@ -40,7 +40,7 @@ id="generated-form" ref="form" > - + { } }) +// Checks other routing (exit browser, back/forward) const handleBeforeUnload = (event: any) => { event.preventDefault() return (event.returnValue = '') } -// Checks other routing (exit browser, back/forward) const changeWatcher = computed(() => dataStore.unsavedChanges) watch(changeWatcher, () => { if (dataStore.unsavedChanges) { @@ -129,6 +129,7 @@ watch(changeWatcher, () => { .floating-alert { position: sticky; position: -webkit-sticky; /* Safari */ + z-index: 1; left: 50%; top: 10px; } diff --git a/frontend-beheer/src/views/Overview.vue b/frontend-beheer/src/views/Overview.vue index 61b157a5..53f02b1e 100644 --- a/frontend-beheer/src/views/Overview.vue +++ b/frontend-beheer/src/views/Overview.vue @@ -1,35 +1,90 @@ - Er zijn nog geen organisaties aan dit account gekoppeld + Je bent nog niet aan een organisatie gekoppeld. Neem contact op met de + beheerder om rechten tot een organisatie te verkrijgen. - Er zijn nog geen algoritmes toegevoegd aan deze organisatie. + Dit overzicht is nog leeg. Voer een eerste algoritmebeschrijving in. @@ -95,14 +151,17 @@ @@ -149,7 +238,7 @@ watch( } } -#btn-title:first-letter { +.btn-title:first-letter { text-transform: capitalize; } diff --git a/frontend/app.vue b/frontend/app.vue index 4927fefc..360f306e 100644 --- a/frontend/app.vue +++ b/frontend/app.vue @@ -1,9 +1,7 @@ + + diff --git a/frontend/components/MailLink.vue b/frontend/components/MailLink.vue index 9e7ea903..04d19262 100644 --- a/frontend/components/MailLink.vue +++ b/frontend/components/MailLink.vue @@ -1,11 +1,7 @@ diff --git a/frontend/components/ParseUrl.vue b/frontend/components/ParseUrl.vue index 3db0be32..e9f27f21 100644 --- a/frontend/components/ParseUrl.vue +++ b/frontend/components/ParseUrl.vue @@ -21,13 +21,13 @@ const linkify = (inputText: string) => { regex: // eslint-disable-next-line /(\b(https?|ftp):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gim, - template: `$1 ${externalLinkLabel}`, + template: `${externalLinkLabel} $1`, }, mail: { // eslint-disable-next-line regex: /(([a-zA-Z0-9\-\_\.])+@[a-zA-Z\_]+?(\.[a-zA-Z]{2,6})+)/gim, - template: `$1`, - // template: `$1 ${mailLinkLabel}`, + // template: `$1`, + template: `${mailLinkLabel} $1`, }, } @@ -64,9 +64,3 @@ watch(currentLocale, () => { parseTarget() }) - - diff --git a/frontend/components/SearchResultCard.vue b/frontend/components/SearchResultCard.vue index 4ae1cc1c..2689b11a 100644 --- a/frontend/components/SearchResultCard.vue +++ b/frontend/components/SearchResultCard.vue @@ -13,6 +13,7 @@

    {{ algoritme.name }}

    +

    {{ description }}  @@ -25,14 +26,18 @@

    -
    {{ t(`algorithmProperties.${sT}.label`) }}
    +
    + {{ t(`algorithmProperties.${helpTextVersion}.${sT}.label`) }} +
    - {{ algoritme[sT as keyof Algoritme] || t('ontbreekt') }} +
    @@ -50,8 +55,9 @@ diff --git a/frontend/components/dashboard/CountPerType.vue b/frontend/components/dashboard/CountPerType.vue index 5cb0cd9c..62680a18 100644 --- a/frontend/components/dashboard/CountPerType.vue +++ b/frontend/components/dashboard/CountPerType.vue @@ -7,11 +7,21 @@
    - +
    + +
    @@ -72,20 +82,21 @@ const interestingColumns: string[] = [ 'area', 'lang', 'mprd', + 'standard_version', ] const columnApi = await algoritmeService.getColumns() const columns = computed(() => columnApi.data.value + .filter((column: any) => { + return interestingColumns.includes(column.column_name) + }) .map((column: any) => { return { key: column.column_name, - label: t(`algorithmProperties.${column.column_name}.label`), + label: t(`algorithmProperties.default.${column.column_name}.label`), } }) - .filter((column: { key: string; label: string }) => { - return interestingColumns.includes(column.key) - }) ) const countData = @@ -131,6 +142,9 @@ watch(listValue, () => { diff --git a/frontend/pages/footer/contact.vue b/frontend/pages/footer/contact.vue index 0f776bac..1d539ff1 100644 --- a/frontend/pages/footer/contact.vue +++ b/frontend/pages/footer/contact.vue @@ -4,13 +4,13 @@ diff --git a/frontend/pages/footer/over.vue b/frontend/pages/footer/over.vue index 1a284103..c42c2bfa 100644 --- a/frontend/pages/footer/over.vue +++ b/frontend/pages/footer/over.vue @@ -4,13 +4,13 @@ diff --git a/frontend/pages/footer/privacyverklaring.vue b/frontend/pages/footer/privacyverklaring.vue index bf003513..9803f5c3 100644 --- a/frontend/pages/footer/privacyverklaring.vue +++ b/frontend/pages/footer/privacyverklaring.vue @@ -4,15 +4,13 @@ diff --git a/frontend/public/layouts/v0_1_0.json b/frontend/public/layouts/v0_1_0.json index ccbfa897..05cb2c7d 100644 --- a/frontend/public/layouts/v0_1_0.json +++ b/frontend/public/layouts/v0_1_0.json @@ -1,4 +1,14 @@ { + "headerCardGrouping": { + "mainElement": "description_short", + "subElements": [ + "organization", + "department", + "category", + "type", + "status" + ] + }, "tabsGrouping": [ { "key": "algemeneInformatie", diff --git a/frontend/public/layouts/v0_2_3.json b/frontend/public/layouts/v0_2_3.json index ccbfa897..05cb2c7d 100644 --- a/frontend/public/layouts/v0_2_3.json +++ b/frontend/public/layouts/v0_2_3.json @@ -1,4 +1,14 @@ { + "headerCardGrouping": { + "mainElement": "description_short", + "subElements": [ + "organization", + "department", + "category", + "type", + "status" + ] + }, "tabsGrouping": [ { "key": "algemeneInformatie", diff --git a/frontend/public/layouts/v0_3_1.json b/frontend/public/layouts/v0_3_1.json index 8f0578ff..b1dd8192 100644 --- a/frontend/public/layouts/v0_3_1.json +++ b/frontend/public/layouts/v0_3_1.json @@ -1,4 +1,14 @@ { + "headerCardGrouping": { + "mainElement": "description_short", + "subElements": [ + "organization", + "department", + "category", + "type", + "status" + ] + }, "tabsGrouping": [ { "key": "algemeneInformatie", @@ -42,7 +52,6 @@ "area", "lang", "standard_version", - "uuid", "source_id", "revision_date", "tags" diff --git a/frontend/public/layouts/v0_4_0.json b/frontend/public/layouts/v0_4_0.json new file mode 100644 index 00000000..23cb95fc --- /dev/null +++ b/frontend/public/layouts/v0_4_0.json @@ -0,0 +1,52 @@ +{ + "headerCardGrouping": { + "mainElement": "description_short", + "subElements": [ + "organization", + "category", + "type", + "status" + ] + }, + "tabsGrouping": [ + { + "key": "algemeneInformatie", + "rows": [ + "name", + "organization", + "description_short", + "type", + "category", + "status", + "begin_date", + "end_date", + "contact_email", + "website", + "url" + ] + }, + { + "key": "verantwoordGebruik", + "rows": [ + "goal", + "proportionality", + "human_intervention", + "risks", + "lawful_basis", + "lawful_basis_link", + "impacttoetsen", + "iama_description" + ] + }, + { + "key": "technischeWerking", + "rows": [ + "source_data", + "source_data_link", + "methods_and_models", + "provider", + "publiccode" + ] + } + ] +} \ No newline at end of file diff --git a/frontend/public/standards/v0_4_0.json b/frontend/public/standards/v0_4_0.json new file mode 100644 index 00000000..9dbf36aa --- /dev/null +++ b/frontend/public/standards/v0_4_0.json @@ -0,0 +1,294 @@ +{ + "AlgorithmIn": { + "title": "AlgorithmIn", + "type": "object", + "properties": { + "name": { + "title": "Naam", + "maxLength": 100, + "type": "string", + "example": "Automatische Verkeersregeling Ringweg", + "help_text": "De naam die gebruikt wordt om het algoritme aan te duiden", + "instructions": "De algemeen gehanteerde naam van het algoritme.", + "show_always": true + }, + "organization": { + "title": "Organisatie", + "maxLength": 250, + "type": "string", + "example": "Gemeente Noorderhaaks", + "help_text": "De volledige naam van de organisatie waar het algoritme ingezet wordt.", + "instructions": "De volledige naam van de organisatie waar het algoritme ingezet wordt. In het geval van een uitvoeringsorganisatie vallend onder een ministerie: gebruik de naam van de uitvoeringsorganisatie zelf, gevolgd door de afkorting tussen haakjes.", + "show_always": true + }, + "description_short": { + "title": "Korte omschrijving", + "maxLength": 250, + "type": "string", + "example": "Dit algoritme zorgt met sensoren in het wegdek ervoor dat het verkeer zo makkelijk mogelijk doorstroomt.", + "help_text": "Een korte beschrijving van het algoritme.", + "instructions": "Een korte, duidelijke beschrijving van het algoritme en het proces waarin deze gebruikt wordt. Bij voorkeur in één of twee zinnen. Doel van dit veld is om bij het zoeken naar algoritmes een korte omschrijving van het algoritme te geven. Vul dit veld in op B1-taalniveau. ", + "show_always": true + }, + "type": { + "title": "(Zelf)lerend", + "type": "enum", + "allOf": [ + { + "$ref": "#/components/schemas/v0_4_0__EnumType" + } + ], + "example": "Nee", + "help_text": "Is het algoritme zelflerend? In een niet-zelflerend algoritme specificeert de mens de regels die de computer moet volgen. Als het een zelflerend algoritme is, leert de machine over de patronen in de data. ", + "instructions": "Is het algoritme zelflerend? In een niet-zelflerend algoritme specificeert de mens de regels die de computer moet volgen. Als het een zelflerend algoritme is, leert de machine over de patronen in de data. In het geval dat een algoritme deels beiden doet, kies voor dan voor zelflerend. Ten behoeve van de websitefunctionaliteit is het noodzakelijk om geen andere informatie in dit veld op te nemen dan een van de keuzes hierboven.", + "show_always": true + }, + "category": { + "title": "Beleidsterrein", + "type": "array", + "items": { + "$ref": "#/components/schemas/v0_4_0__EnumCategory" + }, + "example": [ + "Verkeer", + "Landbouw" + ], + "help_text": "Het beleidsterrein waarin het algoritme wordt ingezet", + "instructions": "Beleidsterrein(en) waarin het algoritme wordt ingezet.", + "show_always": true + }, + "website": { + "title": "Link naar publiekspagina", + "maxLength": 500, + "type": "string", + "example": "https://gemeentenoorderhaaks/hoe-werkt-een-VRI", + "help_text": "Een URL naar een publiekspagina van de organisatie zelf. Op deze pagina kunt u meer vinden over de inzet van het algoritme binnen de organisatie.", + "instructions": "Een URL naar een publiekspagina over het algoritme van uw organisatie. Op deze pagina kan iemand meer vinden over het proces waarin het algoritme ingezet wordt. Dit is een andere pagina dan de link naar het decentrale register. Begin een URL met https:// ", + "show_always": false + }, + "status": { + "title": "Status", + "type": "enum", + "allOf": [ + { + "$ref": "#/components/schemas/v0_4_0__EnumStatus" + } + ], + "example": "In gebruik", + "help_text": "De status van het algoritme: in ontwikkeling, in gebruik, of buiten gebruik.", + "instructions": "De huidige status van het algoritme: In ontwikkeling, In gebruik, Buiten gebruik. Indien het algoritme zowel in ontwikkeling als in gebruik is, kies voor ‘In gebruik’. Ten behoeve van de websitefunctionaliteit is het noodzakelijk om geen andere informatie in dit veld op te nemen dan een van de keuzes hierboven. Het is niet verplicht algoritmes in ontwikkeling te vermelden in het Algoritmeregister. De mogelijkheid wordt wel geboden voor organisaties die burgers willen betrekken al tijdens de ontwikkelingen van algoritmes. ", + "show_always": true + }, + "begin_date": { + "title": "Begindatum", + "maxLength": 7, + "type": "string", + "example": "2023-01", + "help_text": "Maand waarin het algoritme in gebruik is genomen.", + "instructions": "Maand en jaar waarin het algoritme in gebruik is genomen.", + "show_always": true + }, + "end_date": { + "title": "Einddatum", + "maxLength": 7, + "type": "string", + "example": "2023-05", + "help_text": "Maand waarin het algoritme buiten gebruik is genomen.", + "instructions": "Maand en jaar waarin het algoritme buiten gebruik is genomen. Als het algoritme nog in gebruik is, moet dit veld leegblijven. ", + "show_always": false + }, + "goal": { + "title": "Doel en impact", + "maxLength": 2500, + "type": "string", + "example": "", + "help_text": "Het doel waarvoor het algoritme ontwikkeld is en wat voor impact de inzet heeft op burgers en bedrijven. ", + "instructions": "Het doel waarvoor het algoritme ontwikkeld is en wat voor impact de inzet heeft op burgers en bedrijven. Vul dit veld in op B1-taalniveau. ", + "show_always": true + }, + "proportionality": { + "title": "Afwegingen", + "maxLength": 2500, + "type": "string", + "example": "De voordelen van de inzet van dit algoritme zijn bewezen door het gebruik ervan over de hele wereld. Op plekken waar dit algoritme gebruikt wordt, is de verkeersdoorstroming aanzienlijk beter dan op plekken waar dit niet gedaan wordt. Het alternatief is een standaardvolgorde aanhouden, wat bewezen trager is voor weggebruikers.", + "help_text": "Een afweging van de voor- en nadelen van de inzet van het algoritme en waarom dit redelijk gerechtvaardigd is.", + "instructions": "Een afweging van de voor- en nadelen van de inzet van het algoritme en waarom dit redelijk gerechtvaardigd is. Benoem daarbij ook welke andere alternatieven overwogen zijn. Neem ook de ethische afwegingen mee in het invullen. Voor het invullen van dit veld kan gebruik gemaakt worden van de antwoorden uit het IAMA en de DPIA. Vul dit veld in op B1-taalniveau.", + "show_always": true + }, + "provider": { + "title": "Leverancier", + "maxLength": 200, + "type": "string", + "example": "Haaks softwarebedrijf", + "help_text": "Indien van toepassing, de externe leverancier van het algoritme.", + "instructions": "Naam van de externe leverancier van het algoritme. Als het intern ontwikkeld is, noteer dan ‘Intern ontwikkeld’. Het gaat hierbij bijvoorbeeld niet om het gebruik van open source packages die gebruikt worden in een groter algoritme. Indien u zelf het algoritme hebt ontwikkeld, dient dit veld leeg te blijven. ", + "show_always": true + }, + "lawful_basis": { + "title": "Wettelijke basis", + "maxLength": 2500, + "type": "string", + "example": "", + "help_text": "Een omschrijving van de wettelijke basis voor het proces waarin het algoritme ingezet wordt ", + "instructions": "Een omschrijving van de wettelijke basis voor het proces waarin het algoritme ingezet wordt ", + "show_always": false + }, + "lawful_basis_link": { + "title": "Wettelijke basis", + "maxLength": 200, + "type": "string", + "example": "https://wetten.overheid.nl/BWBR0006622/2023-01-01 ", + "help_text": "Een link naar de wettelijke grondslag(en) voor het proces waarin het algoritme ingezet wordt.", + "instructions": "Een link naar de wettelijke grondslag(en) voor het proces waarin het algoritme ingezet wordt. Bijvoorbeeld: een wet, een verordening of een formeel besluit.", + "show_always": false + }, + "impacttoetsen": { + "title": "Impacttoetsen", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "Impact Assessment Mensenrechten en Algoritmes (IAMA)" + ], + "help_text": "Welke impacttoetsen zijn gebruikt, zoals Data Protection Impact Asssesment (DPIA) of Impact Assessment Mensenrechten en Algoritmes (IAMA)? ", + "instructions": "Naam/namen van uitgevoerde impacttoetsen.", + "recommended_items": [ + "Data Protection Impact Asssesment (DPIA)", + "Impact Assessment Mensenrechten en Algoritmes (IAMA)" + ], + "show_always": true + }, + "iama_description": { + "title": "Link naar Mensenrechtentoets", + "maxLength": 500, + "type": "string", + "example": "DPIA: https://link.com, IAMA: https://link.nl", + "help_text": "Link naar de resultaten van een uitgevoerde impacttoets, zoals een DPIA IAMA. ", + "instructions": "Link naar de resultaten van een impacttoets, indien deze is uitgevoerd en publiek beschikbaar is. Een voorbeeld hiervan is het impact assessment mensenrechten en algoritmes (IAMA) of het data protection impact assessment (DPIA). Formateer het dusdanig dat de naam van de toets gevold wordt door een dubbele punt en de URL. Als er meerdere zijn, kunnen deze gescheiden worden door komma's. Begin een URL met https://", + "show_always": false + }, + "url": { + "title": "Link naar bronregistratie", + "maxLength": 500, + "type": "string", + "example": "https://algoritmes.gemeentenoorderhaaks.nl/", + "help_text": "De URL van de locatie waar dit algoritme eerder al is vastgelegd; in machine leesbaar formaat.", + "instructions": "Als de organisatie zelf ook een algoritmeregister gepubliceerd heeft waarvandaan uiteindelijk de informatie opgehaald wordt, dan kan vanaf hiernaar verwezen worden.", + "show_always": false + }, + "contact_email": { + "title": "Contactgegevens", + "maxLength": 500, + "type": "string", + "example": "algoritmes@gemeentenoorderhaaks.nl", + "help_text": "De contactgegevens voor deze registratie ", + "instructions": "Het e-mailadres voor contact over deze registratie. Dit moet een geldig mailadres zijn waar burgers, media of andere betrokkenen vragen kunnen stellen over het algoritme zelf of over de gevolgen op basis van uitkomsten van het algoritme. Begin een URL met https:// ", + "show_always": true + }, + "lang": { + "title": "Taal", + "maxLength": 3, + "type": "string", + "example": "nld", + "help_text": "De taal waarin deze registratie is ingevoerd.", + "instructions": "De code van de taal van de registratie. Dit veld is aanwezig, omdat het Algoritmeregister meertalig aangeboden kan worden. Op dit moment wordt alleen Nederlands (nld) aangeboden. ", + "show_always": false + }, + "standard_version": { + "title": "Schema", + "type": "enum", + "allOf": [ + { + "$ref": "#/components/schemas/v0_4_0__EnumStandardVersion" + } + ], + "example": "0.4.0", + "help_text": "De versie van de publicatiestandaard waar dit algoritme in is geregistreed.", + "instructions": "De versie van de publicatiestandaard die gehanteerd is voor deze registratie.Op dit moment is dat '0.4.0'.", + "show_always": false + }, + "uuid": { + "title": "Landelijk-ID", + "maxLength": 100, + "type": "string", + "example": "n.v.t.", + "help_text": "De unieke code van dit algoritme in het landelijke register.", + "instructions": "De unieke identificatie van deze registratie in het landelijke Algoritmeregister. Bij het aanleveren van deze registratie wordt er automatisch een UUID gegenereerd door de database van het landelijk Algoritmeregister. Hier dient bij de eerste aanlevering dus niks handmatig ingevuld te worden. Bij het wijzigen van registraties kan naar deze ID verwezen worden om de juiste registratie te vinden. In het geval van een update van een al bestaand en gepubliceerde registratie, moet de ID in de toekomst wel worden ingevuld. ", + "show_always": true + }, + "source_id": { + "title": "Bron-ID", + "maxLength": 100, + "type": "string", + "example": "n.v.t.", + "help_text": "De unieke code van dit algoritme in het register van de eigenaar", + "instructions": "Indien van toepassing, de unieke identificatie voor deze registratie zoals door de eigenaar wordt gehanteerd. Dit is dus de verwijzing naar het algoritme in de interne database of het interne register van uw organisatie.", + "show_always": false + }, + "tags": { + "title": "Tags", + "maxLength": 2500, + "type": "string", + "example": "Verkeer, Mobiliteit, VRI, Infrastructuur, Waddengebied", + "help_text": "Trefwoorden over het algoritme, om de vindbaarheid van een algoritmeregistratie te vergroten.", + "instructions": "Termen gerelateerd aan dit algoritme. Gescheiden door komma's. Dit veld wordt niet weergegeven op de website en kan worden gebruikt om de vindbaarheid van de registratie te verbeteren. Zo kan bijvoorbeeld de naam van het relevante ministerie worden toegevoegd om als uitvoerorganisatie beter vindbaar te zijn met de zoekfunctie.", + "show_always": false + }, + "source_data": { + "title": "Gegevens", + "maxLength": 5000, + "type": "string", + "example": "Sensordata van de verkeersregelinstallaties bij kruispunten op de ringweg van gemeente Noorderhaaks.", + "help_text": "Een overzicht van de gegevens die gebruikt worden door het algoritme en/of in het begin gebruikt zijn bij het maken van het algoritme.", + "instructions": "Een overzicht van de gegevens die gebruikt worden door het algoritme en/of in het begin gebruikt zijn bij het maken van het algoritme.", + "show_always": true + }, + "source_data_link": { + "title": "Link naar gegevensbronnen", + "maxLength": 500, + "type": "string", + "example": "Lijst van links naar aanvullende informatie over de gebruikte gegevensbronnen. Hierbij kan bijvoorbeeld gelinkt worden naar metadata in publieke datacatalogi of naar sensorenregistraties.", + "help_text": "Links naar aanvullende informatie over de gebruikte gegevensbronnen", + "instructions": "Een overzicht van de gegevens die gebruikt worden door het algoritme en/of in het begin gebruikt zijn bij het maken van het algoritme.", + "show_always": false + }, + "methods_and_models": { + "title": "Technische werking", + "maxLength": 5000, + "type": "string", + "example": "Het model maakt gebruik van een eenvoudige beslisboom zodra een nieuwe bezette voorsorteerstrook zich voordoet (= wanneer de sensor een weggebruiker ontdekt). De beslisboom loopt als volgt: Eerst wordt er gekeken of er al andere partijen staan te wachten, en vervolgens of er op dat moment een andere voorsorteerstrook op groen licht staat. Zo niet, dan springt het stoplicht van de betreffende strook meteen op groen. Zo wel, dan wacht het tot er geen verkeer meer wordt waargenomen bij de andere voorsorteerstrook. Als er andere weggebruikers op andere stroken staan te wachten, sluit de betreffende strook achteraan in de wachtrij. Een grafische weergave van dit model is te vinden op https://algoritmes.gemeentenoorderhaaks.nl/VRI", + "help_text": "Uitleg van hoe het algoritme werkt.", + "instructions": "Een technische uitleg van hoe het algoritme werkt en uitkomsten genereert. Indien beschikbaar, komt een URL naar een schematisch overzicht van het model (zoals een stroomdiagram van een beslisboom) goed van pas. Indien complexe machine learning modellen worden gebruikt (zoals Neurale Netwerken), komen URL’s naar extra documentatie of wetenschappelijke publicaties goed van pas. Dit veld is hoofdzakelijk bedoeld voor de lezer met technische expertise, en mag daarom complexere concepten en taal bevatten.", + "show_always": false + }, + "publiccode": { + "title": "Link naar broncode", + "maxLength": 500, + "type": "string", + "example": "https://github.com/haakssoftwarebedrijf.nl/vrisoftware", + "help_text": "Een URL naar de codepagina van de ontwikkelaar. Op deze pagina kunt u meer vinden over de code van het algoritme zelf.", + "instructions": "Een URL naar de codepagina van de ontwikkelaar. Op deze pagina is de code van het algoritme te vinden. Indien er geen codebase publiekelijk beschikbaar is, dient dit veld leeg te blijven. Begin een URL met https://", + "show_always": false + }, + "human_intervention": { + "title": "Menselijke tussenkomst", + "maxLength": 2500, + "type": "string", + "example": "Bij het maken van fouten door het algoritme zou een medewerker van de afdeling handmatig de verkeersregeling aan kunnen passen en stoplichten op groen kunnen zetten. Buiten normale werktijden is er 24/7 toezicht.", + "help_text": "Een omschrijving van hoe uitkomsten van het algoritme door een mens gebruikt worden, en op welke wijze deze gebruikt, gecontroleerd en bijgesteld (kunnen) worden.", + "instructions": "Een omschrijving van hoe uitkomsten van het algoritme door een mens gebruikt worden, en op welke wijze deze gebruikt, gecontroleerd en bijgesteld (kunnen) worden. Vul dit veld in op B1-taalniveau. ", + "show_always": true + }, + "risks": { + "title": "Risicobeheer", + "maxLength": 2500, + "type": "string", + "example": "", + "help_text": "Een overzicht van de voorziene risico's bij de inzet van het algoritme", + "instructions": "Een overzicht van de voorziene risico's bij de inzet van het algoritme", + "show_always": true + } + } + } +} \ No newline at end of file diff --git a/frontend/services/textLoader.ts b/frontend/services/textLoader.ts index fa268dd8..21542585 100644 --- a/frontend/services/textLoader.ts +++ b/frontend/services/textLoader.ts @@ -1,7 +1,7 @@ import { SupportingText } from '@/types/textLoader' -const getAllContent = () => - useFetch(`/supporting-text`, { +const getAllContent = async () => + await useFetch(`/supporting-text`, { baseURL: useRuntimeConfig().public.apiBaseUrl, method: 'GET', }) diff --git a/frontend/types/algoritme.ts b/frontend/types/algoritme.ts index e7348983..00249ba6 100644 --- a/frontend/types/algoritme.ts +++ b/frontend/types/algoritme.ts @@ -4,7 +4,7 @@ export interface Algoritme { lars: string standard_version: string - [key: string]: string + [key: string]: null | string | string[] } type AggregationValue = { @@ -22,3 +22,16 @@ export type AlgoritmeFilter = { attribute: string value: string | string[] } + +export interface AlgorithmFieldDisplay { + key: string + value: string + keyDescription: string + keyLabel: string +} + +export interface AlgorithmDisplay { + key: string + keyLabel: string + properties: AlgorithmFieldDisplay[] +} diff --git a/frontend/types/layout.ts b/frontend/types/layout.ts index 13386751..cdc451b0 100644 --- a/frontend/types/layout.ts +++ b/frontend/types/layout.ts @@ -1,3 +1,8 @@ +export interface headerCardGrouping { + mainElement: string + subElements: string[] +} + export interface tabsGrouping { key: string rows: string[] diff --git a/schema.json b/schema.json index 28bd872e..7912ef62 100644 --- a/schema.json +++ b/schema.json @@ -1,276 +1,333 @@ { - "$id": "https://standaard.algoritmeregister.org/schemas/registration-v0.2.nl.schema.json", "$schema": "https://json-schema.org/draft/2020-12/schema", - "title": "NL Standaard voor Registratie van Algoritmes en AI", + "title": "NL Standaard voor Registratie van Algoritmes en AI, v0.4.0", "description": "Standaard voor de registratie van de inzet van modellen, algoritmes en AI in beleid en besluitvormingsprocessen in Nederlandse overheidsorganisaties.", "type": "object", "properties": { "name": { - "title": "Naam", - "maxLength": 100, "type": "string", + "title": "Naam", + "max_length": 100, + "show_always": true, "help_text": "De naam die gebruikt wordt om het algoritme aan te duiden", - "show_always": true + "instructions": "De algemeen gehanteerde naam van het algoritme.", + "example": "Automatische Verkeersregeling Ringweg", + "required": true }, "organization": { - "title": "Organisatie", - "maxLength": 100, - "type": "string", - "help_text": "De volledige naam van de organisatie verantwoordelijk voor de inzet van het algoritme.", - "show_always": true - }, - "department": { - "title": "Afdeling", - "maxLength": 500, "type": "string", - "help_text": "De volledige naam van de afdeling of divisie verantwoordelijk voor de inzet van het algoritme.", - "show_always": true + "title": "Organisatie", + "max_length": 250, + "show_always": true, + "help_text": "De volledige naam van de organisatie waar het algoritme ingezet wordt.", + "instructions": "De volledige naam van de organisatie waar het algoritme ingezet wordt. In het geval van een uitvoeringsorganisatie vallend onder een ministerie: gebruik de naam van de uitvoeringsorganisatie zelf, gevolgd door de afkorting tussen haakjes.", + "example": "Gemeente Noorderhaaks", + "required": true }, "description_short": { - "title": "Korte omschrijving", - "maxLength": 150, "type": "string", - "help_text": "Een korte, abstracte beschrijving van het algoritme.", - "show_always": true + "title": "Korte omschrijving", + "max_length": 250, + "show_always": true, + "help_text": "Een korte beschrijving van het algoritme.", + "instructions": "Een korte, duidelijke beschrijving van het algoritme en het proces waarin deze gebruikt wordt. Bij voorkeur in één of twee zinnen. Doel van dit veld is om bij het zoeken naar algoritmes een korte omschrijving van het algoritme te geven. Vul dit veld in op B1-taalniveau. ", + "example": "Dit algoritme zorgt met sensoren in het wegdek ervoor dat het verkeer zo makkelijk mogelijk doorstroomt.", + "required": false }, "type": { - "title": "Type algoritme", "type": "enum", - "allOf": [ - "Regelgebaseerd", - "Zelflerend" - ], - "help_text": "Is het algoritme op regels gebaseerd of zelflerend? Regelgebaseerde algoritmes zijn handmatig door mensen gebouwd, meestal op basis van wetten of verordeningen. Zelflerende algoritmes kunnen zelf verbanden ontdekken in gegevens.", - "show_always": true + "title": "(Zelf)lerend", + "show_always": true, + "help_text": "Is het algoritme zelflerend? In een niet-zelflerend algoritme specificeert de mens de regels die de computer moet volgen. Als het een zelflerend algoritme is, leert de machine over de patronen in de data. ", + "instructions": "Is het algoritme zelflerend? In een niet-zelflerend algoritme specificeert de mens de regels die de computer moet volgen. Als het een zelflerend algoritme is, leert de machine over de patronen in de data. In het geval dat een algoritme deels beiden doet, kies voor dan voor zelflerend. Ten behoeve van de websitefunctionaliteit is het noodzakelijk om geen andere informatie in dit veld op te nemen dan een van de keuzes hierboven.", + "example": "Nee", + "required": false, + "permitted_values": [ + "Ja", + "Nee" + ] }, "category": { + "type": "array", "title": "Beleidsterrein", - "maxLength": 500, - "type": "string", - "help_text": "Het beleidsterrein waarin het algoritme wordt ingezet.", - "show_always": true + "show_always": true, + "help_text": "Het beleidsterrein waarin het algoritme wordt ingezet", + "instructions": "Beleidsterrein(en) waarin het algoritme wordt ingezet.", + "example": [ + "Verkeer", + "Landbouw" + ], + "required": false, + "permitted_values": [ + "Bestuur", + "Cultuur en recreatie", + "Economie", + "Financiën", + "Huisvesting", + "Internationaal", + "Landbouw", + "Migratie en integratie", + "Natuur en milieu", + "Onderwijs en wetenschap", + "Openbare orde en veiligheid", + "Recht", + "Ruimte en infrastructuur", + "Sociale zekerheid", + "Verkeer", + "Werk", + "Zorg en gezondheid" + ] }, "website": { - "title": "Link naar publiekspagina", - "maxLength": 500, "type": "string", + "title": "Link naar publiekspagina", + "max_length": 500, + "show_always": false, "help_text": "Een URL naar een publiekspagina van de organisatie zelf. Op deze pagina kunt u meer vinden over de inzet van het algoritme binnen de organisatie.", - "show_always": false + "instructions": "Een URL naar een publiekspagina over het algoritme van uw organisatie. Op deze pagina kan iemand meer vinden over het proces waarin het algoritme ingezet wordt. Dit is een andere pagina dan de link naar het decentrale register. Begin een URL met https:// ", + "example": "https://gemeentenoorderhaaks/hoe-werkt-een-VRI", + "required": false }, "status": { - "title": "Status", "type": "enum", - "allOf": [ + "title": "Status", + "show_always": true, + "help_text": "De status van het algoritme: in ontwikkeling, in gebruik, of buiten gebruik.", + "instructions": "De huidige status van het algoritme: In ontwikkeling, In gebruik, Buiten gebruik. Indien het algoritme zowel in ontwikkeling als in gebruik is, kies voor ‘In gebruik’. Ten behoeve van de websitefunctionaliteit is het noodzakelijk om geen andere informatie in dit veld op te nemen dan een van de keuzes hierboven. Het is niet verplicht algoritmes in ontwikkeling te vermelden in het Algoritmeregister. De mogelijkheid wordt wel geboden voor organisaties die burgers willen betrekken al tijdens de ontwikkelingen van algoritmes. ", + "example": "In gebruik", + "required": false, + "permitted_values": [ "In ontwikkeling", "In gebruik", "Buiten gebruik" - ], - "help_text": "De status van het algoritme: in ontwikkeling, in gebruik, of buiten gebruik.", - "show_always": true + ] }, - "goal": { - "title": "Doel", - "maxLength": 2500, + "begin_date": { "type": "string", - "help_text": "Het doel waarvoor het algoritme ontwikkeld is en/of hoe de inzet ervan bijdraagt aan het behalen van die doelen.", - "show_always": true + "title": "Begindatum", + "max_length": 7, + "show_always": true, + "help_text": "Maand waarin het algoritme in gebruik is genomen.", + "instructions": "Maand en jaar waarin het algoritme in gebruik is genomen.", + "example": "2023-01", + "required": false + }, + "end_date": { + "type": "string", + "title": "Einddatum", + "max_length": 7, + "show_always": false, + "help_text": "Maand waarin het algoritme buiten gebruik is genomen.", + "instructions": "Maand en jaar waarin het algoritme buiten gebruik is genomen. Als het algoritme nog in gebruik is, moet dit veld leegblijven. ", + "example": "2023-05", + "required": false }, - "impact": { - "title": "Impact", - "maxLength": 2500, + "goal": { "type": "string", - "help_text": "De impact van het algoritme op burgers en bedrijven. Bijvoorbeeld: hoe werkt het algoritme en wat zijn de verwachte consequenties daarvan voor het individu of bedrijf?", - "show_always": true + "title": "Doel en impact", + "max_length": 2500, + "show_always": true, + "help_text": "Het doel waarvoor het algoritme ontwikkeld is en wat voor impact de inzet heeft op burgers en bedrijven. ", + "instructions": "Het doel waarvoor het algoritme ontwikkeld is en wat voor impact de inzet heeft op burgers en bedrijven. Vul dit veld in op B1-taalniveau. ", + "example": "", + "required": false }, "proportionality": { - "title": "Proportionaliteit", - "maxLength": 2500, "type": "string", + "title": "Afwegingen", + "max_length": 2500, + "show_always": true, "help_text": "Een afweging van de voor- en nadelen van de inzet van het algoritme en waarom dit redelijk gerechtvaardigd is.", - "show_always": true + "instructions": "Een afweging van de voor- en nadelen van de inzet van het algoritme en waarom dit redelijk gerechtvaardigd is. Benoem daarbij ook welke andere alternatieven overwogen zijn. Neem ook de ethische afwegingen mee in het invullen. Voor het invullen van dit veld kan gebruik gemaakt worden van de antwoorden uit het IAMA en de DPIA. Vul dit veld in op B1-taalniveau.", + "example": "De voordelen van de inzet van dit algoritme zijn bewezen door het gebruik ervan over de hele wereld. Op plekken waar dit algoritme gebruikt wordt, is de verkeersdoorstroming aanzienlijk beter dan op plekken waar dit niet gedaan wordt. Het alternatief is een standaardvolgorde aanhouden, wat bewezen trager is voor weggebruikers.", + "required": false }, "provider": { - "title": "Leverancier", - "maxLength": 100, "type": "string", + "title": "Leverancier", + "max_length": 200, + "show_always": false, "help_text": "Indien van toepassing, de externe leverancier van het algoritme.", - "show_always": false - }, - "application_url": { - "title": "Link naar leverancier", - "maxLength": 500, - "type": "string", - "help_text": "Indien van toepassing, de link naar de externe leverancier.", - "show_always": false - }, - "process_index_url": { - "title": "Link naar verwerkingsregister", - "maxLength": 500, - "type": "string", - "help_text": "De link naar de AVG-verwerking in een publiek register van het algoritme.", - "show_always": false + "instructions": "Naam van de externe leverancier van het algoritme. Als het intern ontwikkeld is, noteer dan ‘Intern ontwikkeld’. Het gaat hierbij bijvoorbeeld niet om het gebruik van open source packages die gebruikt worden in een groter algoritme. Indien u zelf het algoritme hebt ontwikkeld, dient dit veld leeg te blijven. ", + "example": "Haaks softwarebedrijf", + "required": false }, "lawful_basis": { - "title": "Wettelijke grondslag", - "maxLength": 2500, "type": "string", - "help_text": "Een omschrijving of een link naar de wettelijke grondslag voor de inzet van het algoritme. Bijvoorbeeld: een wet, een verordening of een formeel besluit.", - "show_always": true - }, - "iama": { - "title": "Mensenrechtentoets", - "type": "enum", - "allOf": [ - "Ja", - "Nee" - ], - "help_text": "Is het algoritme getoetst op het nakomen van mensenrechten zoals middels een Impact Assessment Mensenrechten en Algoritmes (IAMA)?", - "show_always": true - }, - "iama_description": { - "title": "Link naar Mensenrechtentoets", - "maxLength": 500, + "title": "Wettelijke basis", + "max_length": 2500, + "show_always": false, + "help_text": "Een omschrijving van de wettelijke basis voor het proces waarin het algoritme ingezet wordt ", + "instructions": "Een omschrijving van de wettelijke basis voor het proces waarin het algoritme ingezet wordt ", + "example": "", + "required": false + }, + "lawful_basis_link": { "type": "string", - "help_text": "Link naar de resultaten van een uitgevoerde mensenrechtentoets, zoals een IAMA.", - "show_always": true - }, - "dpia": { - "title": "Data Protection Impact Assessment (DPIA)", - "type": "enum", - "allOf": [ - "Ja", - "Nee" + "title": "Link naar wettelijke basis", + "max_length": 200, + "show_always": false, + "help_text": "Een link naar de wettelijke grondslag(en) voor het proces waarin het algoritme ingezet wordt.", + "instructions": "Een link naar de wettelijke grondslag(en) voor het proces waarin het algoritme ingezet wordt. Bijvoorbeeld: een wet, een verordening of een formeel besluit.", + "example": "https://wetten.overheid.nl/BWBR0006622/2023-01-01 ", + "required": false + }, + "impacttoetsen": { + "type": "array", + "title": "Impacttoetsen", + "show_always": true, + "help_text": "Welke impacttoetsen zijn gebruikt, zoals Data Protection Impact Asssesment (DPIA) of Impact Assessment Mensenrechten en Algoritmes (IAMA)? ", + "instructions": "Naam/namen van uitgevoerde impacttoetsen.", + "example": [ + "Impact Assessment Mensenrechten en Algoritmes (IAMA)" ], - "help_text": "Is het algoritme getoetst op veilig gebruik van gegevens met een Data Protection Impact Assessment (DPIA).", - "show_always": false + "required": false, + "recommended_items": [ + "Data Protection Impact Asssesment (DPIA)", + "Impact Assessment Mensenrechten en Algoritmes (IAMA)" + ] }, - "objection_procedure": { - "title": "Bezwaarprocedure", - "maxLength": 2500, + "iama_description": { "type": "string", - "help_text": "Een omschrijving van hoe burgers en bedrijven bezwaar kunnen maken tegen de uitkomsten van het algoritme.", - "show_always": true + "title": "Link naar Mensenrechtentoets", + "max_length": 500, + "show_always": false, + "help_text": "Link naar de resultaten van een uitgevoerde impacttoets, zoals een DPIA IAMA.", + "instructions": "Link naar de resultaten van een impacttoets, indien deze is uitgevoerd en publiek beschikbaar is. Een voorbeeld hiervan is het impact assessment mensenrechten en algoritmes (IAMA) of het data protection impact assessment (DPIA). Formateer het dusdanig dat de naam van de toets gevold wordt door een dubbele punt en de URL. Als er meerdere zijn, kunnen deze gescheiden worden door komma's. Begin een URL met https://", + "example": "DPIA: https://link.com, IAMA: https://link.nl", + "required": false }, "url": { - "title": "Link naar bronregistratie", - "maxLength": 500, "type": "string", + "title": "Link naar bronregistratie", + "max_length": 500, + "show_always": false, "help_text": "De URL van de locatie waar dit algoritme eerder al is vastgelegd; in machine leesbaar formaat.", - "show_always": false + "instructions": "Als de organisatie zelf ook een algoritmeregister gepubliceerd heeft waarvandaan uiteindelijk de informatie opgehaald wordt, dan kan vanaf hiernaar verwezen worden.", + "example": "https://algoritmes.gemeentenoorderhaaks.nl/", + "required": false }, "contact_email": { - "title": "E-mailadres van de contactpersoon", - "maxLength": 500, "type": "string", - "help_text": "De e-mail voor contact over deze registratie.", - "show_always": true - }, - "area": { - "title": "Geografisch gebied", - "maxLength": 100, - "type": "string", - "help_text": "Het geografische gebied waarin het algoritme wordt ingezet.", - "show_always": false + "title": "Contactgegevens", + "max_length": 500, + "show_always": true, + "help_text": "De contactgegevens voor deze registratie ", + "instructions": "Het e-mailadres voor contact over deze registratie. Dit moet een geldig mailadres zijn waar burgers, media of andere betrokkenen vragen kunnen stellen over het algoritme zelf of over de gevolgen op basis van uitkomsten van het algoritme. Begin een URL met https:// ", + "example": "algoritmes@gemeentenoorderhaaks.nl", + "required": false }, "lang": { - "title": "Taal", - "maxLength": 3, "type": "string", + "title": "Taal", + "max_length": 3, + "show_always": false, "help_text": "De taal waarin deze registratie is ingevoerd.", - "show_always": false + "instructions": "De code van de taal van de registratie. Dit veld is aanwezig, omdat het Algoritmeregister meertalig aangeboden kan worden. Op dit moment wordt alleen Nederlands (nld) aangeboden. ", + "example": "nld", + "required": false }, "standard_version": { - "title": "Schema", "type": "enum", - "allOf": [ - "0.3.1" - ], + "title": "Versie publicatiestandaard", + "show_always": false, "help_text": "De versie van de publicatiestandaard waar dit algoritme in is geregistreed.", - "show_always": false + "instructions": "De versie van de publicatiestandaard die gehanteerd is voor deze registratie.Op dit moment is dat '0.4.0'.", + "example": "0.4.0", + "required": false, + "permitted_values": [ + "0.4.0" + ] }, "uuid": { - "title": "UUID", - "maxLength": 100, "type": "string", + "title": "Landelijk-ID", + "max_length": 100, + "show_always": false, "help_text": "De unieke code van dit algoritme in het landelijke register.", - "show_always": true + "instructions": "De unieke identificatie van deze registratie in het landelijke Algoritmeregister. Bij het aanleveren van deze registratie wordt er automatisch een UUID gegenereerd door de database van het landelijk Algoritmeregister. Hier dient bij de eerste aanlevering dus niks handmatig ingevuld te worden. Bij het wijzigen van registraties kan naar deze ID verwezen worden om de juiste registratie te vinden. In het geval van een update van een al bestaand en gepubliceerde registratie, moet de ID in de toekomst wel worden ingevuld. ", + "example": "n.v.t.", + "required": false }, "source_id": { - "title": "Bron-ID", - "maxLength": 100, "type": "string", + "title": "Bron-ID", + "max_length": 100, + "show_always": false, "help_text": "De unieke code van dit algoritme in het register van de eigenaar", - "show_always": false - }, - "revision_date": { - "title": "Herzieningsdatum", - "maxLength": 10, - "type": "string", - "help_text": "De datum waarvoor deze registratie moet worden herzien.", - "show_always": false + "instructions": "Indien van toepassing, de unieke identificatie voor deze registratie zoals door de eigenaar wordt gehanteerd. Dit is dus de verwijzing naar het algoritme in de interne database of het interne register van uw organisatie.", + "example": "n.v.t.", + "required": false }, "tags": { - "title": "Tags", - "maxLength": 2500, "type": "string", + "title": "Zoektermen", + "max_length": 2500, + "show_always": false, "help_text": "Trefwoorden over het algoritme, om de vindbaarheid van een algoritmeregistratie te vergroten.", - "show_always": false - }, - "description": { - "title": "Omschrijving", - "maxLength": 2500, - "type": "string", - "help_text": "Een uitgebreide beschrijving van het algoritme (500-5000 tekens).", - "show_always": false + "instructions": "Termen gerelateerd aan dit algoritme. Gescheiden door komma's. Dit veld wordt niet weergegeven op de website en kan worden gebruikt om de vindbaarheid van de registratie te verbeteren. Zo kan bijvoorbeeld de naam van het relevante ministerie worden toegevoegd om als uitvoerorganisatie beter vindbaar te zijn met de zoekfunctie.", + "example": "Verkeer, Mobiliteit, VRI, Infrastructuur, Waddengebied", + "required": false }, "source_data": { - "title": "Databronnen", - "maxLength": 5000, "type": "string", - "help_text": "Een overzicht van de databronnen die op dit moment gebruikt worden door het algoritme en/of in het begin gebruikt zijn bij het maken van het algoritme", - "show_always": false + "title": "Gegevens", + "max_length": 5000, + "show_always": true, + "help_text": "Een overzicht van de gegevens die gebruikt worden door het algoritme en/of in het begin gebruikt zijn bij het maken van het algoritme.", + "instructions": "Een overzicht van de gegevens die gebruikt worden door het algoritme en/of in het begin gebruikt zijn bij het maken van het algoritme.", + "example": "Sensordata van de verkeersregelinstallaties bij kruispunten op de ringweg van gemeente Noorderhaaks.", + "required": false + }, + "source_data_link": { + "type": "string", + "title": "Link naar gegevensbronnen", + "max_length": 500, + "show_always": false, + "help_text": "Links naar aanvullende informatie over de gebruikte gegevensbronnen", + "instructions": "Een overzicht van de gegevens die gebruikt worden door het algoritme en/of in het begin gebruikt zijn bij het maken van het algoritme.", + "example": "Lijst van links naar aanvullende informatie over de gebruikte gegevensbronnen. Hierbij kan bijvoorbeeld gelinkt worden naar metadata in publieke datacatalogi of naar sensorenregistraties.", + "required": false }, "methods_and_models": { - "title": "Methoden en modellen", - "maxLength": 5000, "type": "string", - "help_text": "Standaardmethoden of modellen die het algoritme gebruikt.", - "show_always": false + "title": "Technische werking", + "max_length": 5000, + "show_always": false, + "help_text": "Uitleg van hoe het algoritme werkt.", + "instructions": "Een technische uitleg van hoe het algoritme werkt en uitkomsten genereert. Indien beschikbaar, komt een URL naar een schematisch overzicht van het model (zoals een stroomdiagram van een beslisboom) goed van pas. Indien complexe machine learning modellen worden gebruikt (zoals Neurale Netwerken), komen URL’s naar extra documentatie of wetenschappelijke publicaties goed van pas. Dit veld is hoofdzakelijk bedoeld voor de lezer met technische expertise, en mag daarom complexere concepten en taal bevatten.", + "example": "Het model maakt gebruik van een eenvoudige beslisboom zodra een nieuwe bezette voorsorteerstrook zich voordoet (= wanneer de sensor een weggebruiker ontdekt). De beslisboom loopt als volgt: Eerst wordt er gekeken of er al andere partijen staan te wachten, en vervolgens of er op dat moment een andere voorsorteerstrook op groen licht staat. Zo niet, dan springt het stoplicht van de betreffende strook meteen op groen. Zo wel, dan wacht het tot er geen verkeer meer wordt waargenomen bij de andere voorsorteerstrook. Als er andere weggebruikers op andere stroken staan te wachten, sluit de betreffende strook achteraan in de wachtrij. Een grafische weergave van dit model is te vinden op https://algoritmes.gemeentenoorderhaaks.nl/VRI", + "required": false }, "publiccode": { - "title": "Link naar broncode", - "maxLength": 500, "type": "string", + "title": "Link naar broncode", + "max_length": 500, + "show_always": false, "help_text": "Een URL naar de codepagina van de ontwikkelaar. Op deze pagina kunt u meer vinden over de code van het algoritme zelf.", - "show_always": false - }, - "monitoring": { - "title": "Monitoring", - "maxLength": 2500, - "type": "string", - "help_text": "Een overzicht van hoe de inzet van het algoritme wordt gemonitord.", - "show_always": false + "instructions": "Een URL naar de codepagina van de ontwikkelaar. Op deze pagina is de code van het algoritme te vinden. Indien er geen codebase publiekelijk beschikbaar is, dient dit veld leeg te blijven. Begin een URL met https://", + "example": "https://github.com/haakssoftwarebedrijf.nl/vrisoftware", + "required": false }, "human_intervention": { - "title": "Menselijke tussenkomst", - "maxLength": 2500, "type": "string", - "help_text": "Een omschrijving van hoe uitkomsten van het algoritme door een mens gecontroleerd en bijgesteld (kunnen) worden.", - "show_always": true + "title": "Menselijke tussenkomst", + "max_length": 2500, + "show_always": true, + "help_text": "Een omschrijving van hoe uitkomsten van het algoritme door een mens gebruikt worden, en op welke wijze deze gebruikt, gecontroleerd en bijgesteld (kunnen) worden.", + "instructions": "Een omschrijving van hoe uitkomsten van het algoritme door een mens gebruikt worden, en op welke wijze deze gebruikt, gecontroleerd en bijgesteld (kunnen) worden. Vul dit veld in op B1-taalniveau. ", + "example": "Bij het maken van fouten door het algoritme zou een medewerker van de afdeling handmatig de verkeersregeling aan kunnen passen en stoplichten op groen kunnen zetten. Buiten normale werktijden is er 24/7 toezicht.", + "required": false }, "risks": { - "title": "Risico's", - "maxLength": 2500, "type": "string", + "title": "Risicobeheer", + "max_length": 2500, + "show_always": true, "help_text": "Een overzicht van de voorziene risico's bij de inzet van het algoritme", - "show_always": false - }, - "performance_standard": { - "title": "Prestatienormen", - "maxLength": 2500, - "type": "string", - "help_text": "Een omschrijving van de verwachte prestaties van het algoritme en hoe die worden gemeten.", - "show_always": false + "instructions": "Een overzicht van de voorziene risico's bij de inzet van het algoritme", + "example": "", + "required": false } } } \ No newline at end of file From fca0ce44a42ee51e79997d20c4285f89fcdb17d7 Mon Sep 17 00:00:00 2001 From: "a.mahes" Date: Thu, 14 Dec 2023 10:45:08 +0100 Subject: [PATCH 5/6] Update release to v1.0.0 --- .gitignore | 8 +- README.md | 2 +- algoritmeregister.code-workspace | 10 +- backend/.coveragerc | 7 +- backend/.env.dummy | 23 +- backend/.vscode/launch.json | 17 - backend/.vscode/settings.json | 7 +- backend/Dockerfile | 56 +- backend/alembic/env.py | 1 - .../scripts/create_vectorized_column.sql | 45 + .../alembic/scripts/create_words_table.sql | 17 + .../scripts/downgrade_vector_1_0_0.sql | 36 + ...execute_full_text_search_configuration.sql | 38 + .../scripts/remove_vectorized_column.sql | 5 + .../alembic/scripts/remove_words_table.sql | 3 + .../alembic/scripts/upgrade_vector_1_0_0.sql | 38 + .../0a0ff83803b0_add_action_history_table.py | 2 +- .../2929cd63a048_add_organisation_table.py | 52 + ..._execute_full_text_search_configuration.py | 25 + .../412c46f50f27_add_organisation_type.py | 35 + .../42e58f22ba71_migrate_data_to_org_table.py | 146 + ...fb_vectorised_algoritme_version_columns.py | 25 + ...1c092_words_table_for_algoritme_version.py | 26 + .../c6bff8b8c900_add_language_dependency.py | 34 + ...1bd490e48_remove_default_value_language.py | 26 + .../alembic/versions/f3c9f5768daf_1_0_0.py | 46 + backend/app/api.py | 11 +- backend/app/config/layouts/types.py | 17 + backend/app/config/layouts/v0_1_0.json | 85 + backend/app/config/layouts/v0_2_3.json | 85 + backend/app/config/layouts/v0_3_1.json | 85 + backend/app/config/layouts/v0_4_0.json | 55 + backend/app/config/layouts/v1_0_0.json | 65 + backend/app/config/settings.py | 29 +- backend/app/controllers/__init__.py | 9 +- backend/app/controllers/action_history.py | 18 - backend/app/controllers/algoritme.py | 21 + .../controllers/algoritme_version/__init__.py | 8 +- .../algoritme_version/endpoints.py | 442 +- .../app/controllers/algoritme_version/util.py | 179 +- backend/app/controllers/c3po.py | 131 + backend/app/controllers/excel_download.py | 160 +- backend/app/controllers/mailing.py | 99 +- backend/app/controllers/organization.py | 79 + backend/app/controllers/pdf_download.py | 169 + .../app/controllers/pdf_wrapper/__init__.py | 4 + backend/app/controllers/pdf_wrapper/canvas.py | 102 + backend/app/controllers/pdf_wrapper/pdf.py | 57 + .../controllers/pdf_wrapper/style_config.py | 41 + backend/app/controllers/pdf_wrapper/types.py | 35 + backend/app/controllers/smart_search.py | 115 + backend/app/controllers/templates.py | 56 + backend/app/controllers/word_download.py | 217 + backend/app/data/default/supporting_text.json | 394 + backend/app/data/preditor/pvc_mounts_here.txt | 1 + backend/app/data/templates/0.4.0/Centric.json | 44 + .../app/data/templates/0.4.0/PinkRoccade.json | 37 + backend/app/data/templates/0.4.0/Procura.json | 35 + .../app/data/text_loader/supporting_text.json | 46 - backend/app/database/database.py | 3 +- .../app/etl/config/excel_column_mapping.py | 39 - backend/app/etl/config/main.py | 50 - backend/app/etl/data/pub_data.json | 6892 ----- backend/app/etl/load.py | 20 - backend/app/etl/resources/loader.py | 111 - backend/app/mailing/mailing.py | 2 +- backend/app/main.py | 68 +- backend/app/middleware/decorators/auth.py | 18 +- backend/app/models/__init__.py | 4 +- backend/app/models/action_history.py | 32 +- backend/app/models/algoritme.py | 20 +- backend/app/models/algoritme_version.py | 148 +- backend/app/models/organisation.py | 24 + backend/app/models/words.py | 9 + backend/app/repositories/__init__.py | 4 + backend/app/repositories/action_history.py | 22 + backend/app/repositories/algoritme.py | 44 + backend/app/repositories/algoritme_version.py | 295 + backend/app/repositories/index.py | 32 + backend/app/repositories/organisation.py | 98 + backend/app/routers/__init__.py | 7 +- backend/app/routers/algoritme.py | 18 + backend/app/routers/c3po.py | 31 + backend/app/routers/default.py | 232 - backend/app/routers/downloads.py | 51 + backend/app/routers/organization.py | 36 + backend/app/routers/public/__init__.py | 1 + .../app/routers/{ => public}/aggregations.py | 76 +- backend/app/routers/public/default.py | 232 + backend/app/routers/public/downloads.py | 39 + .../app/routers/{ => public}/text_loader.py | 20 +- backend/app/routers/templates.py | 35 + backend/app/routers/v0_1_0/algoritme.py | 50 +- backend/app/routers/v0_2_3/algoritme.py | 50 +- backend/app/routers/v0_3_1/algoritme.py | 50 +- backend/app/routers/v0_4_0/algoritme.py | 50 +- backend/app/routers/v1_0_0/__init__.py | 1 + backend/app/routers/v1_0_0/algoritme.py | 238 + backend/app/schemas/__init__.py | 10 +- backend/app/schemas/action_history.py | 17 + backend/app/schemas/algoritme.py | 15 + backend/app/schemas/algoritme_version.py | 175 +- backend/app/schemas/c3po/reponse_in.py | 44 + backend/app/schemas/c3po/request_in.py | 6 + backend/app/schemas/c3po/request_out.py | 6 + backend/app/schemas/c3po/response_out.py | 24 + backend/app/schemas/config/types.py | 21 + backend/app/schemas/config/v0_2_3.json | 6 +- backend/app/schemas/config/v0_4_0.json | 112 +- backend/app/schemas/config/v1_0_0.json | 455 + backend/app/schemas/misc.py | 61 +- backend/app/schemas/organization.py | 27 + backend/app/schemas/templates.py | 11 + backend/app/schemas/util.py | 28 +- backend/app/schemas/versions.py | 165 +- backend/app/services/__init__.py | 0 .../algoritme_version_service.py | 96 +- backend/app/services/translation/__init__.py | 5 + .../services/translation/auto_translator.py | 20 + .../services/translation/base_translator.py | 100 + .../services/translation/cloud_translators.py | 103 + .../translation/default_values_translator.py | 22 + .../translation/list_values_translator.py | 36 + .../app/services/translation/preprocessor.py | 136 + .../translation/translation_spec.json | 116 + backend/app/util/config_load.py | 43 + backend/app/util/html.py | 39 + backend/app/util/stringify.py | 25 + backend/app/util/upc.py | 2 +- backend/base_image/Dockerfile | 32 + backend/base_image/README.md | 14 + backend/docker-compose.yml | 67 +- backend/misc/parse-css.ipynb | 18 +- backend/poetry.lock | 2666 +- backend/pyproject.toml | 19 +- backend/pytest.ini | 4 - backend/scripts/add_org_type.py | 97 + backend/scripts/translate_existing.py | 59 + backend/tests/conftest.py | 1 - backend/tests/samples/test_db.py | 18 - docker-compose.yml | 10 - etl/.flake8 | 2 + etl/.python-version | 1 + etl/Dockerfile | 51 + etl/app/config/config.py | 55 + etl/app/database/__init__.py | 1 + etl/app/database/config.py | 9 + etl/app/main.py | 34 + etl/app/report/logger.py | 30 + etl/app/services/__init__.py | 3 + etl/app/services/extractor.py | 14 + etl/app/services/loader.py | 40 + etl/app/services/transformer.py | 67 + etl/app/static/index.html | 78 + etl/base_image/Dockerfile | 25 + etl/base_image/README.md | 11 + etl/base_image/requirements.txt | 32 + etl/common/database_url.py | 15 + etl/poetry.lock | 831 + etl/pyproject.toml | 23 + etl/start.sh | 4 + frontend-beheer/.env | 2 - frontend-beheer/.env.dummy | 2 - frontend-beheer/.gitignore | 1 + frontend-beheer/Dockerfile | 1 + frontend-beheer/nginx/nginx.conf | 2 +- frontend-beheer/package-lock.json | 2731 +- frontend-beheer/package.json | 7 +- frontend-beheer/src/App.vue | 21 +- frontend-beheer/src/app-config.ts | 6 - frontend-beheer/src/assets/styles/main.scss | 5 + .../src/components/DownloadDropdown.vue | 221 + .../src/components/ExternalLink.vue | 7 +- frontend-beheer/src/components/FormField.vue | 244 - .../src/components/FormFieldInput.vue | 139 + .../src/components/FormFieldWrapper.vue | 189 + frontend-beheer/src/components/FormHeader.vue | 13 - .../src/components/FormSideBlock.vue | 60 +- .../src/components/ListWithLinksField.vue | 129 + .../src/components/OrganisationDialog.vue | 103 + .../QualityInspector/ScoreDisplay.vue | 21 + .../QualityInspector/ScoreSummaryBlock.vue | 43 + .../src/components/QualityInspector/index.vue | 28 + .../src/components/RuleInterface.vue | 189 + .../src/components/RuleListing.vue | 25 + .../src/components/TemplatesDialog.vue | 146 + .../src/components/editor/EditorFeedback.vue | 42 + .../src/components/editor/EditorField.vue | 143 + .../src/components/editor/EditorToolbar.vue | 17 + .../src/components/layout/AppHeader.vue | 10 +- .../src/components/layout/Breadcrumb.vue | 2 +- frontend-beheer/src/config/organization.ts | 26 - .../src/config/publication-standard.ts | 4 + frontend-beheer/src/config/score.ts | 194 + frontend-beheer/src/editor.d.ts | 13 + frontend-beheer/src/main.ts | 38 +- frontend-beheer/src/plugins/index.ts | 3 + frontend-beheer/src/plugins/vuetify.ts | 1 - frontend-beheer/src/services/algorithms.ts | 144 + frontend-beheer/src/services/c3po.ts | 26 + frontend-beheer/src/services/downloads.ts | 30 + frontend-beheer/src/services/index.ts | 144 +- frontend-beheer/src/services/organisation.ts | 39 + frontend-beheer/src/services/templates.ts | 24 + frontend-beheer/src/store/auth.ts | 54 +- frontend-beheer/src/store/form-data.ts | 54 +- frontend-beheer/src/store/overview.ts | 16 +- frontend-beheer/src/store/schema.ts | 194 +- frontend-beheer/src/store/score.ts | 41 + frontend-beheer/src/types/algorithm.ts | 9 +- frontend-beheer/src/types/c3po.ts | 37 + frontend-beheer/src/types/form.ts | 46 +- frontend-beheer/src/types/index.ts | 9 +- frontend-beheer/src/types/openapi.ts | 93 + frontend-beheer/src/types/organisation.ts | 43 + frontend-beheer/src/types/templates.ts | 19 + frontend-beheer/src/util/form.ts | 37 - frontend-beheer/src/utils/editor.ts | 69 + frontend-beheer/src/utils/form.ts | 68 + frontend-beheer/src/{util => utils}/index.ts | 0 frontend-beheer/src/views/FormGenerator.vue | 130 +- frontend-beheer/src/views/Overview.vue | 257 +- frontend/.env.dummy | 4 +- frontend/.eslintignore | 4 +- frontend/Dockerfile | 21 +- frontend/Dockerfile.simple | 9 - .../assets/images/icons/icon-globe-dark.svg | 1 + frontend/assets/images/icons/icon-globe.svg | 1 + .../icon-language-picker-chevron-dark.svg | 1 + .../icons/icon-language-picker-chevron.svg | 1 + frontend/assets/images/over-algoritmes.jpeg | Bin 0 -> 85848 bytes frontend/assets/styles/main.scss | 6 + frontend/components/HeaderCard.vue | 93 + frontend/components/HighlightedAlgorithms.vue | 54 - frontend/components/HomePageText.vue | 45 - frontend/components/LanguageDisclaimer.vue | 85 + frontend/components/LanguagePicker.vue | 138 +- frontend/components/ListifyString.vue | 73 +- frontend/components/SearchBar.vue | 136 +- frontend/components/SearchResultCard.vue | 213 +- .../components/algoritme/AlgoritmeFilters.vue | 192 - frontend/components/algoritme/AppTable.vue | 2 +- .../components/dashboard/CountPerType.vue | 31 +- .../components/dashboard/DataCompleteness.vue | 50 +- frontend/components/faq/FaqAccordionRow.vue | 76 + frontend/components/faq/FaqAccordionRows.vue | 15 + frontend/components/faq/FaqAccordions.vue | 39 + frontend/components/filter/FilterBlock.vue | 105 + frontend/components/filter/FilterGroup.vue | 142 + frontend/components/filter/OrgTypeButton.vue | 61 + .../components/filter/OrgTypeSelector.vue | 48 + frontend/components/form/OverheidButton.vue | 21 +- .../frontpage/HighlightedAlgorithms.vue | 71 + frontend/components/frontpage/InfoBlock.vue | 29 + frontend/components/views/AppBreadcrumb.vue | 24 +- frontend/components/views/AppFooter.vue | 24 +- frontend/components/views/AppHeader.vue | 26 +- frontend/composables/useLocale.ts | 4 +- frontend/composables/useTextLoader.ts | 12 +- frontend/config/config.ts | 17 + frontend/config/footer.ts | 20 +- frontend/i18n.config.ts | 10 + frontend/layouts/default.vue | 13 +- frontend/locales/en.json | 171 +- frontend/locales/nl.json | 171 +- frontend/nuxt.config.ts | 64 +- frontend/package-lock.json | 24582 +++++++++------- frontend/package.json | 44 +- frontend/pages/algoritme/[lars].vue | 75 +- frontend/pages/algoritme/index.vue | 146 +- frontend/pages/dashboard.vue | 7 +- frontend/pages/footer/contact.vue | 2 +- frontend/pages/footer/meedoen.vue | 16 + frontend/pages/footer/over-algoritmes.vue | 26 + frontend/pages/footer/over.vue | 2 +- frontend/pages/footer/privacyverklaring.vue | 5 +- frontend/pages/footer/toegankelijkheid.vue | 5 +- frontend/pages/footer/versie-informatie.vue | 22 + frontend/pages/footer/vragen.vue | 58 +- frontend/pages/footer/webarchief.vue | 19 + frontend/pages/index.vue | 95 +- frontend/public/layouts/v0_1_0.json | 146 +- frontend/public/layouts/v0_2_3.json | 146 +- frontend/public/layouts/v0_3_1.json | 147 +- frontend/public/layouts/v0_4_0.json | 99 +- frontend/public/layouts/v1_0_0.json | 60 + frontend/public/standards/v0_4_0.json | 18 +- frontend/public/standards/v1_0_0.json | 459 + frontend/server/api/_sitemap-urls.ts | 17 + frontend/services/algoritme.ts | 76 +- frontend/types/algoritme.ts | 33 +- frontend/types/apiStandard.ts | 1 + frontend/types/filter.ts | 20 + frontend/types/footer.ts | 14 + frontend/types/layout.ts | 5 + frontend/types/organisation.ts | 23 + frontend/utils/index.ts | 10 +- notebooks/Performance test.ipynb | 48 - schema.json | 423 +- 299 files changed, 29822 insertions(+), 24831 deletions(-) delete mode 100644 backend/.vscode/launch.json create mode 100644 backend/alembic/scripts/create_vectorized_column.sql create mode 100644 backend/alembic/scripts/create_words_table.sql create mode 100644 backend/alembic/scripts/downgrade_vector_1_0_0.sql create mode 100644 backend/alembic/scripts/execute_full_text_search_configuration.sql create mode 100644 backend/alembic/scripts/remove_vectorized_column.sql create mode 100644 backend/alembic/scripts/remove_words_table.sql create mode 100644 backend/alembic/scripts/upgrade_vector_1_0_0.sql create mode 100644 backend/alembic/versions/2929cd63a048_add_organisation_table.py create mode 100644 backend/alembic/versions/3de4ce027fe0_execute_full_text_search_configuration.py create mode 100644 backend/alembic/versions/412c46f50f27_add_organisation_type.py create mode 100644 backend/alembic/versions/42e58f22ba71_migrate_data_to_org_table.py create mode 100644 backend/alembic/versions/94bf47cb75fb_vectorised_algoritme_version_columns.py create mode 100644 backend/alembic/versions/b5ce4561c092_words_table_for_algoritme_version.py create mode 100644 backend/alembic/versions/c6bff8b8c900_add_language_dependency.py create mode 100644 backend/alembic/versions/d621bd490e48_remove_default_value_language.py create mode 100644 backend/alembic/versions/f3c9f5768daf_1_0_0.py create mode 100644 backend/app/config/layouts/types.py create mode 100644 backend/app/config/layouts/v0_1_0.json create mode 100644 backend/app/config/layouts/v0_2_3.json create mode 100644 backend/app/config/layouts/v0_3_1.json create mode 100644 backend/app/config/layouts/v0_4_0.json create mode 100644 backend/app/config/layouts/v1_0_0.json delete mode 100644 backend/app/controllers/action_history.py create mode 100644 backend/app/controllers/algoritme.py create mode 100644 backend/app/controllers/c3po.py create mode 100644 backend/app/controllers/organization.py create mode 100644 backend/app/controllers/pdf_download.py create mode 100644 backend/app/controllers/pdf_wrapper/__init__.py create mode 100644 backend/app/controllers/pdf_wrapper/canvas.py create mode 100644 backend/app/controllers/pdf_wrapper/pdf.py create mode 100644 backend/app/controllers/pdf_wrapper/style_config.py create mode 100644 backend/app/controllers/pdf_wrapper/types.py create mode 100644 backend/app/controllers/smart_search.py create mode 100644 backend/app/controllers/templates.py create mode 100644 backend/app/controllers/word_download.py create mode 100644 backend/app/data/default/supporting_text.json create mode 100644 backend/app/data/preditor/pvc_mounts_here.txt create mode 100644 backend/app/data/templates/0.4.0/Centric.json create mode 100644 backend/app/data/templates/0.4.0/PinkRoccade.json create mode 100644 backend/app/data/templates/0.4.0/Procura.json delete mode 100644 backend/app/data/text_loader/supporting_text.json delete mode 100644 backend/app/etl/config/excel_column_mapping.py delete mode 100644 backend/app/etl/config/main.py delete mode 100644 backend/app/etl/data/pub_data.json delete mode 100644 backend/app/etl/load.py delete mode 100644 backend/app/etl/resources/loader.py create mode 100644 backend/app/models/organisation.py create mode 100644 backend/app/models/words.py create mode 100644 backend/app/repositories/__init__.py create mode 100644 backend/app/repositories/action_history.py create mode 100644 backend/app/repositories/algoritme.py create mode 100644 backend/app/repositories/algoritme_version.py create mode 100644 backend/app/repositories/index.py create mode 100644 backend/app/repositories/organisation.py create mode 100644 backend/app/routers/algoritme.py create mode 100644 backend/app/routers/c3po.py delete mode 100644 backend/app/routers/default.py create mode 100644 backend/app/routers/downloads.py create mode 100644 backend/app/routers/organization.py create mode 100644 backend/app/routers/public/__init__.py rename backend/app/routers/{ => public}/aggregations.py (54%) create mode 100644 backend/app/routers/public/default.py create mode 100644 backend/app/routers/public/downloads.py rename backend/app/routers/{ => public}/text_loader.py (63%) create mode 100644 backend/app/routers/templates.py create mode 100644 backend/app/routers/v1_0_0/__init__.py create mode 100644 backend/app/routers/v1_0_0/algoritme.py create mode 100644 backend/app/schemas/action_history.py create mode 100644 backend/app/schemas/algoritme.py create mode 100644 backend/app/schemas/c3po/reponse_in.py create mode 100644 backend/app/schemas/c3po/request_in.py create mode 100644 backend/app/schemas/c3po/request_out.py create mode 100644 backend/app/schemas/c3po/response_out.py create mode 100644 backend/app/schemas/config/types.py create mode 100644 backend/app/schemas/config/v1_0_0.json create mode 100644 backend/app/schemas/organization.py create mode 100644 backend/app/schemas/templates.py create mode 100644 backend/app/services/__init__.py create mode 100644 backend/app/services/translation/__init__.py create mode 100644 backend/app/services/translation/auto_translator.py create mode 100644 backend/app/services/translation/base_translator.py create mode 100644 backend/app/services/translation/cloud_translators.py create mode 100644 backend/app/services/translation/default_values_translator.py create mode 100644 backend/app/services/translation/list_values_translator.py create mode 100644 backend/app/services/translation/preprocessor.py create mode 100644 backend/app/services/translation/translation_spec.json create mode 100644 backend/app/util/config_load.py create mode 100644 backend/app/util/html.py create mode 100644 backend/app/util/stringify.py create mode 100644 backend/base_image/Dockerfile create mode 100644 backend/base_image/README.md delete mode 100644 backend/pytest.ini create mode 100644 backend/scripts/add_org_type.py create mode 100644 backend/scripts/translate_existing.py delete mode 100644 backend/tests/conftest.py delete mode 100644 backend/tests/samples/test_db.py delete mode 100644 docker-compose.yml create mode 100644 etl/.flake8 create mode 100644 etl/.python-version create mode 100644 etl/Dockerfile create mode 100644 etl/app/config/config.py create mode 100644 etl/app/database/__init__.py create mode 100644 etl/app/database/config.py create mode 100644 etl/app/main.py create mode 100644 etl/app/report/logger.py create mode 100644 etl/app/services/__init__.py create mode 100644 etl/app/services/extractor.py create mode 100644 etl/app/services/loader.py create mode 100644 etl/app/services/transformer.py create mode 100644 etl/app/static/index.html create mode 100644 etl/base_image/Dockerfile create mode 100644 etl/base_image/README.md create mode 100644 etl/base_image/requirements.txt create mode 100644 etl/common/database_url.py create mode 100644 etl/poetry.lock create mode 100644 etl/pyproject.toml create mode 100644 etl/start.sh delete mode 100644 frontend-beheer/.env delete mode 100644 frontend-beheer/.env.dummy delete mode 100644 frontend-beheer/src/app-config.ts create mode 100644 frontend-beheer/src/components/DownloadDropdown.vue delete mode 100644 frontend-beheer/src/components/FormField.vue create mode 100644 frontend-beheer/src/components/FormFieldInput.vue create mode 100644 frontend-beheer/src/components/FormFieldWrapper.vue delete mode 100644 frontend-beheer/src/components/FormHeader.vue create mode 100644 frontend-beheer/src/components/ListWithLinksField.vue create mode 100644 frontend-beheer/src/components/OrganisationDialog.vue create mode 100644 frontend-beheer/src/components/QualityInspector/ScoreDisplay.vue create mode 100644 frontend-beheer/src/components/QualityInspector/ScoreSummaryBlock.vue create mode 100644 frontend-beheer/src/components/QualityInspector/index.vue create mode 100644 frontend-beheer/src/components/RuleInterface.vue create mode 100644 frontend-beheer/src/components/RuleListing.vue create mode 100644 frontend-beheer/src/components/TemplatesDialog.vue create mode 100644 frontend-beheer/src/components/editor/EditorFeedback.vue create mode 100644 frontend-beheer/src/components/editor/EditorField.vue create mode 100644 frontend-beheer/src/components/editor/EditorToolbar.vue delete mode 100644 frontend-beheer/src/config/organization.ts create mode 100644 frontend-beheer/src/config/publication-standard.ts create mode 100644 frontend-beheer/src/config/score.ts create mode 100644 frontend-beheer/src/editor.d.ts create mode 100644 frontend-beheer/src/services/algorithms.ts create mode 100644 frontend-beheer/src/services/c3po.ts create mode 100644 frontend-beheer/src/services/downloads.ts create mode 100644 frontend-beheer/src/services/organisation.ts create mode 100644 frontend-beheer/src/services/templates.ts create mode 100644 frontend-beheer/src/store/score.ts create mode 100644 frontend-beheer/src/types/c3po.ts create mode 100644 frontend-beheer/src/types/openapi.ts create mode 100644 frontend-beheer/src/types/organisation.ts create mode 100644 frontend-beheer/src/types/templates.ts delete mode 100644 frontend-beheer/src/util/form.ts create mode 100644 frontend-beheer/src/utils/editor.ts create mode 100644 frontend-beheer/src/utils/form.ts rename frontend-beheer/src/{util => utils}/index.ts (100%) delete mode 100644 frontend/Dockerfile.simple create mode 100644 frontend/assets/images/icons/icon-globe-dark.svg create mode 100644 frontend/assets/images/icons/icon-globe.svg create mode 100644 frontend/assets/images/icons/icon-language-picker-chevron-dark.svg create mode 100644 frontend/assets/images/icons/icon-language-picker-chevron.svg create mode 100644 frontend/assets/images/over-algoritmes.jpeg create mode 100644 frontend/components/HeaderCard.vue delete mode 100644 frontend/components/HighlightedAlgorithms.vue delete mode 100644 frontend/components/HomePageText.vue create mode 100644 frontend/components/LanguageDisclaimer.vue delete mode 100644 frontend/components/algoritme/AlgoritmeFilters.vue create mode 100644 frontend/components/faq/FaqAccordionRow.vue create mode 100644 frontend/components/faq/FaqAccordionRows.vue create mode 100644 frontend/components/faq/FaqAccordions.vue create mode 100644 frontend/components/filter/FilterBlock.vue create mode 100644 frontend/components/filter/FilterGroup.vue create mode 100644 frontend/components/filter/OrgTypeButton.vue create mode 100644 frontend/components/filter/OrgTypeSelector.vue create mode 100644 frontend/components/frontpage/HighlightedAlgorithms.vue create mode 100644 frontend/components/frontpage/InfoBlock.vue create mode 100644 frontend/i18n.config.ts create mode 100644 frontend/pages/footer/meedoen.vue create mode 100644 frontend/pages/footer/over-algoritmes.vue create mode 100644 frontend/pages/footer/versie-informatie.vue create mode 100644 frontend/pages/footer/webarchief.vue create mode 100644 frontend/public/layouts/v1_0_0.json create mode 100644 frontend/public/standards/v1_0_0.json create mode 100644 frontend/server/api/_sitemap-urls.ts create mode 100644 frontend/types/filter.ts create mode 100644 frontend/types/organisation.ts delete mode 100644 notebooks/Performance test.ipynb diff --git a/.gitignore b/.gitignore index f7d2b1d2..6796a1c2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,10 @@ backend/*venv +etl/*venv __pycache__/ .idea backend/.env frontend/.env +etl/.env *.pyc .vscode node_modules @@ -12,4 +14,8 @@ node_modules .cache .output dist -.coverage \ No newline at end of file +.coverage +backend/.DS_Store +.DS_Store +**/*secrets.txt +**/*secret*.json diff --git a/README.md b/README.md index b6015bda..ee27a3f2 100644 --- a/README.md +++ b/README.md @@ -83,7 +83,7 @@ This register allows use of multiple versions of the metadatastandard. To add a 2. in `/backend/app/routers`, duplicate one of the version folders. Rename it the same as your version in step 1, e.g. `v0_x_x`. Do not change the content. 3. add the name of this file in the \_\_init\_\_.py file in the same folder, e.g. `from . import v0_1_0, v0_x_x # noqa`. 4. If your new schema involves changes to the database (notably for new columns) you'll have to do a SQLAlchemy model change (in `/backend/app/models/algoritme_version.py`) as well as a database migration. -5. The frontend needs a configuration file in `/frontend/public/layouts` named similar to the other files, e.g. `v0_x_x.json`. The configuration file defines how the data should be displayed in the tabs. +5. The frontend needs a configuration file in `backend/app/config/layouts` named similar to the other files, e.g. `v0_x_x.json`. The configuration file defines how the data should be displayed in the tabs. ### Icons diff --git a/algoritmeregister.code-workspace b/algoritmeregister.code-workspace index 39e87b9c..cc04e154 100644 --- a/algoritmeregister.code-workspace +++ b/algoritmeregister.code-workspace @@ -11,15 +11,19 @@ }, { "path": "frontend-beheer" + }, + { + "path": "etl" } ], "settings": { "python.linting.flake8Enabled": true, "python.linting.enabled": true, - "editor.defaultFormatter": "rvest.vs-code-prettier-eslint", - "editor.formatOnPaste": false, // required + // "editor.defaultFormatter": "rvest.vs-code-prettier-eslint", // frontend-beheer + "editor.defaultFormatter": "esbenp.prettier-vscode", // frontend + "editor.formatOnPaste": false, // required "editor.formatOnType": false, // required - "editor.formatOnSave": true, // optional + "editor.formatOnSave": true, // optional "editor.formatOnSaveMode": "file", // required to format on save "files.autoSave": "onFocusChange", // optional but recommended "vs-code-prettier-eslint.prettierLast": false, // set as "true" to run 'prettier' last not first diff --git a/backend/.coveragerc b/backend/.coveragerc index de49dd17..acf6164f 100644 --- a/backend/.coveragerc +++ b/backend/.coveragerc @@ -3,10 +3,15 @@ branch=True source = app omit = */__init__.py + **/models/** + **/schemas/config/** + **/schemas/algoritme_version.py + **/schemas/misc.py + **/schemas/text_loader.py [report] -include_namespace_packages = False exclude_lines = import from logger logging + if __name__ == .__main__.: diff --git a/backend/.env.dummy b/backend/.env.dummy index 3184fdf9..b4dc0b4d 100644 --- a/backend/.env.dummy +++ b/backend/.env.dummy @@ -1,8 +1,19 @@ -POSTGRES_SERVER=127.0.0.1 +C3PO_URL=http://localhost:8004/api + +PREVIEW_URL=http://localhost:3001 + +POSTGRES_SERVER=localhost POSTGRES_PORT=5432 -POSTGRES_USER= -POSTGRES_PASSWORD= -POSTGRES_DB= -DEV_DOCKER_CONTAINER_NAME_PREFIX=Algoritme_register +POSTGRES_DB=algreg_db +POSTGRES_DB_NAME=algreg_db + +BACKEND_PORT=8000 +ETL_PORT=8001 +DBGATE_PORT=8002 -TYPE=DEV +ENABLE_TRANSLATION=True +OPENAI_API_KEY=secret +AZURE_TRANSLATE_ENDPOINT=https://api.cognitive.microsofttranslator.com/translate +AZURE_TRANSLATE_API_KEY=secret +AZURE_TRANSLATE_REGION=westeurope +DEEPL_API_KEY=secret diff --git a/backend/.vscode/launch.json b/backend/.vscode/launch.json deleted file mode 100644 index f9abe25b..00000000 --- a/backend/.vscode/launch.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "name": "Python: FastAPI", - "type": "python", - "request": "launch", - "module": "uvicorn", - "args": ["app.main:app"], - "jinja": true, - "justMyCode": true - } - ] -} diff --git a/backend/.vscode/settings.json b/backend/.vscode/settings.json index ba8c3b28..9b388533 100644 --- a/backend/.vscode/settings.json +++ b/backend/.vscode/settings.json @@ -1,4 +1,7 @@ { - "python.formatting.provider": "black", - "python.analysis.typeCheckingMode": "basic", + "python.testing.pytestArgs": [ + "tests" + ], + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true } \ No newline at end of file diff --git a/backend/Dockerfile b/backend/Dockerfile index ed42f083..dedf5073 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -1,50 +1,38 @@ -FROM harbor.cicd.s15m.nl/ictu-devops-pub/algreg_base as buildstep - -ENV YOUR_ENV=${YOUR_ENV} \ - PYTHONFAULTHANDLER=1 \ - PYTHONUNBUFFERED=1 \ - PYTHONHASHSEED=random \ - PIP_NO_CACHE_DIR=off \ - PIP_DISABLE_PIP_VERSION_CHECK=on \ - PIP_DEFAULT_TIMEOUT=100 \ - POETRY_VERSION=1.2.2 - -RUN apt-get update && \ - apt-get -y install sudo - -# #TODO -# RUN apt-get -y purge libpython3.9* python3.9* -# RUN apt-get install --upgrade libtasn1-6 linux-libc-dev -# #TODO +# Replace this base image with the correct python image. +# See ./base_image for more info. +FROM harbor-gn2.cicd.s15m.nl/ictu-devops-pub/algreg_base AS buildstep + +# Make sure these are set, either here or in the base image. +ENV YOUR_ENV=${YOUR_ENV} +# ENV PYTHONFAULTHANDLER=1 \ +# PYTHONUNBUFFERED=1 \ +# PYTHONHASHSEED=random \ +# PIP_NO_CACHE_DIR=off \ +# PIP_DISABLE_PIP_VERSION_CHECK=on \ +# PIP_DEFAULT_TIMEOUT=100 \ +# POETRY_VERSION=1.2.2 + +RUN mkdir -p /mnt/credentials +WORKDIR /backend ADD /backend/app /backend/app ADD /backend/alembic /backend/alembic ADD /backend/common /backend/common +ADD /backend/scripts /backend/scripts COPY /backend/alembic.ini /backend/alembic.ini COPY /backend/poetry.lock /backend/poetry.lock COPY /backend/pyproject.toml /backend/pyproject.toml COPY /backend/start.sh /backend/start.sh -WORKDIR /backend - -# RUN sudo apt-get -y install gcc g++ && \ -# pip install "poetry==$POETRY_VERSION" && \ -# poetry config virtualenvs.create false && \ -# poetry install --without dev --no-interaction --no-ansi && \ -# apt-get remove --purge -y gcc g++ && \ -# pip uninstall -y "poetry==$POETRY_VERSION" && \ -# sudo apt-get clean - -RUN sudo apt-get -y install gcc g++ -RUN pip install "poetry==$POETRY_VERSION" RUN poetry config virtualenvs.create false RUN poetry install --without dev --no-interaction --no-ansi -RUN apt-get remove --purge -y gcc g++ -RUN pip uninstall -y "poetry==$POETRY_VERSION" -RUN sudo apt-get clean -FROM harbor.cicd.s15m.nl/ictu-devops-pub/python:3.11.1-lunar-devops_base_0.2 +# Replace this base image with the correct python image. +# See ./base_image for more info. +FROM harbor-gn2.cicd.s15m.nl/ictu-devops-pub/python:3.11.1-lunar-devops_base_0.2 + WORKDIR /backend + COPY --from=buildstep /backend /backend # Copy python binaries ensuring a clean install without overhead diff --git a/backend/alembic/env.py b/backend/alembic/env.py index 4c45b26e..0c4bde80 100644 --- a/backend/alembic/env.py +++ b/backend/alembic/env.py @@ -6,7 +6,6 @@ from alembic import context from common.database_url import get_database_url from app.database.database import Base -from app.models import * # this is the Alembic Config object, which provides # access to the values within the .ini file in use. diff --git a/backend/alembic/scripts/create_vectorized_column.sql b/backend/alembic/scripts/create_vectorized_column.sql new file mode 100644 index 00000000..b3096060 --- /dev/null +++ b/backend/alembic/scripts/create_vectorized_column.sql @@ -0,0 +1,45 @@ +ALTER TABLE IF EXISTS algoritme_version +ADD COLUMN IF NOT EXISTS vector tsvector; + +UPDATE algoritme_version SET vector = to_tsvector((CASE WHEN language='ENG' THEN 'ENG' ELSE 'NLD' END)::regconfig, + COALESCE(name,'') || ' ' || COALESCE(organization,'') || ' ' || COALESCE(department,'') || ' ' || + COALESCE(description_short,'') || ' ' || COALESCE(type,'') || ' ' || COALESCE(category,'') || ' ' || + COALESCE(website,'') || ' ' || COALESCE(status,'') || ' ' || COALESCE(goal,'') || ' ' || COALESCE(impact,'') || ' ' || + COALESCE(proportionality,'') || ' ' || COALESCE(decision_making_process,'') || ' ' || COALESCE(documentation,'') || ' ' || + COALESCE(competent_authority,'') || ' ' || COALESCE(lawful_basis,'') || ' ' || COALESCE(iama,'') || ' ' || + COALESCE(iama_description,'') || ' ' || COALESCE(dpia_description,'') || ' ' || COALESCE(objection_procedure,'') || ' ' || + COALESCE(standard_version,'') || ' ' || COALESCE(url,'') || ' ' || COALESCE(contact_email,'') || ' ' || + COALESCE(area,'') || ' ' || COALESCE(lang,'') || ' ' || COALESCE(revision_date,'') || ' ' || + COALESCE(description,'') || ' ' || COALESCE(application_url,'') || ' ' || COALESCE(publiccode,'') || ' ' || + COALESCE(source_data,'') || ' ' || COALESCE(methods_and_models,'') || ' ' || COALESCE(monitoring,'') || ' ' || + COALESCE(human_intervention,'') || ' ' || COALESCE(risks,'') || ' ' || COALESCE(performance_standard,'') || ' ' || + COALESCE(provider,'') || ' ' || COALESCE(process_index_url,'') || ' ' || COALESCE(tags,'') || ' ' || + COALESCE(begin_date,'') || ' ' || COALESCE(end_date,'') || ' ' || COALESCE(lawful_basis_link,'') || ' ' || + COALESCE(impacttoetsen,'') || ' ' || COALESCE(source_data_link,'')); + +CREATE INDEX gin_idx ON algoritme_version USING gin (vector); + +CREATE OR REPLACE FUNCTION update_vector() RETURNS TRIGGER AS $$ +BEGIN + NEW.vector := + to_tsvector((CASE WHEN NEW.language='ENG' THEN 'ENG' ELSE 'NLD' END)::regconfig, COALESCE(NEW.name,'') || ' ' || COALESCE(NEW.organization,'') || ' ' || COALESCE(NEW.department,'') || ' ' || + COALESCE(NEW.description_short,'') || ' ' || COALESCE(NEW.type,'') || ' ' || COALESCE(NEW.category,'') || ' ' || + COALESCE(NEW.website,'') || ' ' || COALESCE(NEW.status,'') || ' ' || COALESCE(NEW.goal,'') || ' ' || COALESCE(NEW.impact,'') || ' ' || + COALESCE(NEW.proportionality,'') || ' ' || COALESCE(NEW.decision_making_process,'') || ' ' || COALESCE(NEW.documentation,'') || ' ' || + COALESCE(NEW.competent_authority,'') || ' ' || COALESCE(NEW.lawful_basis,'') || ' ' || COALESCE(NEW.iama,'') || ' ' || + COALESCE(NEW.iama_description,'') || ' ' || COALESCE(NEW.dpia_description,'') || ' ' || COALESCE(NEW.objection_procedure,'') || ' ' || + COALESCE(NEW.standard_version,'') || ' ' || COALESCE(NEW.url,'') || ' ' || COALESCE(NEW.contact_email,'') || ' ' || + COALESCE(NEW.area,'') || ' ' || COALESCE(NEW.lang,'') || ' ' || COALESCE(NEW.revision_date,'') || ' ' || + COALESCE(NEW.description,'') || ' ' || COALESCE(NEW.application_url,'') || ' ' || COALESCE(NEW.publiccode,'') || ' ' || + COALESCE(NEW.source_data,'') || ' ' || COALESCE(NEW.methods_and_models,'') || ' ' || COALESCE(NEW.monitoring,'') || ' ' || + COALESCE(NEW.human_intervention,'') || ' ' || COALESCE(NEW.risks,'') || ' ' || COALESCE(NEW.performance_standard,'') || ' ' || + COALESCE(NEW.provider,'') || ' ' || COALESCE(NEW.process_index_url,'') || ' ' || COALESCE(NEW.tags,'') || ' ' || + COALESCE(NEW.begin_date,'') || ' ' || COALESCE(NEW.end_date,'') || ' ' || COALESCE(NEW.lawful_basis_link,'') || ' ' || + COALESCE(NEW.impacttoetsen,'') || ' ' || COALESCE(NEW.source_data_link,'')); + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +CREATE TRIGGER vector_trigger BEFORE INSERT OR UPDATE +ON algoritme_version FOR EACH ROW EXECUTE FUNCTION + update_vector(); \ No newline at end of file diff --git a/backend/alembic/scripts/create_words_table.sql b/backend/alembic/scripts/create_words_table.sql new file mode 100644 index 00000000..e820a45a --- /dev/null +++ b/backend/alembic/scripts/create_words_table.sql @@ -0,0 +1,17 @@ +CREATE TABLE words AS SELECT word FROM ts_stat('SELECT vector FROM algoritme_version'); + +CREATE OR REPLACE FUNCTION update_words() +RETURNS TRIGGER AS $$ +BEGIN + INSERT INTO words (word) + SELECT word + FROM ts_stat('SELECT vector FROM algoritme_version') + WHERE word NOT IN (SELECT word FROM words); + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +CREATE TRIGGER update_words_trigger +AFTER INSERT ON algoritme_version +FOR EACH ROW +EXECUTE FUNCTION update_words(); \ No newline at end of file diff --git a/backend/alembic/scripts/downgrade_vector_1_0_0.sql b/backend/alembic/scripts/downgrade_vector_1_0_0.sql new file mode 100644 index 00000000..3577fdd4 --- /dev/null +++ b/backend/alembic/scripts/downgrade_vector_1_0_0.sql @@ -0,0 +1,36 @@ +UPDATE algoritme_version SET vector = to_tsvector((CASE WHEN language='ENG' THEN 'ENG' ELSE 'NLD' END)::regconfig, + COALESCE(name,'') || ' ' || COALESCE(organization,'') || ' ' || COALESCE(department,'') || ' ' || + COALESCE(description_short,'') || ' ' || COALESCE(type,'') || ' ' || COALESCE(category,'') || ' ' || + COALESCE(website,'') || ' ' || COALESCE(status,'') || ' ' || COALESCE(goal,'') || ' ' || COALESCE(impact,'') || ' ' || + COALESCE(proportionality,'') || ' ' || COALESCE(decision_making_process,'') || ' ' || COALESCE(documentation,'') || ' ' || + COALESCE(competent_authority,'') || ' ' || COALESCE(lawful_basis,'') || ' ' || COALESCE(iama,'') || ' ' || + COALESCE(iama_description,'') || ' ' || COALESCE(dpia_description,'') || ' ' || COALESCE(objection_procedure,'') || ' ' || + COALESCE(standard_version,'') || ' ' || COALESCE(url,'') || ' ' || COALESCE(contact_email,'') || ' ' || + COALESCE(area,'') || ' ' || COALESCE(lang,'') || ' ' || COALESCE(revision_date,'') || ' ' || + COALESCE(description,'') || ' ' || COALESCE(application_url,'') || ' ' || COALESCE(publiccode,'') || ' ' || + COALESCE(source_data,'') || ' ' || COALESCE(methods_and_models,'') || ' ' || COALESCE(monitoring,'') || ' ' || + COALESCE(human_intervention,'') || ' ' || COALESCE(risks,'') || ' ' || COALESCE(performance_standard,'') || ' ' || + COALESCE(provider,'') || ' ' || COALESCE(process_index_url,'') || ' ' || COALESCE(tags,'') || ' ' || + COALESCE(begin_date,'') || ' ' || COALESCE(end_date,'') || ' ' || COALESCE(lawful_basis_link,'') || ' ' || + COALESCE(impacttoetsen,'') || ' ' || COALESCE(source_data_link,'')); + +CREATE OR REPLACE FUNCTION update_vector() RETURNS TRIGGER AS $$ +BEGIN + NEW.vector := + to_tsvector((CASE WHEN NEW.language='ENG' THEN 'ENG' ELSE 'NLD' END)::regconfig, COALESCE(NEW.name,'') || ' ' || COALESCE(NEW.organization,'') || ' ' || COALESCE(NEW.department,'') || ' ' || + COALESCE(NEW.description_short,'') || ' ' || COALESCE(NEW.type,'') || ' ' || COALESCE(NEW.category,'') || ' ' || + COALESCE(NEW.website,'') || ' ' || COALESCE(NEW.status,'') || ' ' || COALESCE(NEW.goal,'') || ' ' || COALESCE(NEW.impact,'') || ' ' || + COALESCE(NEW.proportionality,'') || ' ' || COALESCE(NEW.decision_making_process,'') || ' ' || COALESCE(NEW.documentation,'') || ' ' || + COALESCE(NEW.competent_authority,'') || ' ' || COALESCE(NEW.lawful_basis,'') || ' ' || COALESCE(NEW.iama,'') || ' ' || + COALESCE(NEW.iama_description,'') || ' ' || COALESCE(NEW.dpia_description,'') || ' ' || COALESCE(NEW.objection_procedure,'') || ' ' || + COALESCE(NEW.standard_version,'') || ' ' || COALESCE(NEW.url,'') || ' ' || COALESCE(NEW.contact_email,'') || ' ' || + COALESCE(NEW.area,'') || ' ' || COALESCE(NEW.lang,'') || ' ' || COALESCE(NEW.revision_date,'') || ' ' || + COALESCE(NEW.description,'') || ' ' || COALESCE(NEW.application_url,'') || ' ' || COALESCE(NEW.publiccode,'') || ' ' || + COALESCE(NEW.source_data,'') || ' ' || COALESCE(NEW.methods_and_models,'') || ' ' || COALESCE(NEW.monitoring,'') || ' ' || + COALESCE(NEW.human_intervention,'') || ' ' || COALESCE(NEW.risks,'') || ' ' || COALESCE(NEW.performance_standard,'') || ' ' || + COALESCE(NEW.provider,'') || ' ' || COALESCE(NEW.process_index_url,'') || ' ' || COALESCE(NEW.tags,'') || ' ' || + COALESCE(NEW.begin_date,'') || ' ' || COALESCE(NEW.end_date,'') || ' ' || COALESCE(NEW.lawful_basis_link,'') || ' ' || + COALESCE(NEW.impacttoetsen,'') || ' ' || COALESCE(NEW.source_data_link,'')); + RETURN NEW; +END; +$$ LANGUAGE plpgsql; diff --git a/backend/alembic/scripts/execute_full_text_search_configuration.sql b/backend/alembic/scripts/execute_full_text_search_configuration.sql new file mode 100644 index 00000000..3cb7c5ff --- /dev/null +++ b/backend/alembic/scripts/execute_full_text_search_configuration.sql @@ -0,0 +1,38 @@ +-- Dutch full text search configuration +CREATE TEXT SEARCH DICTIONARY dutch_opentaal_hunspell ( + template = ispell, + dictfile = nl_nl, + afffile = nl_nl, + stopwords = dutch_stopwords_extended +); + +CREATE TEXT SEARCH CONFIGURATION NLD (copy = pg_catalog.dutch); + +ALTER TEXT SEARCH CONFIGURATION NLD + ALTER MAPPING FOR asciiword, asciihword, hword_asciipart, word, hword, hword_part + WITH dutch_opentaal_hunspell, dutch_stem; + +CREATE TEXT SEARCH DICTIONARY dutch_syn ( + TEMPLATE = synonym, + SYNONYMS = dutch_synonyms +); + +ALTER TEXT SEARCH CONFIGURATION NLD + ALTER MAPPING FOR asciiword + WITH dutch_syn, dutch_stem; + +-- English full text search configuration +CREATE TEXT SEARCH DICTIONARY english_hunspell ( + template = ispell, + dictfile = en_gb, + afffile = en_gb, + stopwords = english_stopwords_extended +); + +CREATE TEXT SEARCH CONFIGURATION ENG (copy = pg_catalog.english); + +ALTER TEXT SEARCH CONFIGURATION ENG + ALTER MAPPING FOR asciiword, asciihword, hword_asciipart, word, hword, hword_part + WITH english_hunspell, english_stem; + +CREATE EXTENSION pg_trgm; diff --git a/backend/alembic/scripts/remove_vectorized_column.sql b/backend/alembic/scripts/remove_vectorized_column.sql new file mode 100644 index 00000000..9b176613 --- /dev/null +++ b/backend/alembic/scripts/remove_vectorized_column.sql @@ -0,0 +1,5 @@ +ALTER TABLE algoritme_version DROP COLUMN vector; + +DROP INDEX IF EXISTS gin_idx; + +DROP TRIGGER vector_trigger ON algoritme_version; \ No newline at end of file diff --git a/backend/alembic/scripts/remove_words_table.sql b/backend/alembic/scripts/remove_words_table.sql new file mode 100644 index 00000000..189b7498 --- /dev/null +++ b/backend/alembic/scripts/remove_words_table.sql @@ -0,0 +1,3 @@ +DROP TABLE IF EXISTS words; + +DROP TRIGGER update_words_trigger ON algoritme_version; \ No newline at end of file diff --git a/backend/alembic/scripts/upgrade_vector_1_0_0.sql b/backend/alembic/scripts/upgrade_vector_1_0_0.sql new file mode 100644 index 00000000..eeeeea60 --- /dev/null +++ b/backend/alembic/scripts/upgrade_vector_1_0_0.sql @@ -0,0 +1,38 @@ +UPDATE algoritme_version SET vector = to_tsvector((CASE WHEN language='ENG' THEN 'ENG' ELSE 'NLD' END)::regconfig, + COALESCE(name,'') || ' ' || COALESCE(organization,'') || ' ' || COALESCE(department,'') || ' ' || + COALESCE(description_short,'') || ' ' || COALESCE(type,'') || ' ' || COALESCE(category,'') || ' ' || + COALESCE(website,'') || ' ' || COALESCE(status,'') || ' ' || COALESCE(goal,'') || ' ' || COALESCE(impact,'') || ' ' || + COALESCE(proportionality,'') || ' ' || COALESCE(decision_making_process,'') || ' ' || COALESCE(documentation,'') || ' ' || + COALESCE(competent_authority,'') || ' ' || COALESCE(lawful_basis,'') || ' ' || COALESCE(iama,'') || ' ' || + COALESCE(iama_description,'') || ' ' || COALESCE(dpia_description,'') || ' ' || COALESCE(objection_procedure,'') || ' ' || + COALESCE(standard_version,'') || ' ' || COALESCE(url,'') || ' ' || COALESCE(contact_email,'') || ' ' || + COALESCE(area,'') || ' ' || COALESCE(lang,'') || ' ' || COALESCE(revision_date,'') || ' ' || + COALESCE(description,'') || ' ' || COALESCE(application_url,'') || ' ' || COALESCE(publiccode,'') || ' ' || + COALESCE(source_data,'') || ' ' || COALESCE(methods_and_models,'') || ' ' || COALESCE(monitoring,'') || ' ' || + COALESCE(human_intervention,'') || ' ' || COALESCE(risks,'') || ' ' || COALESCE(performance_standard,'') || ' ' || + COALESCE(provider,'') || ' ' || COALESCE(process_index_url,'') || ' ' || COALESCE(tags,'') || ' ' || + COALESCE(begin_date,'') || ' ' || COALESCE(end_date,'') || ' ' || COALESCE(lawful_basis_link,'') || ' ' || + COALESCE(impacttoetsen,'') || ' ' || COALESCE(source_data_link,'') || ' ' || COALESCE(publication_category,'') || ' ' || + COALESCE(lawful_basis_grouping,'[]') || ' ' || COALESCE(impacttoetsen_grouping,'[]') || ' ' || COALESCE(source_data_grouping,'[]')); + +CREATE OR REPLACE FUNCTION update_vector() RETURNS TRIGGER AS $$ +BEGIN + NEW.vector := + to_tsvector((CASE WHEN NEW.language='ENG' THEN 'ENG' ELSE 'NLD' END)::regconfig, COALESCE(NEW.name,'') || ' ' || COALESCE(NEW.organization,'') || ' ' || COALESCE(NEW.department,'') || ' ' || + COALESCE(NEW.description_short,'') || ' ' || COALESCE(NEW.type,'') || ' ' || COALESCE(NEW.category,'') || ' ' || + COALESCE(NEW.website,'') || ' ' || COALESCE(NEW.status,'') || ' ' || COALESCE(NEW.goal,'') || ' ' || COALESCE(NEW.impact,'') || ' ' || + COALESCE(NEW.proportionality,'') || ' ' || COALESCE(NEW.decision_making_process,'') || ' ' || COALESCE(NEW.documentation,'') || ' ' || + COALESCE(NEW.competent_authority,'') || ' ' || COALESCE(NEW.lawful_basis,'') || ' ' || COALESCE(NEW.iama,'') || ' ' || + COALESCE(NEW.iama_description,'') || ' ' || COALESCE(NEW.dpia_description,'') || ' ' || COALESCE(NEW.objection_procedure,'') || ' ' || + COALESCE(NEW.standard_version,'') || ' ' || COALESCE(NEW.url,'') || ' ' || COALESCE(NEW.contact_email,'') || ' ' || + COALESCE(NEW.area,'') || ' ' || COALESCE(NEW.lang,'') || ' ' || COALESCE(NEW.revision_date,'') || ' ' || + COALESCE(NEW.description,'') || ' ' || COALESCE(NEW.application_url,'') || ' ' || COALESCE(NEW.publiccode,'') || ' ' || + COALESCE(NEW.source_data,'') || ' ' || COALESCE(NEW.methods_and_models,'') || ' ' || COALESCE(NEW.monitoring,'') || ' ' || + COALESCE(NEW.human_intervention,'') || ' ' || COALESCE(NEW.risks,'') || ' ' || COALESCE(NEW.performance_standard,'') || ' ' || + COALESCE(NEW.provider,'') || ' ' || COALESCE(NEW.process_index_url,'') || ' ' || COALESCE(NEW.tags,'') || ' ' || + COALESCE(NEW.begin_date,'') || ' ' || COALESCE(NEW.end_date,'') || ' ' || COALESCE(NEW.lawful_basis_link,'') || ' ' || + COALESCE(NEW.impacttoetsen,'') || ' ' || COALESCE(NEW.source_data_link,'') || ' ' || COALESCE(NEW.publication_category,'') || ' ' || + COALESCE(NEW.lawful_basis_grouping,'[]') || ' ' || COALESCE(NEW.impacttoetsen_grouping,'[]') || ' ' || COALESCE(NEW.source_data_grouping,'[]')); + RETURN NEW; +END; +$$ LANGUAGE plpgsql; diff --git a/backend/alembic/versions/0a0ff83803b0_add_action_history_table.py b/backend/alembic/versions/0a0ff83803b0_add_action_history_table.py index d20de76b..6fe36a7c 100644 --- a/backend/alembic/versions/0a0ff83803b0_add_action_history_table.py +++ b/backend/alembic/versions/0a0ff83803b0_add_action_history_table.py @@ -8,7 +8,7 @@ from alembic import op import sqlalchemy as sa from sqlalchemy.dialects import postgresql -from app.models import OperationEnum +from app.schemas import OperationEnum # revision identifiers, used by Alembic. revision = "0a0ff83803b0" diff --git a/backend/alembic/versions/2929cd63a048_add_organisation_table.py b/backend/alembic/versions/2929cd63a048_add_organisation_table.py new file mode 100644 index 00000000..275d9efc --- /dev/null +++ b/backend/alembic/versions/2929cd63a048_add_organisation_table.py @@ -0,0 +1,52 @@ +"""add organisation table + +Revision ID: 2929cd63a048 +Revises: ba4ce1f66866 +Create Date: 2023-09-18 16:00:07.290568 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = "2929cd63a048" +down_revision = "ba4ce1f66866" +branch_labels = None +depends_on = None + + +def upgrade() -> None: + op.create_table( + "organisation", + sa.Column("id", sa.Integer(), nullable=False), + sa.Column("code", sa.VARCHAR(length=1024), nullable=False), + sa.Column("name", sa.VARCHAR(length=1024), nullable=False), + sa.Column( + "create_dt", + sa.DateTime(timezone=True), + server_default=sa.text("now()"), + nullable=False, + ), + sa.PrimaryKeyConstraint("id"), + ) + op.create_index(op.f("ix_organisation_id"), "organisation", ["id"], unique=False) + op.add_column( + "algoritme", + sa.Column("organisation_id", sa.Integer(), nullable=True), + ) + op.create_foreign_key( + "algoritme_organisation_fkey", + "algoritme", + "organisation", + ["organisation_id"], + ["id"], + ondelete="CASCADE", + ) + + +def downgrade() -> None: + op.drop_constraint("algoritme_organisation_fkey", "algoritme", type_="foreignkey") + op.drop_column("algoritme", "organisation_id") + op.drop_index(op.f("ix_organisation_id"), table_name="organisation") + op.drop_table("organisation") diff --git a/backend/alembic/versions/3de4ce027fe0_execute_full_text_search_configuration.py b/backend/alembic/versions/3de4ce027fe0_execute_full_text_search_configuration.py new file mode 100644 index 00000000..3993a9cf --- /dev/null +++ b/backend/alembic/versions/3de4ce027fe0_execute_full_text_search_configuration.py @@ -0,0 +1,25 @@ +"""execute full text search database configuration + +Revision ID: 3de4ce027fe0 +Revises: d621bd490e48 +Create Date: 2023-11-14 11:46:16.008798 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = "3de4ce027fe0" +down_revision = "d621bd490e48" +branch_labels = None +depends_on = None + + +def upgrade() -> None: + with open("alembic/scripts/execute_full_text_search_configuration.sql") as file: + op.execute(file.read()) + + +def downgrade() -> None: + pass diff --git a/backend/alembic/versions/412c46f50f27_add_organisation_type.py b/backend/alembic/versions/412c46f50f27_add_organisation_type.py new file mode 100644 index 00000000..f9f56dd2 --- /dev/null +++ b/backend/alembic/versions/412c46f50f27_add_organisation_type.py @@ -0,0 +1,35 @@ +"""add organisation type + +Revision ID: 412c46f50f27 +Revises: d621bd490e48 +Create Date: 2023-11-01 12:09:40.159758 + +""" +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql +from app.schemas import OrgType + +# revision identifiers, used by Alembic. +revision = "412c46f50f27" +down_revision = "b5ce4561c092" +branch_labels = None +depends_on = None + + +def upgrade() -> None: + org_type = postgresql.ENUM(OrgType, name="type", create_type=False) + org_type.create(op.get_bind(), checkfirst=True) + + op.add_column( + "organisation", + sa.Column("type", org_type, nullable=True), + ) + + +def downgrade() -> None: + # Results in loss of data!!! + op.drop_column("organisation", "type") + + org_type = postgresql.ENUM(OrgType, name="type", create_type=False) + org_type.drop(op.get_bind()) diff --git a/backend/alembic/versions/42e58f22ba71_migrate_data_to_org_table.py b/backend/alembic/versions/42e58f22ba71_migrate_data_to_org_table.py new file mode 100644 index 00000000..a49b126d --- /dev/null +++ b/backend/alembic/versions/42e58f22ba71_migrate_data_to_org_table.py @@ -0,0 +1,146 @@ +"""migrate data to org table + +Revision ID: 42e58f22ba71 +Revises: 2929cd63a048 +Create Date: 2023-09-18 16:08:39.722690 + +""" +from alembic import op +import sqlalchemy as sa +from app.models import Organisation + +# revision identifiers, used by Alembic. +revision = "42e58f22ba71" +down_revision = "2929cd63a048" +branch_labels = None +depends_on = None + +name_mapping = { + "provincie-noord-brabant": "Provincie Noord-Brabant", + "provincie-noord-holland": "Provincie Noord-Holland", + "provincie-zuid-holland": "Provincie Zuid-Holland", + "ministerie-fin": "Ministerie van Financiën", + "ministerie-ezk": "Ministerie van Economische Zaken en Klimaat", + "ministerie-az": "Ministerie van Algemene Zaken", + "ministerie-bzk": "Ministerie van Binnenlandse Zaken en Koninkrijksrelaties", + "ministerie-bz": "Ministerie van Buitenlandse Zaken", + "ministerie-def": "Ministerie van Defensie", + "ministerie-ienw": "Ministerie van Infrastructuur en Waterstaat", + "ministerie-jenv": "Ministerie van Justitie en Veiligheid", + "ministerie-lnw": "Ministerie van Landbouw, Natuur en Voedselkwaliteit", + "ministerie-ocw": "Ministerie van Onderwijs, Cultuur en Wetenschap", + "ministerie-szw": "Ministerie van Sociale Zaken en Werkgelegenheid", + "ministerie-vws": "Ministerie van Volksgezondheid, Welzijn en Sport", + "justitiele-informatiedienst": "Justitiële Informatiedienst", + "rvig": "Rijksdienst voor Identiteitsgegevens", + "directie-financieel-economische-zaken": "Directie Financieel-Economische Zaken", + "inspectie-van-het-onderwijs": "Inspectie van het Onderwijs (OCW)", + "gemeente-sudwest-fryslan": "Gemeente Súdwest-Fryslân", + "omgevingsdienst-west-brabant": "Omgevingsdienst Midden- en West-Brabant", + "gemeente-goeree-overflakkee": "Gemeente Goeree-Overflakkee", + "gemeente-ouder-amstel": "Gemeente Ouder-Amstel", + "kamer-van-koophandel": "Kamer van Koophandel", + "rijksdienst-voor-ondernemend-nederland": "Rijksdienst voor Ondernemend Nederland", + "gemeente-shertogenbosch": "Gemeente 's-Hertogenbosch", + "odmh": "Omgevingsdienst Midden-Holland", + "SED-organisatie": "SED Organisatie (Gemeente Stede Broec, Enkhuizen, Drechterland)", + "provincie-friesland": "Provinsje Fryslân", + "gemeente-geldrop-mierlo": "Gemeente Geldrop-Mierlo", + "gemeente-nuenen-gerwen-en-nederwetten": "Gemeente Nuenen, Gerwen en Nederwetten", + "gemeente-son-en-breugel": "Gemeente Son en Breugel", + "DCMR-milieudienst-rijnmond": "DCMR Milieudienst Rijnmond", +} + + +def upgrade() -> None: + conn = op.get_bind() + res = conn.execute(sa.text("select id, owner from algoritme")) + if not res: + raise ConnectionError + results = res.fetchall() + + if len(results) == 0: + return + # Construct the rows for organisation table. Done in dict so it is easy to see unique orgs + unique_orgs = {} + n = 0 + for r in results: + if r[1] in name_mapping.keys(): + name = name_mapping[r[1]] + else: + name = r[1].split("-") + name = [word.capitalize() for word in name] + name = " ".join(name) + + entry = {"code": r[1], "name": name} + + key = r[1] + if key not in unique_orgs.keys(): + unique_orgs[key] = entry + n += 1 + + # insertion is done with list + orgs = [unique_orgs[key] for key in unique_orgs.keys()] + conn.execute(Organisation.__table__.insert().values(orgs)) # type: ignore + + # Get the new data, so that we have the id's. + res = conn.execute(sa.text("select id, code from organisation")) + if not res: + raise ConnectionError + organisations = res.fetchall() + + # new column in algoritme must have proper id's for references + when_text = " ".join( + [f"WHEN owner='{org[1]}' THEN {org[0]}" for org in organisations] + ) + update_statement = sa.text( + f""" + UPDATE algoritme + SET organisation_id = + CASE + {when_text} + END; + """ + ) + conn.execute(update_statement) + + # When done, remove owner column. Now uses organisation_id instead. + op.drop_column("algoritme", "owner") + + +def downgrade() -> None: + op.add_column( + "algoritme", + sa.Column("owner", sa.VARCHAR(length=1024), autoincrement=False, nullable=True), + ) + + conn = op.get_bind() + res = conn.execute(sa.text("select id, code, name from organisation")) + if not res: + raise ConnectionError + results = res.fetchall() + + when_text = " ".join( + [f"WHEN organisation_id='{r[0]}' THEN '{r[1]}'" for r in results] + ) + set_owner_statement = sa.text( + f""" + UPDATE algoritme + SET owner = + CASE + {when_text} + END; + """ + ) + conn.execute(set_owner_statement) + + reset_organisation_id_statement = sa.text( + """ + UPDATE algoritme + SET organisation_id = NULL + """ + ) + conn.execute(reset_organisation_id_statement) + + conn.execute(sa.text("DELETE FROM organisation")) + pass diff --git a/backend/alembic/versions/94bf47cb75fb_vectorised_algoritme_version_columns.py b/backend/alembic/versions/94bf47cb75fb_vectorised_algoritme_version_columns.py new file mode 100644 index 00000000..d955994d --- /dev/null +++ b/backend/alembic/versions/94bf47cb75fb_vectorised_algoritme_version_columns.py @@ -0,0 +1,25 @@ +"""vectorised algoritme version columns + +Revision ID: 94bf47cb75fb +Revises: 3de4ce027fe0 +Create Date: 2023-10-30 11:08:48.176935 + +""" +from alembic import op + + +# revision identifiers, used by Alembic. +revision = "94bf47cb75fb" +down_revision = "3de4ce027fe0" +branch_labels = None +depends_on = None + + +def upgrade() -> None: + with open("alembic/scripts/create_vectorized_column.sql") as file: + op.execute(file.read()) + + +def downgrade() -> None: + with open("alembic/scripts/remove_vectorized_column.sql") as file: + op.execute(file.read()) diff --git a/backend/alembic/versions/b5ce4561c092_words_table_for_algoritme_version.py b/backend/alembic/versions/b5ce4561c092_words_table_for_algoritme_version.py new file mode 100644 index 00000000..f285fb89 --- /dev/null +++ b/backend/alembic/versions/b5ce4561c092_words_table_for_algoritme_version.py @@ -0,0 +1,26 @@ +"""Create words table for algoritme version + +Revision ID: b5ce4561c092 +Revises: 94bf47cb75fb +Create Date: 2023-11-13 12:18:23.132668 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = "b5ce4561c092" +down_revision = "94bf47cb75fb" +branch_labels = None +depends_on = None + + +def upgrade() -> None: + with open("alembic/scripts/create_words_table.sql") as file: + op.execute(file.read()) + + +def downgrade() -> None: + with open("alembic/scripts/remove_words_table.sql") as file: + op.execute(file.read()) diff --git a/backend/alembic/versions/c6bff8b8c900_add_language_dependency.py b/backend/alembic/versions/c6bff8b8c900_add_language_dependency.py new file mode 100644 index 00000000..f0f31cc5 --- /dev/null +++ b/backend/alembic/versions/c6bff8b8c900_add_language_dependency.py @@ -0,0 +1,34 @@ +"""add language dependency + +Revision ID: c6bff8b8c900 +Revises: 42e58f22ba71 +Create Date: 2023-10-02 14:50:06.490302 + +""" +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql +from app.schemas import Language + +# revision identifiers, used by Alembic. +revision = "c6bff8b8c900" +down_revision = "42e58f22ba71" +branch_labels = None +depends_on = None + + +def upgrade() -> None: + language = postgresql.ENUM(Language, name="language", create_type=False) + language.create(op.get_bind(), checkfirst=True) + + op.add_column( + "algoritme_version", + sa.Column("language", language, server_default="NLD", nullable=True), + ) + + +def downgrade() -> None: + op.drop_column("algoritme_version", "language") + + type = postgresql.ENUM(Language, name="language", create_type=False) + type.drop(op.get_bind()) diff --git a/backend/alembic/versions/d621bd490e48_remove_default_value_language.py b/backend/alembic/versions/d621bd490e48_remove_default_value_language.py new file mode 100644 index 00000000..a9e509be --- /dev/null +++ b/backend/alembic/versions/d621bd490e48_remove_default_value_language.py @@ -0,0 +1,26 @@ +"""remove default value language + +Revision ID: d621bd490e48 +Revises: c6bff8b8c900 +Create Date: 2023-10-02 14:55:10.969871 + +""" +from alembic import op + +# revision identifiers, used by Alembic. +revision = "d621bd490e48" +down_revision = "c6bff8b8c900" +branch_labels = None +depends_on = None + + +def upgrade() -> None: + op.alter_column( + "algoritme_version", "language", server_default=None, nullable=False + ) + + +def downgrade() -> None: + op.alter_column( + "algoritme_version", "language", server_default="NLD", nullable=True + ) diff --git a/backend/alembic/versions/f3c9f5768daf_1_0_0.py b/backend/alembic/versions/f3c9f5768daf_1_0_0.py new file mode 100644 index 00000000..62130e90 --- /dev/null +++ b/backend/alembic/versions/f3c9f5768daf_1_0_0.py @@ -0,0 +1,46 @@ +"""1.0.0 + +Revision ID: f3c9f5768daf +Revises: 412c46f50f27 +Create Date: 2023-11-28 14:51:58.879670 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = "f3c9f5768daf" +down_revision = "412c46f50f27" +branch_labels = None +depends_on = None + + +def upgrade() -> None: + op.add_column( + "algoritme_version", + sa.Column("publication_category", sa.VARCHAR(length=1000), nullable=True), + ) + op.add_column( + "algoritme_version", + sa.Column("lawful_basis_grouping", sa.JSON(), nullable=True), + ) + op.add_column( + "algoritme_version", + sa.Column("impacttoetsen_grouping", sa.JSON(), nullable=True), + ) + op.add_column( + "algoritme_version", sa.Column("source_data_grouping", sa.JSON(), nullable=True) + ) + + with open("alembic/scripts/upgrade_vector_1_0_0.sql") as file: + op.execute(file.read()) + + +def downgrade() -> None: + with open("alembic/scripts/downgrade_vector_1_0_0.sql") as file: + op.execute(file.read()) + op.drop_column("algoritme_version", "source_data_grouping") + op.drop_column("algoritme_version", "impacttoetsen_grouping") + op.drop_column("algoritme_version", "lawful_basis_grouping") + op.drop_column("algoritme_version", "publication_category") diff --git a/backend/app/api.py b/backend/app/api.py index e1da6c6b..51cb04ad 100644 --- a/backend/app/api.py +++ b/backend/app/api.py @@ -1,12 +1,11 @@ +import re from fastapi import FastAPI, APIRouter from starlette.middleware.cors import CORSMiddleware -import re from app import routers from app.util.logger import get_logger logger = get_logger(__name__) - api = FastAPI( docs_url="/api-docs", title="Algoritmeregister aanlevering API", @@ -18,8 +17,14 @@ router = APIRouter() +api.include_router(routers.downloads.router, prefix="/downloads", tags=["Downloads"]) +api.include_router(routers.organization.router, tags=["Organisatie"]) +api.include_router(routers.algoritme.router, tags=["Algoritme"]) +api.include_router(routers.c3po.router, prefix="/c3po", tags=["C3PO"]) +api.include_router(routers.templates.router, prefix="/templates", tags=["Templates"]) + # Includes fastapi instances in routers folders dynamically. -version_pattern = re.compile("v[0-9]_[0-9]_[0-9][a-z]?") +version_pattern = re.compile(r"v\d_\d_\d[a-z]?") file_names = [item for item in dir(routers) if version_pattern.match(item)] for f in file_names: file = getattr(routers, f) diff --git a/backend/app/config/layouts/types.py b/backend/app/config/layouts/types.py new file mode 100644 index 00000000..518ecb4c --- /dev/null +++ b/backend/app/config/layouts/types.py @@ -0,0 +1,17 @@ +from pydantic import BaseModel + + +class HeaderCardGrouping(BaseModel): + mainElement: str + subElements: list[str] + + +class TabGrouping(BaseModel): + key: str + label: str + rows: list[str] + + +class LayoutJson(BaseModel): + headerCardGrouping: HeaderCardGrouping + tabsGrouping: list[TabGrouping] diff --git a/backend/app/config/layouts/v0_1_0.json b/backend/app/config/layouts/v0_1_0.json new file mode 100644 index 00000000..c99ca24f --- /dev/null +++ b/backend/app/config/layouts/v0_1_0.json @@ -0,0 +1,85 @@ +{ + "headerCardGrouping": { + "mainElement": "description_short", + "subElements": [ + "organization", + "department", + "category", + "type", + "status" + ] + }, + "tabsGrouping": [ + { + "key": "algemeneInformatie", + "label": "Algemene informatie", + "rows": [ + "name", + "organization", + "department", + "description_short", + "type", + "category", + "website", + "status" + ] + }, + { + "key": "inzet", + "label": "Inzet", + "rows": [ + "goal", + "impact", + "proportionality", + "decision_making_process", + "documentation" + ] + }, + { + "key": "juridisch", + "label": "Juridisch", + "rows": [ + "competent_authority", + "lawful_basis", + "iama", + "iama_description", + "dpia", + "dpia_description", + "objection_procedure" + ] + }, + { + "key": "metadata_algorithm", + "label": "Metadata", + "rows": [ + "url", + "contact_email", + "area", + "lang", + "revision_date" + ] + }, + { + "key": "toepassing", + "label": "Toepassing", + "rows": [ + "description", + "application_url", + "publiccode", + "mprd", + "source_data", + "methods_and_models" + ] + }, + { + "key": "toezicht", + "label": "Toezicht", + "rows": [ + "monitoring", + "human_intervention", + "risks", + "performance_standard" + ] + } + ] +} \ No newline at end of file diff --git a/backend/app/config/layouts/v0_2_3.json b/backend/app/config/layouts/v0_2_3.json new file mode 100644 index 00000000..c99ca24f --- /dev/null +++ b/backend/app/config/layouts/v0_2_3.json @@ -0,0 +1,85 @@ +{ + "headerCardGrouping": { + "mainElement": "description_short", + "subElements": [ + "organization", + "department", + "category", + "type", + "status" + ] + }, + "tabsGrouping": [ + { + "key": "algemeneInformatie", + "label": "Algemene informatie", + "rows": [ + "name", + "organization", + "department", + "description_short", + "type", + "category", + "website", + "status" + ] + }, + { + "key": "inzet", + "label": "Inzet", + "rows": [ + "goal", + "impact", + "proportionality", + "decision_making_process", + "documentation" + ] + }, + { + "key": "juridisch", + "label": "Juridisch", + "rows": [ + "competent_authority", + "lawful_basis", + "iama", + "iama_description", + "dpia", + "dpia_description", + "objection_procedure" + ] + }, + { + "key": "metadata_algorithm", + "label": "Metadata", + "rows": [ + "url", + "contact_email", + "area", + "lang", + "revision_date" + ] + }, + { + "key": "toepassing", + "label": "Toepassing", + "rows": [ + "description", + "application_url", + "publiccode", + "mprd", + "source_data", + "methods_and_models" + ] + }, + { + "key": "toezicht", + "label": "Toezicht", + "rows": [ + "monitoring", + "human_intervention", + "risks", + "performance_standard" + ] + } + ] +} \ No newline at end of file diff --git a/backend/app/config/layouts/v0_3_1.json b/backend/app/config/layouts/v0_3_1.json new file mode 100644 index 00000000..d3872cad --- /dev/null +++ b/backend/app/config/layouts/v0_3_1.json @@ -0,0 +1,85 @@ +{ + "headerCardGrouping": { + "mainElement": "description_short", + "subElements": [ + "organization", + "department", + "category", + "type", + "status" + ] + }, + "tabsGrouping": [ + { + "key": "algemeneInformatie", + "label": "Algemene informatie", + "rows": [ + "name", + "organization", + "department", + "description_short", + "type", + "category", + "website", + "status" + ] + }, + { + "key": "inzet", + "label": "Inzet", + "rows": [ + "goal", + "impact", + "proportionality", + "provider", + "application_url", + "process_index_url" + ] + }, + { + "key": "juridisch", + "label": "Juridisch", + "rows": [ + "lawful_basis", + "iama", + "iama_description", + "dpia", + "objection_procedure" + ] + }, + { + "key": "metadata_algorithm", + "label": "Metadata", + "rows": [ + "url", + "contact_email", + "area", + "lang", + "standard_version", + "source_id", + "revision_date", + "tags" + ] + }, + { + "key": "toepassing", + "label": "Toepassing", + "rows": [ + "description", + "source_data", + "methods_and_models", + "publiccode" + ] + }, + { + "key": "toezicht", + "label": "Toezicht", + "rows": [ + "monitoring", + "human_intervention", + "risks", + "performance_standard" + ] + } + ] +} \ No newline at end of file diff --git a/backend/app/config/layouts/v0_4_0.json b/backend/app/config/layouts/v0_4_0.json new file mode 100644 index 00000000..1bb91f73 --- /dev/null +++ b/backend/app/config/layouts/v0_4_0.json @@ -0,0 +1,55 @@ +{ + "headerCardGrouping": { + "mainElement": "description_short", + "subElements": [ + "organization", + "category", + "type", + "status" + ] + }, + "tabsGrouping": [ + { + "key": "algemeneInformatie", + "label": "Algemene informatie", + "rows": [ + "name", + "organization", + "description_short", + "type", + "category", + "status", + "begin_date", + "end_date", + "contact_email", + "website", + "url" + ] + }, + { + "key": "verantwoordGebruik", + "label": "Verantwoord gebruik", + "rows": [ + "goal", + "proportionality", + "human_intervention", + "risks", + "lawful_basis", + "lawful_basis_link", + "impacttoetsen", + "iama_description" + ] + }, + { + "key": "technischeWerking", + "label": "Technische werking", + "rows": [ + "source_data", + "source_data_link", + "methods_and_models", + "provider", + "publiccode" + ] + } + ] +} \ No newline at end of file diff --git a/backend/app/config/layouts/v1_0_0.json b/backend/app/config/layouts/v1_0_0.json new file mode 100644 index 00000000..3d3eba8b --- /dev/null +++ b/backend/app/config/layouts/v1_0_0.json @@ -0,0 +1,65 @@ +{ + "headerCardGrouping": { + "mainElement": "description_short", + "subElements": [ + "organization", + "category", + "status" + ] + }, + "tabsGrouping": [ + { + "key": "algemeneInformatie", + "label": "Algemene informatie", + "rows": [ + "name", + "description_short", + "organization", + "category", + "status", + "begin_date", + "end_date", + "contact_email", + "website", + "publication_category", + "url" + ] + }, + { + "key": "verantwoordGebruik", + "label": "Verantwoord gebruik", + "rows": [ + "goal", + "proportionality", + "human_intervention", + "risks", + "lawful_basis", + "lawful_basis_grouping", + "process_index_url", + "impacttoetsen", + "impacttoetsen_grouping" + ] + }, + { + "key": "werking", + "label": "Werking", + "rows": [ + "source_data", + "source_data_grouping", + "methods_and_models", + "provider", + "publiccode" + ] + }, + { + "key": "metadata", + "label": "Metadata", + "rows": [ + "lang", + "standard_version", + "source_id", + "tags" + ] + } + ] +} \ No newline at end of file diff --git a/backend/app/config/settings.py b/backend/app/config/settings.py index 50abea29..eabf6c65 100644 --- a/backend/app/config/settings.py +++ b/backend/app/config/settings.py @@ -2,16 +2,33 @@ class Settings(BaseSettings): - type: str = Field("PUB") - enable_debug: bool = Field(False) - preview_url: str = Field("localhost:3000/concept") - webform_url: str = Field("localhost:3001/webformulier") - retract_preview_time: int = Field(600) + enable_debug: bool = Field(default=False) + enable_translation: bool = Field(default=False) + preview_url: str = Field(default="localhost:3001") + webform_url: str = Field(default="localhost:3001/webformulier") + retract_preview_time: int = Field(default=600) - application_mail_address: str = Field("Algoritmeregister@i8s.nl") + application_mail_address: str = Field(default="Algoritmeregister@i8s.nl") + c3po_url: str = Field(default="http://localhost:8001/api") class Keycloak(BaseSettings): KEYCLOAK_URI: str = Field(default="https://s04.i8s.nl") KEYCLOAK_REALM: str = Field(default="algreg_dev") KEYCLOAK_CLIENT: str = Field(default="authentication-client") + + +class AzureTranslation(BaseSettings): + api_key: str = Field(env="AZURE_TRANSLATE_API_KEY", default="secret") + endpoint: str = Field(env="AZURE_TRANSLATE_ENDPOINT") + region: str = Field(env="AZURE_TRANSLATE_REGION") + + +class DeepLSettings(BaseSettings): + api_key: str = Field(env="DEEPL_API_KEY") + + +class EUTranslateSettings(BaseSettings): + app_id: str = Field(env="EU_TRANSLATE_APP_ID") + api_key: str = Field(env="EU_TRANSLATE_API_KEY") + endpoint: str = Field(env="EU_TRANSLATE_ENDPOINT") diff --git a/backend/app/controllers/__init__.py b/backend/app/controllers/__init__.py index 89a19695..ae149e98 100644 --- a/backend/app/controllers/__init__.py +++ b/backend/app/controllers/__init__.py @@ -1,4 +1,9 @@ from .algoritme_version import * # noqa -from .action_history import * # noqa from .mailing import * # noqa -from .excel_download import * # noqa +from .excel_download import generate_excel_download # noqa +from .word_download import * # noqa +from .pdf_download import generate_pdf_download # noqa +from .c3po import * # noqa +from .organization import get_orgs, create_org, update_org # noqa +from .algoritme import get_algoritme_owner # noqa +from .templates import get_template_summary, get_template_by_id # noqa diff --git a/backend/app/controllers/action_history.py b/backend/app/controllers/action_history.py deleted file mode 100644 index 69996351..00000000 --- a/backend/app/controllers/action_history.py +++ /dev/null @@ -1,18 +0,0 @@ -from app import models, schemas -from sqlalchemy.orm import Session - - -def post_action( - action: models.OperationEnum, - algoritme_version_id: str, - db: Session, - user: schemas.User | str, -) -> None: - action_history = { - "algoritme_version_id": algoritme_version_id, - "operation": action, - "user_id": getattr(user, "name", user), - } - new_action = models.ActionHistory(**action_history) - - db.add(new_action) diff --git a/backend/app/controllers/algoritme.py b/backend/app/controllers/algoritme.py new file mode 100644 index 00000000..edaf7564 --- /dev/null +++ b/backend/app/controllers/algoritme.py @@ -0,0 +1,21 @@ +from sqlalchemy.orm import Session +from fastapi import HTTPException, status +from app import schemas +from app.repositories.organisation import OrganisationRepository + + +def get_algoritme_owner( + db: Session, user: schemas.User, lars: str +) -> schemas.OrganisationIn: + organisation_repo = OrganisationRepository(db) + organisation = organisation_repo.get_by_lars(lars) + if not organisation: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="NOT_FOUND") + + if user.role == "admin" or user.role == "publisher": + return organisation + + if organisation.code not in user.organizations: + raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="NO_ACCESS") + + return organisation diff --git a/backend/app/controllers/algoritme_version/__init__.py b/backend/app/controllers/algoritme_version/__init__.py index b7a771dc..f5b55b99 100644 --- a/backend/app/controllers/algoritme_version/__init__.py +++ b/backend/app/controllers/algoritme_version/__init__.py @@ -1,5 +1,5 @@ from .endpoints import ( # noqa - get_all_newest, + get_algorithm_summary, get_one_newest, get_one_published, retract_one, @@ -11,13 +11,7 @@ remove_one, ) from .util import ( # noqa - get_published_version_algo, - get_latest_version_algo, - retract_published_algo, - publish_latest_version_algo, - set_preview_active, wait_then_disable_preview, disable_preview, find_version_changes, - remove_all_versions_algo, ) diff --git a/backend/app/controllers/algoritme_version/endpoints.py b/backend/app/controllers/algoritme_version/endpoints.py index ae125fab..084af3b0 100644 --- a/backend/app/controllers/algoritme_version/endpoints.py +++ b/backend/app/controllers/algoritme_version/endpoints.py @@ -1,36 +1,40 @@ -from fastapi import HTTPException, status +from fastapi import HTTPException, status, BackgroundTasks from sqlalchemy.orm import Session -from app import models, schemas, controllers +from sqlalchemy import or_ +from app import models, schemas +from app.services import translation from app.util import upc from app.config.settings import Settings +from app.schemas import Language, OperationEnum from .util import ( - retract_published_algo, - get_latest_version_algo, - get_latest_versions_algo, - publish_latest_version_algo, - release_latest_version_algo, - get_published_version_algo, - get_published_versions_algo, - set_preview_active, find_version_changes, - remove_all_versions_algo, - unrelease_all_versions_algo, ) from app.services.algoritme_version import db_list_to_python_list +from app.repositories import ( + AlgoritmeVersionRepository, + OrganisationRepository, + AlgoritmeRepository, + ActionHistoryRepository, +) +from app.util.logger import get_logger +logger = get_logger(__name__) # Version agnostic database handling env_settings = Settings() -def get_all_newest( +def get_algorithm_summary( as_org: str, db: Session, - user: schemas.User, ) -> list[schemas.AlgorithmSummary]: # Gets latest versions. - latest_versions = get_latest_versions_algo(as_org=as_org, db=db) - published_versions = get_published_versions_algo(as_org=as_org, db=db) - + algoritme_version_repository = AlgoritmeVersionRepository(db) + latest_versions = algoritme_version_repository.get_latest_by_org_by_lang( + as_org, Language.NLD + ) + published_versions = algoritme_version_repository.get_published_by_org_by_lang( + as_org, Language.NLD + ) # This dict described which algoritme_version row is published for each algorithm. # structure: # lars_code : id_in_db @@ -41,24 +45,58 @@ def get_all_newest( published_ids = {} if published_versions: for published_algo in published_versions: - lars_code = getattr(published_algo, "lars") - published_ids[lars_code] = getattr(published_algo, "id") + lars_code = published_algo.lars + published_ids[lars_code] = published_algo.id + + # build an 'id' list + ids = [] + for algo in latest_versions: + ids.append(algo.id) + + # This is a list of all history associated with the algoritme_version entries. + algos_history = ( + db.query(models.ActionHistory) + .filter( + models.ActionHistory.algoritme_version_id.in_(ids), + or_( + models.ActionHistory.operation == OperationEnum.created, + models.ActionHistory.operation == OperationEnum.new_version, + models.ActionHistory.operation == OperationEnum.released, + models.ActionHistory.operation == OperationEnum.retracted, + ), + ) + .order_by(models.ActionHistory.create_dt.desc()) + .all() + ) + + # This dict describes who edited the algoritme_version last. + # structure: + # algoritme_version_id : user_id + # published_ids = { + # '12345678': 'example@ictu.nl', + # '11111111': 'example2@ictu.nl', + # } + last_edited = {} + for history_point in algos_history: + id = history_point.algoritme_version_id + if id not in last_edited: + last_edited[id] = history_point.user_id summary_list = [] for latest_algo in latest_versions: - lars_code = getattr(latest_algo, "lars") + lars_code = latest_algo.lars summary_list.append( schemas.AlgorithmSummary( - name=getattr(latest_algo, "name"), - schema_version=getattr(latest_algo, "standard_version"), - last_update_dt=getattr(latest_algo, "create_dt"), - lars=getattr(latest_algo, "lars"), - source_id=getattr(latest_algo, "source_id"), + name=latest_algo.name, + schema_version=latest_algo.standard_version, + last_update_dt=latest_algo.create_dt, + lars=latest_algo.lars, + source_id=latest_algo.source_id, published=lars_code in published_ids, - current_version_released=getattr(latest_algo, "released"), - current_version_published=getattr(latest_algo, "published"), - last_update_by="Temporarily unavailable", + current_version_released=latest_algo.released, + current_version_published=latest_algo.published, + last_update_by=last_edited.get(latest_algo.id) or "Onbekend", ) ) return summary_list @@ -67,66 +105,70 @@ def get_all_newest( def get_one_newest( lars: str, db: Session, - user: schemas.User, -) -> models.AlgoritmeVersion: - newest_algo = get_latest_version_algo(lars, db) +) -> schemas.AlgoritmeVersionDB: + algoritme_version_repository = AlgoritmeVersionRepository(db) + newest_algo = algoritme_version_repository.get_latest_by_lars_by_lang( + lars, Language.NLD + ) if not newest_algo: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail=f"Er is geen algoritme met LARS-code: {lars}.", ) - newest_algo = db_list_to_python_list(newest_algo) return newest_algo def get_one_published( lars: str, db: Session, - user: schemas.User, -) -> models.AlgoritmeVersion: - newest_algo = get_published_version_algo(lars, db) +) -> schemas.AlgoritmeVersionDB: + algoritme_version_repository = AlgoritmeVersionRepository(db) + newest_algo = algoritme_version_repository.get_published_by_lars_by_lang( + lars, Language.NLD + ) if not newest_algo: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail=f"Er is geen gepubliceerd algoritme met LARS-code: {lars}.", ) - newest_algo = db_list_to_python_list(newest_algo) return newest_algo def post_one( as_org: str, - body, + body: schemas.AlgoritmeVersionContent, db: Session, user: schemas.User, ) -> schemas.NewAlgorithmResponse: - # Generate a unique id for this algorithm. - current_lars_list = [lars[0] for lars in db.query(models.Algoritme.lars).all()] - new_lars = upc.find_new_upc(avoid_upc_list=current_lars_list) + organisation_repo = OrganisationRepository(session=db) + algoritme_version_repo = AlgoritmeVersionRepository(session=db) + algoritme_repo = AlgoritmeRepository(session=db) + action_history_repo = ActionHistoryRepository(session=db) + + org = organisation_repo.get_by_code(as_org) + if not org: + raise HTTPException(status.HTTP_404_NOT_FOUND, detail="ORG_NOT_FOUND") + + # Generates a unique id for this algorithm. + current_lars_codes = algoritme_repo.get_all_lars() + new_lars = upc.find_new_upc(avoid_upc_list=current_lars_codes) + + algoritme = schemas.AlgoritmeIn(lars=new_lars, organisation_id=org.id) + algoritme_db = algoritme_repo.add(algoritme) # Creates new entry in algoritme_version table. - algoritme_version_dict = body.dict() - new_algoritme_version = models.AlgoritmeVersion(**algoritme_version_dict) - - # Creates new entry in algoritme table. - algoritme_dict = { - "lars": new_lars, - "owner": as_org, - "versions": [new_algoritme_version], - } - new_algoritme = models.Algoritme(**algoritme_dict) - - db.add(new_algoritme) - db.add(new_algoritme_version) - db.flush() - controllers.action_history.post_action( - models.OperationEnum.created, - str(new_algoritme_version.id), - db, - user, + algoritme_version = schemas.AlgoritmeVersionIn( + **body.dict(), algoritme_id=algoritme_db.id, language=Language.NLD ) - db.commit() + algoritme_version_db = algoritme_version_repo.add(algoritme_version) + # Logs action + action = schemas.ActionHistoryIn( + algoritme_version_id=algoritme_version_db.id, + operation=OperationEnum.created, + user_id=user.name, + ) + action_history_repo.add(action) return schemas.NewAlgorithmResponse(lars_code=new_lars) @@ -135,127 +177,255 @@ def retract_one( db: Session, user: schemas.User, ) -> None: - archived_id = retract_published_algo(lars, db) - if archived_id: - controllers.action_history.post_action( - models.OperationEnum.retracted, archived_id, db, user - ) + algoritme_version_repo = AlgoritmeVersionRepository(db) + action_history_repo = ActionHistoryRepository(db) + retracted_algoritme_versions = algoritme_version_repo.retract_by_lars(lars) + if (retracted_algoritme_versions) and (len(retracted_algoritme_versions) > 0): + for algo in retracted_algoritme_versions: + action_history_repo.add( + schemas.ActionHistoryIn( + algoritme_version_id=algo.id, + operation=OperationEnum.retracted, + user_id=user.name, + ) + ) else: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail=f"Er is geen gepubliceerd algoritme gevonden met LARS-code: ({lars})", ) - db.commit() - def release_one( lars: str, db: Session, user: schemas.User, ) -> schemas.AlgorithmActionResponse | None: - latest_version = get_latest_version_algo(lars, db) - if getattr(latest_version, "released"): - return schemas.AlgorithmActionResponse( - message="De laatste versie is al vrijgegeven." + algoritme_version_repository = AlgoritmeVersionRepository(db) + action_history_repository = ActionHistoryRepository(db) + latest_version = algoritme_version_repository.get_latest_by_lars_by_lang( + lars, Language.NLD + ) + if not latest_version: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail=f"Er kan geen algoritme met LARS-code: ({lars}) worden vrijgegeven.", ) - elif getattr(latest_version, "published"): + elif latest_version.released: + raise HTTPException( + status_code=status.HTTP_409_CONFLICT, + detail=f"Algoritme met LARS-code: ({lars}) is al vrijgegeven.", + ) + elif latest_version.published: raise HTTPException( status_code=status.HTTP_409_CONFLICT, detail="De laatste versie is al gepubliceerd. Deze kan niet worden vrijgegeven.", ) - unrelease_all_versions_algo(lars, db) - released_id = release_latest_version_algo(lars, db) + algoritme_version_repository.unrelease_by_lars(lars) + released_id = algoritme_version_repository.release_latest_by_lars(lars) if released_id: - controllers.action_history.post_action( - models.OperationEnum.released, released_id, db, user + action = schemas.ActionHistoryIn( + algoritme_version_id=released_id, + operation=OperationEnum.released, + user_id=user.name, ) - else: - raise HTTPException( - status_code=status.HTTP_404_NOT_FOUND, - detail=f"Er kan geen algoritme met LARS-code: ({lars}) worden vrijgegeven.", - ) - - db.commit() + action_history_repository.add(action) def publish_one( + background_tasks: BackgroundTasks, lars: str, db: Session, user: schemas.User, ) -> schemas.AlgorithmActionResponse | None: - latest_version = get_latest_version_algo(lars, db) - if getattr(latest_version, "published"): - return schemas.AlgorithmActionResponse( - message="The latest version is already published." + algoritme_version_repository = AlgoritmeVersionRepository(db) + action_history_repo = ActionHistoryRepository(db) + latest_nld = algoritme_version_repository.get_latest_by_lars_by_lang( + lars, Language.NLD + ) + if not latest_nld: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail=f"Er kan geen algoritme met LARS-code: ({lars}) worden gepubliceerd.", ) - elif not getattr(latest_version, "released"): - return schemas.AlgorithmActionResponse( - message="The latest version is not released." + elif latest_nld.published: + raise HTTPException( + status_code=status.HTTP_409_CONFLICT, + detail=f"Algoritme met LARS-code: ({lars}) is al gepubliceerd.", ) - - retracted_id = retract_published_algo(lars, db) - if retracted_id: - controllers.action_history.post_action( - models.OperationEnum.retracted, retracted_id, db, user + elif not latest_nld.released: + raise HTTPException( + status_code=status.HTTP_409_CONFLICT, + detail=f"Algoritme met LARS-code: ({lars}) is nog niet vrijgegeven.", ) - unrelease_all_versions_algo(lars, db) - published_id = publish_latest_version_algo(lars, db) - if published_id: - controllers.action_history.post_action( - models.OperationEnum.published, published_id, db, user + # Retract publication, all languages + published_algs = algoritme_version_repository.get_published_by_lars(lars) + for alg in published_algs: + alg.published = False + alg_to_retract = schemas.AlgoritmeVersionIn(**alg.dict()) + algoritme_version_repository.update_by_id(alg.id, alg_to_retract) + action_history_repo.add( + schemas.ActionHistoryIn( + algoritme_version_id=alg.id, + user_id=user.name, + operation=OperationEnum.retracted, + ) ) - else: - raise HTTPException( - status_code=status.HTTP_404_NOT_FOUND, - detail=f"Er kan geen algoritme met LARS-code: ({lars}) worden gepubliceerd.", + + # Publishes ENG: Copies data, translates and adds. + if env_settings.enable_translation: + latest_eng = schemas.AlgoritmeVersionIn(**dict(latest_nld)) + latest_eng_model = models.AlgoritmeVersion(**dict(latest_eng)) + background_tasks.add_task(apply_translation, latest_eng_model, db, user.name) + + # Publish NLD + latest_nld.published = True + latest_nld.released = False + latest_nld_update = schemas.AlgoritmeVersionIn(**dict(latest_nld)) + algoritme_version_repository.update_by_id(latest_nld.id, latest_nld_update) + action_history_repo.add( + schemas.ActionHistoryIn( + algoritme_version_id=latest_nld.id, + user_id=user.name, + operation=OperationEnum.published, ) + ) - db.commit() + +def apply_translation( + algo: models.AlgoritmeVersion, db: Session, user: str +) -> schemas.AlgoritmeVersionIn: + algo = db_list_to_python_list(algo) + preprocessor = translation.Preprocessor( + algo, + attrs_to_delete=[ + "id", + "create_dt", + "algoritme", + "lars", + "owner", + "published", + "released", + "preview_active", + ], + ) + # 1. Add the non-translatable fields as-is + translated_dict = preprocessor.get_non_translatable_fields() + + # 2. Add translations for fields that have a list as value + list_fields = preprocessor.get_list_fields() + list_translator = translation.ListValuesTranslator(field_dict=list_fields) + translation_response = list_translator.translate( + preprocessor.translation_spec["default_translations"] + ) + translated_dict.update(translation_response.fields) + + # 3. Add translations for fields that need automatic translation + auto_translate_fields = preprocessor.get_auto_translate_fields() + auto_translator = translation.AutoTranslator(field_dict=auto_translate_fields) + translation_response = auto_translator.translate() + translated_dict.update(translation_response.fields) + + # 4. Translate the fields that have a default translation + default_translator = translation.DefaultValuesTranslator( + field_dict=preprocessor.get_default_translate_fields() + ) + translation_response = default_translator.translate( + preprocessor.translation_spec["default_translations"] + ) + translated_dict.update(translation_response.fields) + + # 5. Truncate the fields that are too long + preprocessor.truncate_fields(translated_dict) + + # 6. Save the translations + algoritme_version = save_translation(algo, db, translated_dict, user) + return algoritme_version + + +def save_translation(algo, db, translated_dict, user): + """ + Saves the translation to the database. + """ + algoritme_version = schemas.AlgoritmeVersionIn(**translated_dict) + algoritme_version.language = Language.ENG + algoritme_version.create_dt = algo.create_dt # Date should be the same + algoritme_version.published = True + algoritme_version.released = False + algoritme_version.preview_active = False + + algoritme_version_repository = AlgoritmeVersionRepository(db) + algoritme_version_db = algoritme_version_repository.add(algoritme_version) + + action_history_repository = ActionHistoryRepository(db) + action = schemas.ActionHistoryIn( + algoritme_version_id=algoritme_version_db.id, + operation=OperationEnum.created, + user_id=user, + ) + action_history_repository.add(action) + action = schemas.ActionHistoryIn( + algoritme_version_id=algoritme_version_db.id, + operation=OperationEnum.published, + user_id=user, + ) + action_history_repository.add(action) + + return algoritme_version def update_new_version( - body, + body: schemas.AlgoritmeVersionContent, lars: str, db: Session, user: schemas.User, ) -> schemas.AlgorithmActionResponse | None: - algoritme = db.query(models.Algoritme).filter(models.Algoritme.lars == lars).first() - if not algoritme: - raise HTTPException( - status_code=status.HTTP_404_NOT_FOUND, - detail=f"Er is geen algoritme gevonden met LARS-code: ({lars})", - ) + algoritme_repo = AlgoritmeRepository(db) + algoritme_version_repo = AlgoritmeVersionRepository(db) + action_history_repo = ActionHistoryRepository(db) - # Store new entry - new_algoritme_version = body.dict() - new_algoritme_version["algoritme_id"] = algoritme.id - new_version_model = models.AlgoritmeVersion(**new_algoritme_version) + algoritme = algoritme_repo.get_by_lars(lars) + if not algoritme: + raise HTTPException(status.HTTP_404_NOT_FOUND, "ALGORITHM_NOT_FOUND") - # Compare with current entry - latest_version = get_latest_version_algo(lars, db) - change_found = find_version_changes(latest_version, new_version_model) + latest_version = algoritme_version_repo.get_latest_by_lars_by_lang( + lars, Language.NLD + ) + if not latest_version: + raise HTTPException(status.HTTP_404_NOT_FOUND, "ALGORITHM_NOT_FOUND") + change_found = find_version_changes( + schemas.AlgoritmeVersionContent(**latest_version.dict()), body + ) if not change_found: - return schemas.AlgorithmActionResponse(message="Version has no changes.") + return schemas.AlgorithmActionResponse(message="NO_CHANGES") - db.add(new_version_model) - db.flush() - controllers.action_history.post_action( - models.OperationEnum.new_version, str(new_version_model.id), db, user + # Build new version + new_version = schemas.AlgoritmeVersionIn( + **body.dict(), algoritme_id=algoritme.id, language=Language.NLD + ) + new_version = algoritme_version_repo.add(new_version) + action_history_repo.add( + schemas.ActionHistoryIn( + algoritme_version_id=new_version.id, + operation=OperationEnum.new_version, + user_id=user.name, + ) ) - db.commit() def get_preview_link(lars: str, db: Session, user: schemas.User) -> schemas.PreviewUrl: - preview_id = set_preview_active(lars=lars, db=db) - if preview_id: - controllers.action_history.post_action( - action=models.OperationEnum.preview_activated, - algoritme_version_id=str(preview_id), - db=db, - user=user, + algoritme_version_repo = AlgoritmeVersionRepository(db) + action_history_repo = ActionHistoryRepository(db) + previewed_algo = algoritme_version_repo.preview_latest_by_lars(lars) + if previewed_algo: + action_history_repo.add( + schemas.ActionHistoryIn( + algoritme_version_id=previewed_algo.id, + operation=OperationEnum.preview_activated, + user_id=user.name, + ) ) else: raise HTTPException( @@ -263,13 +433,13 @@ def get_preview_link(lars: str, db: Session, user: schemas.User) -> schemas.Prev detail=f"Er is geen algoritme gevonden met LARS-code: ({lars})", ) - db.commit() - url = f"{env_settings.preview_url}/algoritme/C{lars}" + url = f"{env_settings.preview_url}/nl/algoritme/C{lars}" return schemas.PreviewUrl(url=url) -def remove_one(lars: str, db: Session, user: schemas.User) -> None: - n_removed = remove_all_versions_algo(lars=lars, db=db) +def remove_one(lars: str, db: Session) -> None: + algoritme_repository = AlgoritmeRepository(db) + n_removed = algoritme_repository.delete_by_lars(lars) if n_removed == 0: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, diff --git a/backend/app/controllers/algoritme_version/util.py b/backend/app/controllers/algoritme_version/util.py index a8316973..0141d081 100644 --- a/backend/app/controllers/algoritme_version/util.py +++ b/backend/app/controllers/algoritme_version/util.py @@ -1,133 +1,12 @@ from sqlalchemy.orm import Session -from sqlalchemy import desc, func, and_ from threading import Timer from app.config.settings import Settings -from app import models, controllers +from app import schemas +from app.repositories import ActionHistoryRepository, AlgoritmeVersionRepository env_settings = Settings() -def get_published_version_algo(id: str, db: Session) -> models.AlgoritmeVersion | None: - published_algo = ( - db.query(models.AlgoritmeVersion) - .filter( - models.AlgoritmeVersion.published, - models.AlgoritmeVersion.lars == id, - ) - .first() - ) - return published_algo - - -def get_published_versions_algo( - as_org: str, db: Session -) -> list[models.AlgoritmeVersion] | None: - published_algo = ( - db.query(models.AlgoritmeVersion) - .filter( - models.AlgoritmeVersion.published, - models.AlgoritmeVersion.owner == as_org, - ) - .all() - ) - return published_algo - - -def get_latest_version_algo(id: str, db: Session) -> models.AlgoritmeVersion | None: - query = ( - db.query(models.AlgoritmeVersion) - .filter(models.AlgoritmeVersion.lars == id) - .order_by(desc(models.AlgoritmeVersion.create_dt)) - ) - latest_algo = query.first() - return latest_algo - - -def get_latest_versions_algo(as_org: str, db: Session) -> list[models.AlgoritmeVersion]: - subquery = ( - db.query( - models.AlgoritmeVersion.algoritme_id, - func.max(models.AlgoritmeVersion.create_dt).label("max_creation_dt"), - ) - .group_by(models.AlgoritmeVersion.algoritme_id) - .subquery() - ) - query = ( - db.query(models.AlgoritmeVersion) - .join( - subquery, - and_( - models.AlgoritmeVersion.algoritme_id == subquery.c.algoritme_id, - models.AlgoritmeVersion.create_dt == subquery.c.max_creation_dt, - ), - ) - .filter( - models.AlgoritmeVersion.owner == as_org, - ) - ) - query_result = query.all() - return query_result - - -def retract_published_algo(id: str, db: Session) -> str | None: - query = db.query(models.AlgoritmeVersion).filter( - models.AlgoritmeVersion.published, - models.AlgoritmeVersion.lars == id, - ) - row = query.first() - if row: - update_is_succesful = query.update( - { - models.AlgoritmeVersion.published: False, - models.AlgoritmeVersion.released: False, - }, - synchronize_session=False, - ) - if update_is_succesful: - return row.id - - -def release_latest_version_algo(id: str, db: Session) -> str | None: - latest_version = get_latest_version_algo(id, db) - if latest_version: - setattr(latest_version, "released", True) - return str(latest_version.id) - - -def unrelease_all_versions_algo(id: str, db: Session) -> str | None: - n_unreleased = ( - db.query(models.AlgoritmeVersion) - .filter(models.AlgoritmeVersion.lars == id) - .update( - { - models.AlgoritmeVersion.released: False, - }, - synchronize_session="fetch", - ) - ) - return n_unreleased - - -def publish_latest_version_algo(id: str, db: Session) -> str | None: - latest_version = get_latest_version_algo(id, db) - if latest_version: - setattr(latest_version, "published", True) - return str(latest_version.id) - - -def set_preview_active(lars: str, db: Session) -> str | None: - latest_algo = ( - db.query(models.AlgoritmeVersion) - .filter(models.AlgoritmeVersion.lars == lars) - .order_by(desc(models.AlgoritmeVersion.create_dt)) - ).first() - if not latest_algo: - return - setattr(latest_algo, "preview_active", True) - db.commit() - return latest_algo.id - - def wait_then_disable_preview(lars: str, db: Session) -> None: S = Timer( env_settings.retract_preview_time, @@ -136,53 +15,37 @@ def wait_then_disable_preview(lars: str, db: Session) -> None: "lars": lars, "db": db, "user": "system", - "reason": models.OperationEnum.preview_timeout, + "reason": schemas.OperationEnum.preview_timeout, }, ) S.start() -def get_preview_algo(lars: str, db: Session): - preview_algo = ( - db.query(models.AlgoritmeVersion) - .filter( - models.AlgoritmeVersion.lars == lars, models.AlgoritmeVersion.preview_active - ) - .first() - ) - return preview_algo - - def disable_preview( - lars: str, db: Session, user: str, reason: models.OperationEnum + lars: str, db: Session, user: str, reason: schemas.OperationEnum ) -> bool: - preview_algo = get_preview_algo(lars, db) + algoritme_version_repo = AlgoritmeVersionRepository(db) + action_history_repo = ActionHistoryRepository(db) + + preview_algo = algoritme_version_repo.unpreview_by_lars(lars) if not preview_algo: return False - setattr(preview_algo, "preview_active", False) - controllers.action_history.post_action( - action=reason, - algoritme_version_id=preview_algo.id, - db=db, - user=user, + action_history_repo.add( + schemas.ActionHistoryIn( + algoritme_version_id=preview_algo.id, user_id=user, operation=reason + ) ) - db.commit() return True -def find_version_changes(v1, v2) -> bool: - ignore_attributes = ["id", "published", "released", "preview_active", "create_dt"] - for each in v1.__table__.columns: - attribute = str(each).split(".")[-1] - old_attribute = getattr(v1, attribute) - new_attribute = getattr(v2, attribute) - if (old_attribute != new_attribute) and attribute not in ignore_attributes: +def find_version_changes( + v1: schemas.AlgoritmeVersionContent, v2: schemas.AlgoritmeVersionContent +) -> bool: + """ + Compares two algoritme_versions. + Return true if at least one difference is found. + """ + for key in dict(v1).keys(): + if getattr(v1, key) != getattr(v2, key): return True return False - - -def remove_all_versions_algo(lars: str, db: Session) -> int: - n_removed = ( - db.query(models.Algoritme).filter(models.Algoritme.lars == lars).delete() - ) - return n_removed diff --git a/backend/app/controllers/c3po.py b/backend/app/controllers/c3po.py new file mode 100644 index 00000000..b8c6e877 --- /dev/null +++ b/backend/app/controllers/c3po.py @@ -0,0 +1,131 @@ +import requests +from fastapi import HTTPException, status +from app.controllers import collect_structure_data, get_ttl_hash +from app.schemas import ( + C3poRequest, + User, + ProcessingRequest, + C3poResults, + RuleSetOut, + Rule, + ProcessingRequestOut, +) +from functools import lru_cache +from app.config.settings import Settings +import time +from app.util.logger import get_logger +from app.util.html import strip_html + +logger = get_logger(__name__) +env_settings = Settings() + + +def get_c3po(url: str) -> requests.Response: + try: + response = requests.request("get", url) + + if response.status_code != 200: + raise HTTPException( + status_code=status.HTTP_424_FAILED_DEPENDENCY, + detail=f"C3PO_REQUEST_FAILED: {response.status_code}", + ) + return response + except requests.ConnectionError: + raise HTTPException( + status_code=status.HTTP_424_FAILED_DEPENDENCY, + detail="C3PO_CONN_ERROR", + ) + + +def post_c3po_request(data: ProcessingRequestOut) -> requests.Response: + try: + post_response = requests.post( + f"{env_settings.c3po_url}/processing-request/", json=data + ) + + if post_response.status_code != 200: + raise HTTPException( + status_code=status.HTTP_424_FAILED_DEPENDENCY, + detail=f"C3PO_REQUEST_FAILED: {post_response.status_code}", + ) + return post_response + except requests.ConnectionError: + raise HTTPException( + status_code=status.HTTP_424_FAILED_DEPENDENCY, + detail="C3PO_CONN_ERROR", + ) + + +@lru_cache(maxsize=1) +def get_version_rules() -> list[RuleSetOut]: + response = get_c3po(f"{env_settings.c3po_url}/rule/") + + # approach is all rules for all fields with allowed html tags + rules = [] + for rule in response.json(): + rule_model = Rule(**rule) + + rules.append( + { + "rule_code": rule_model.rule_code, + "rule_variant": rule_model.rule_variant, + "description": rule_model.description, + "severity_level": rule_model.severity_level, + } + ) + + schemas, _ = collect_structure_data(get_ttl_hash(60)) + schema = schemas["0.4.0"] + rule_sets: list[RuleSetOut] = [] + for key in schema.keys(): + rule_set = {"code": key, "rules": rules} + rule_set_model = RuleSetOut(**rule_set) + if schema[key].allowed_html_tags is None: + continue + rule_sets.append(rule_set_model) + + return rule_sets + + +async def forward_request(body: C3poRequest, user: User) -> C3poResults: + rule_response = get_c3po(f"{env_settings.c3po_url}/rule/") + rules = [rule["rule_code"] for rule in rule_response.json()] + text_raw = strip_html(body.text) + data: ProcessingRequestOut = {"payload": text_raw, "rule_codes": rules} + post_response = post_c3po_request(data).json() + request_id = post_response["processing_request_id"] + + tries = 0 + time.sleep(1) + max_tries = 60 + results = [] + while tries < max_tries: + response = get_c3po(f"{env_settings.c3po_url}/processing-request/{request_id}") + + response_model = ProcessingRequest(**response.json()) + + results = [] + for task_result in response_model.tasks: + if task_result.status in ["new", "pending"]: + continue + + results.append( + { + "rule_code": task_result.rule.rule_code, + "description": task_result.rule.description, + "feedback_message": task_result.feedback_message, + "result": task_result.result, + } + ) + + if len(results) == len(rules): + break + time.sleep(1) + logger.info( + f"Collected {len(results)}/{len(rules)} results, trying {max_tries - tries -1} more times..." + ) + tries += 1 + + response = {"rules": results} + response = C3poResults(**response) + return response diff --git a/backend/app/controllers/excel_download.py b/backend/app/controllers/excel_download.py index 75278aea..21fffd16 100644 --- a/backend/app/controllers/excel_download.py +++ b/backend/app/controllers/excel_download.py @@ -1,33 +1,155 @@ import datetime -from io import BytesIO +import io +from typing import Literal import pandas as pd +from functools import lru_cache +from sqlalchemy.orm import Session from fastapi.responses import StreamingResponse +from fastapi import HTTPException, status from app import schemas -from app.controllers.algoritme_version.util import get_latest_versions_algo +from app.repositories import AlgoritmeVersionRepository +from app.schemas.versions import create_algorithm_in_schema +from app.util.config_load import get_ttl_hash, collect_structure_data +from app.util.stringify import stringify -excel_schema = schemas.get_algorithm_export_schema(truncated=True) +version_options = Literal["published", "latest"] -def prepare_download(db, org_name: str): + +@lru_cache(maxsize=8) +def get_column_name_mapping(version: str) -> dict[str, str]: + standards, _ = collect_structure_data(get_ttl_hash()) + + standard = standards[version] + mapping = {} + for key in standard.keys(): + mapping[key] = standard[key].title + return mapping + + +def get_excel_data( + db: Session, + lars: str | None, + org_name: str | None, + lang: schemas.Language, + which_version: version_options, +) -> list[schemas.AlgoritmeVersionDownload]: """ Prepare algorithm data for download. - If org_name is None, return all data else filter on org_name """ - algorithms = get_latest_versions_algo(org_name, db) - # Use schema to filter output of query - data = [excel_schema.from_orm(row).dict() for row in algorithms] - df = pd.DataFrame(data) - df = df.replace(r"\n", "", regex=True) - return df + algoritme_version_repository = AlgoritmeVersionRepository(db) + algorithms: list[schemas.AlgoritmeVersionDB] = [] + + if org_name: + if which_version == "latest": + algorithms = algoritme_version_repository.get_latest_by_org_by_lang( + org_name, lang + ) + elif which_version == "published": + algorithms = algoritme_version_repository.get_published_by_org_by_lang( + org_name, lang + ) + elif lars: + if which_version == "latest": + algorithm = algoritme_version_repository.get_latest_by_lars_by_lang( + lars, lang + ) + elif which_version == "published": + algorithm = algoritme_version_repository.get_published_by_lars_by_lang( + lars, lang + ) + if not algorithm: + return [] + algorithms = [algorithm] + else: + if which_version == "latest": + algorithms = algoritme_version_repository.get_latest_by_lang(lang) + if which_version == "published": + algorithms = algoritme_version_repository.get_published_by_lang(lang) + return [schemas.AlgoritmeVersionDownload(**alg.dict()) for alg in algorithms] + + +def build_excel_doc( + algorithms: list[schemas.AlgoritmeVersionDownload], +) -> io.BytesIO: + dataframes: dict[str, pd.DataFrame] = {} + for algorithm in algorithms: + # Detect version filter based on that schema + std = algorithm.standard_version + if not std: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, detail="STANDARD_VALUE_NOT_FOUND" + ) + schema = create_algorithm_in_schema("v" + std.replace(".", "_")) + data = schema(**algorithm.dict()).dict() + + # Remove lists from data + stringified_data = {key: stringify(data[key]) for key in data.keys()} + + # Group DataFrames by standard_version + if std not in dataframes: + dataframes[std] = pd.DataFrame(stringified_data, index=[0]) + else: + df = pd.DataFrame(stringified_data, index=[0]) + dataframes[std] = pd.concat([dataframes[std], df], ignore_index=True) + + stream = io.BytesIO() + with pd.ExcelWriter(stream) as writer: + for key in dataframes.keys(): + df = dataframes[key] + df = df.rename(columns=get_column_name_mapping(key)) + df = df.replace(r"\n", "", regex=True).T + df.to_excel(writer, sheet_name=key, index=True, header=False) + stream.seek(0) + + return stream + + +def generate_excel_download( + db: Session, + lang: schemas.Language = schemas.Language.NLD, + *, + org_name: str | None = None, + lars: str | None = None, + which_version: version_options = "published", +): + """ + Generates excel file. Can do so for all descriptions under and org or a single one (by lars). + Args: + - db (Session): SQLAlchemy Session + - lang (Language): specified language, defaults to NLD + *, + - org_name (str|None): organisation name. Causes excel to be for whole organisation + - lars (str|None): lars-code for a description. Causes excel to be for one description only. + Either org_name or lars can be specified, never both. If neither are specified, the whole DB will be queried. + - which_version (published|latest): Specifies whether you want the published version or the latest + (possibly unpublished) version. + """ + if lars and org_name: + raise ValueError("Please enter one of two identifiers: lars | org_name") + + algorithms = get_excel_data(db, lars, org_name, lang, which_version) + if len(algorithms) == 0: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail="NO_DATA_FOUND", + ) + + stream = build_excel_doc(algorithms) -def generate_excel_download(db, org_name): - df = prepare_download(db, org_name).T timestamp = datetime.datetime.now().strftime("%Y%m%d") - filename = f"overzicht_algoritmen_{timestamp}.xlsx" - file_object = BytesIO() - df.to_excel(file_object, index=True, header=False) - file_object.seek(0) - headers = {"Content-Disposition": f"attachment; {filename}"} + filename: str = "" + if lars: + filename = f"{algorithms[0].name} {timestamp}.xlsx" + elif org_name: + filename = ( + f"Algoritmebeschrijvingen van {algorithms[0].organization} {timestamp}.xlsx" + ) + else: + filename = f"Algoritmebeschrijvingen {timestamp}.xlsx" + media_type = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" - return StreamingResponse(file_object, headers=headers, media_type=media_type) + response = StreamingResponse(io.BytesIO(stream.read()), media_type=media_type) + response.headers["Content-Disposition"] = f'attachment; filename="{filename}"' + return response diff --git a/backend/app/controllers/mailing.py b/backend/app/controllers/mailing.py index dd66f9b1..10c2347a 100644 --- a/backend/app/controllers/mailing.py +++ b/backend/app/controllers/mailing.py @@ -1,8 +1,9 @@ +import pytz from fastapi import Depends -from app import middleware, mailing, models -from app.config.settings import Settings +from sqlalchemy import text from datetime import datetime -import pytz +from app.config.settings import Settings +from app import middleware, mailing, models, schemas env_settings = Settings() @@ -18,6 +19,37 @@ def handle_release_mail(lars: str, db=Depends(middleware.get_db)): .first() ) + editor_name_query: models.ActionHistory = ( + db.query(models.ActionHistory) + .filter(models.ActionHistory.algoritme_version_id == algoritme_version.id) + .order_by(models.ActionHistory.create_dt.desc()) + .first() + ) + editor_name = editor_name_query.user_id + + previous_publication_count = db.execute( + text( + """ select count(*) + from action_history h + inner join algoritme_version v on v.id = h.algoritme_version_id + inner join algoritme a on a.id = v.algoritme_id + where + h.operation = 'published' + and a.lars = :lars + ;""" + ), + {"lars": algoritme_version.lars}, + ) + if previous_publication_count.scalar() == 0: + subject = f"Vrijgave voor eerste publicatie: {algoritme_version.name}" + first_publication_addendum = ( + "

    Deze beschrijving is nog niet eerder gepubliceerd.

    " + ) + else: + subject = f"Vrijgave voor publicatie: {algoritme_version.name}" + first_publication_addendum = "" + + print(subject) webform_link = f"{WEBFORM_URL}/algoritme/{algoritme_version.lars}/bewerken" time = datetime.time( @@ -26,7 +58,7 @@ def handle_release_mail(lars: str, db=Depends(middleware.get_db)): receivers = ["devops@ictu.nl"] sender = DEFAULT_SENDER - subject = f"Vrijgave algoritme: {algoritme_version.name}" + plain_message = f"""Beste beheerder, Er is een nieuw algoritme vrijgegeven van de organisatie {algoritme_version.organization}.""" html_message = f""" @@ -34,19 +66,74 @@ def handle_release_mail(lars: str, db=Depends(middleware.get_db)):

    Een nieuwe versie van algoritmebeschrijving {algoritme_version.name} [{algoritme_version.lars}] is - op {datetime.date(datetime.now())} om {time} vrijgegeven voor publicatie. + door {editor_name} van {algoritme_version.organization}, + op {datetime.date(datetime.now())} om {time} + vrijgegeven voor publicatie.

    Gelieve deze beschrijving te reviewen en bij goedkeuring te publiceren via deze link .

    Gelieve bij afkeuring contact op te nemen met de algoritmehouder om af te stemmen welke aanpassing nodig is.

    + {first_publication_addendum} + +

    Dit is een automatisch bericht.

    + + + """ + + mailing.send_notification_mail( + receivers=receivers, + sender=sender, + subject=subject, + plain_message=plain_message, + html_message=html_message, + ) + + +def handle_retract_mail(lars: str, db=Depends(middleware.get_db)): + algoritme_version: models.AlgoritmeVersion = ( + db.query(models.AlgoritmeVersion) + .filter( + models.AlgoritmeVersion.lars == lars, + models.AlgoritmeVersion.language == schemas.Language.NLD, + ) + .order_by(models.AlgoritmeVersion.create_dt.desc()) + .first() + ) + + editor_name_query: models.ActionHistory = ( + db.query(models.ActionHistory) + .filter(models.ActionHistory.algoritme_version_id == algoritme_version.id) + .order_by(models.ActionHistory.create_dt.desc()) + .first() + ) + editor_name = editor_name_query.user_id + + time = datetime.time( + datetime.now().astimezone(pytz.timezone("Europe/Amsterdam")) + ).strftime("%H:%M") + + receivers = ["devops@ictu.nl"] + sender = DEFAULT_SENDER + subject = f"Ingetrokken: {algoritme_version.name}" + plain_message = f"""Beste beheerder, Er is een algoritme ingetrokken + van de organisatie {algoritme_version.organization}.""" + html_message = f""" + + +

    + Een algoritmebeschrijving: {algoritme_version.name} [{algoritme_version.lars}] is + door {editor_name} van {algoritme_version.organization}, op {datetime.date(datetime.now())} om + {time} ingetrokken. +

    +

    Dit is een automatisch bericht.

    """ - mailing.send_release_notification_mail( + mailing.send_notification_mail( receivers=receivers, sender=sender, subject=subject, diff --git a/backend/app/controllers/organization.py b/backend/app/controllers/organization.py new file mode 100644 index 00000000..86344c16 --- /dev/null +++ b/backend/app/controllers/organization.py @@ -0,0 +1,79 @@ +from fastapi import HTTPException, status +from sqlalchemy.orm import Session +from app import schemas, models +from app.repositories.organisation import OrganisationRepository + + +def get_orgs(db: Session, user: schemas.User) -> list[schemas.OrganisationIn]: + if user.role == "publisher" or user.role == "admin": + all_orgs = ( + db.query(models.Organisation).order_by(models.Organisation.name).all() + ) + return [schemas.OrganisationIn.from_orm(org) for org in all_orgs] + else: + org_list = user.organizations + some_orgs = ( + db.query(models.Organisation) + .order_by(models.Organisation.name) + .filter(models.Organisation.code.in_(org_list)) + .all() + ) + if not some_orgs: + return [] + return [schemas.OrganisationIn.from_orm(org) for org in some_orgs] + + +def is_unique_code(db: Session, organisation: schemas.OrganisationIn) -> bool: + """Test for presence of the organisation code in the DB. If found, throws an HTTPExcetion""" + organisation_repo = OrganisationRepository(db) + duplicate_code = organisation_repo.get_by_code(organisation.code) + if duplicate_code is not None: + raise HTTPException(status_code=status.HTTP_409_CONFLICT, detail="CODE_TAKEN") + return True + + +def is_unique_name(db: Session, organisation: schemas.OrganisationIn) -> bool: + """Test for presence of the organisation name in the DB. If found, throws an HTTPExcetion""" + organisation_repo = OrganisationRepository(db) + duplicate_name = organisation_repo.get_by_name(organisation.name) + if duplicate_name is not None: + raise HTTPException(status_code=status.HTTP_409_CONFLICT, detail="NAME_TAKEN") + return True + + +def create_org(db: Session, organisation: schemas.OrganisationIn): + is_unique_name(db, organisation) + is_unique_code(db, organisation) + + org_model = models.Organisation(**organisation.dict()) + db.add(org_model) + db.commit() + + +def update_org(db: Session, org_code: str, organisation: schemas.OrganisationIn): + if org_code != organisation.code: + # On code change, test for uniqueness. + is_unique_code(db, organisation) + + current_org_query = db.query(models.Organisation).filter( + models.Organisation.code == org_code + ) + current_org: models.Organisation | None = current_org_query.first() + if not current_org: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, detail="ORG_NOT_FOUND" + ) + + if current_org.name != organisation.name: + # On name change, test for uniqueness. + is_unique_name(db, organisation) + + current_org_query.update( + { + models.Organisation.code: organisation.code, + models.Organisation.name: organisation.name, + models.Organisation.type: organisation.type, + }, + synchronize_session=False, + ) + db.commit() diff --git a/backend/app/controllers/pdf_download.py b/backend/app/controllers/pdf_download.py new file mode 100644 index 00000000..39a652c4 --- /dev/null +++ b/backend/app/controllers/pdf_download.py @@ -0,0 +1,169 @@ +import datetime +import io +from fastapi.responses import StreamingResponse +from fastapi import HTTPException, status +from sqlalchemy.orm import Session +from .pdf_wrapper import TextStyle, PDF +from app import schemas +from app.schemas.config.types import SchemaProperty +from app.config.layouts.types import LayoutJson +from app.repositories import AlgoritmeVersionRepository +from app.util.config_load import get_ttl_hash, collect_structure_data +from app.util.stringify import stringify + + +def get_org_data(db: Session, org_name: str) -> list[schemas.AlgoritmeVersionDownload]: + algoritme_version_repository = AlgoritmeVersionRepository(db) + algorithms = algoritme_version_repository.get_latest_by_org_by_lang( + org_name, schemas.Language.NLD + ) + return [schemas.AlgoritmeVersionDownload(**row.dict()) for row in algorithms] + + +def get_algo_data(db: Session, lars: str) -> schemas.AlgoritmeVersionDownload | None: + algoritme_version_repository = AlgoritmeVersionRepository(db) + algorithm = algoritme_version_repository.get_latest_by_lars_by_lang( + lars, schemas.Language.NLD + ) + if algorithm: + return schemas.AlgoritmeVersionDownload(**algorithm.dict()) + + +def build_description( + pdf: PDF, + algorithm: schemas.AlgoritmeVersionDownload, + layout: LayoutJson, + schema: dict[str, SchemaProperty], +) -> PDF: + pdf.next_page() + + pdf.add_heading(f"{algorithm.name} ({algorithm.lars})", TextStyle.H2) + pdf.add_paragraph(f"Publicatiestandaard: {algorithm.standard_version}") + pdf.print_block() + + for tab_group in layout.tabsGrouping: + pdf.add_heading(tab_group.label, TextStyle.H3) + pdf.print_block(lower_limit=0.25) + + field_list = tab_group.rows + for field in field_list: + key: str = f"{algorithm.lars}__{field}" + value: str = stringify(getattr(algorithm, field)) + if not value: + value = "" + max_length: int = schema[field].max_length or 1000 + pdf.add_heading(schema[field].title, TextStyle.H4) + pdf.add_textfield(value, key, max_length=max_length) + pdf.print_block() + return pdf + + +def get_all_algorithm_pdf(db: Session, org_name: str): + data = get_org_data(db, org_name) + if len(data) == 0: + return None, None + + organisation = data[0].organization + timestamp = datetime.datetime.now().strftime("%Y-%m-%d") + + pdf = PDF() + author = "Webformulier van het Algoritmeregister" + title = f"Algoritmebeschrijvingen van {organisation}" + subject = f"Algoritmebeschrijvingen van {organisation}" + pdf.set_metadata(author=author, title=title, subject=subject) + + introduction: str = f"""Dit document bevat algoritmebeschrijvingen van {organisation} \ +uitgedraaid op {timestamp}.\n Gebruik het om algoritmebeschrijvingen intern te reviewen \ +en wijzigingen te accorderen voor publicatie \nop het algoritmeregister van de Nederlandse \ +overheid. Heeft u vragen of heeft u hulp nodig? \n\ +Neem via mail contact op met: algoritmeregister@minbzk.nl.""" + + pdf.add_heading("Algoritmebeschrijvingen", TextStyle.H1) + pdf.add_heading(f"Algoritmes van {organisation}", TextStyle.SUBTITLE) + pdf.add_paragraph(introduction) + pdf.print_block() + + schemas, layouts = collect_structure_data(get_ttl_hash()) + for algorithm in data: + if not algorithm.standard_version: + raise HTTPException(status.HTTP_404_NOT_FOUND, "STANDARD_VALUE_NOT_FOUND") + schema = schemas[algorithm.standard_version] + layout = layouts[algorithm.standard_version] + pdf = build_description(pdf, algorithm, layout, schema) + + pdf.save() + stream = pdf.stream + stream.seek(0) + + filename = f"Algoritmebeschrijvingen van {organisation} op {timestamp}.pdf" + return stream, filename + + +def get_one_algorithm_pdf(db: Session, lars: str): + algorithm = get_algo_data(db, lars) + if not algorithm: + return None, None + + organisation = algorithm.organization + name = algorithm.name + timestamp = datetime.datetime.now().strftime("%Y-%m-%d") + + pdf = PDF() + author = "Webformulier van het Algoritmeregister" + title = f"Algoritmebeschrijving van {organisation}" + subject = f"Algoritmebeschrijving van {organisation}" + pdf.set_metadata(author=author, title=title, subject=subject) + + introduction: str = f"""Dit document bevat de algoritmebeschrijving: {name},\n \ +uitgedraaid op {timestamp}. Gebruik het om de inhoud intern te reviewen \ +en wijzigingen te accorderen \n voor publicatie op het algoritmeregister van de Nederlandse \ +overheid. Heeft u vragen of heeft u hulp nodig? \n\ +Neem via mail contact op met: algoritmeregister@minbzk.nl.""" + + pdf.add_heading("Algoritmebeschrijvingen", TextStyle.H1) + pdf.add_heading(f"Algoritmes van {organisation}", TextStyle.SUBTITLE) + pdf.add_paragraph(introduction) + pdf.print_block() + + schemas, layouts = collect_structure_data(get_ttl_hash()) + if not algorithm.standard_version: + raise HTTPException(status.HTTP_404_NOT_FOUND, "STANDARD_VALUE_NOT_FOUND") + schema = schemas[algorithm.standard_version] + layout = layouts[algorithm.standard_version] + + pdf = build_description(pdf, algorithm, layout, schema) + + pdf.save() + stream = pdf.stream + stream.seek(0) + + filename = f"{algorithm.name} {timestamp}.pdf" + return stream, filename + + +def generate_pdf_download( + db: Session, *, org_name: str | None = None, lars: str | None = None +): + if lars: + stream, filename = get_one_algorithm_pdf(db, lars) + elif org_name: + stream, filename = get_all_algorithm_pdf(db, org_name) + else: + raise ValueError("Please enter one of two identifiers: lars | org_name") + + if stream is None: + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail="No algorithm descriptions found. Unable to make document", + ) + media_type = ( + "application/vnd.openxmlformats-officedocument.wordprocessingml.document" + ) + response = StreamingResponse(io.BytesIO(stream.read()), media_type=media_type) + + response.headers["Content-Disposition"] = f'attachment; filename="{filename}"' + return response + + +if __name__ == "__main__": + collect_structure_data() diff --git a/backend/app/controllers/pdf_wrapper/__init__.py b/backend/app/controllers/pdf_wrapper/__init__.py new file mode 100644 index 00000000..0e57627c --- /dev/null +++ b/backend/app/controllers/pdf_wrapper/__init__.py @@ -0,0 +1,4 @@ +from .types import * # noqa +from .style_config import font_styles_config # noqa +from .canvas import CanvasEditor # noqa +from .pdf import PDF # noqa diff --git a/backend/app/controllers/pdf_wrapper/canvas.py b/backend/app/controllers/pdf_wrapper/canvas.py new file mode 100644 index 00000000..e0189892 --- /dev/null +++ b/backend/app/controllers/pdf_wrapper/canvas.py @@ -0,0 +1,102 @@ +from typing import Tuple +from reportlab.lib.pagesizes import A4 +from reportlab.pdfgen import canvas +from reportlab.pdfgen.textobject import PDFTextObject +from . import font_styles_config +from . import TextStyle, StyleDict, TextFieldEntry, TextEntry, TextBlockConfig + + +def prepare_text_for_textfield(value: str | None) -> str: + if not value: + return "" + value = value.replace("’", "'") + value = value.replace("‘", "'") + value = value.replace("≥", ">") + value = value.replace("“", '"') + value = value.replace("”", '"') + value = value.replace("–", "-") + value = value.replace("‑", "-") + value = value.replace("•", "") + return value + + +class CanvasEditor(canvas.Canvas): + y_start = 780 + x_start = 50 + y_end = 50 + + def __init__(self, stream): + super().__init__(stream, pagesize=A4) + + self._x: int = self.x_start + self._y: int = self.y_start + self.styles: dict[TextStyle, StyleDict] = font_styles_config + + def next_page(self): + self.showPage() + self._x = self.x_start + self._y = self.y_start + + def print_textfield(self, textfield: TextFieldEntry, height: int) -> None: + self.acroForm.textfield( + name=f"name__{textfield['key']}", + tooltip=f"tooltip__{textfield['key']}", + value=prepare_text_for_textfield(textfield["text"]), + maxlen=textfield["max_length"], + x=self._x, + y=self._y, + fieldFlags="multiline", + width=500, + height=height, + borderWidth=0, + ) + + def print_block(self, block: TextBlockConfig, height: int) -> None: + if height > self.y_start - self.y_end: + raise ValueError("Block exceeds page size") + + if self._y - height < self.y_end: + self.next_page() + + for element in block: + if element["type"] == "text": + self._y, text_object = self.build_text_object(element, self._y) + + style: StyleDict = self.styles[element["style"]] + self.setFont(*style["font"]) + self.setFillColor(style["color"]) + self.drawText(text_object) + elif element["type"] == "textfield": + height = self.get_textfield_height(element) + self._y -= height + 10 + self.print_textfield(element, height) + + def get_textfield_height(self, textfield_element: TextFieldEntry) -> int: + return round(max(textfield_element["max_length"], 500) / 500) * 20 + + def estimate_block_height(self, block: TextBlockConfig) -> int: + y_loop = 0 + for element in block: + if element["type"] == "text": + y_loop, _ = self.build_text_object(element, y_loop) + elif element["type"] == "textfield": + height = self.get_textfield_height(element) + y_loop -= height + return -y_loop + + def build_text_object( + self, text_element: TextEntry, y: int + ) -> Tuple[int, PDFTextObject]: + style: StyleDict = self.styles[text_element["style"]] + y_out = y - style["height"] + + text_object: PDFTextObject = self.beginText(self.x_start, y_out) + text_object.textLines(text_element["text"]) + + return y_out, text_object + + def get_page_progression(self) -> float: + """ + Return the fractional progression along the page. 1 means at the top, 0 means at the bottom + """ + return (self._y - self.y_end) / (self.y_start - self.y_end) diff --git a/backend/app/controllers/pdf_wrapper/pdf.py b/backend/app/controllers/pdf_wrapper/pdf.py new file mode 100644 index 00000000..e9519ad8 --- /dev/null +++ b/backend/app/controllers/pdf_wrapper/pdf.py @@ -0,0 +1,57 @@ +import io +from . import TextStyle, TextEntry, TextFieldEntry, CanvasEditor, TextBlockConfig + + +class PDF: + def __init__(self): + self.stream = io.BytesIO() + self.__canvas = CanvasEditor(self.stream) + self.block: TextBlockConfig = [] + + def set_metadata(self, *, author: str, title: str, subject: str): + if author: + self.__canvas.setAuthor(author) + if title: + self.__canvas.setTitle(title) + if subject: + self.__canvas.setSubject(subject) + + def save(self): + self.__canvas.save() + + def next_page(self): + self.__canvas.next_page() + + def clear_block(self): + self.block = [] + + def print_block(self, *, clear: bool = True, lower_limit: float = 0.0): + """ + lower_limit: how far down the page is the block still allowed to start printing? for example: + 0.25 means: if the block starts in the last 25% of the page, print on the next page instead. + """ + progression = self.__canvas.get_page_progression() + if progression < lower_limit: + self.next_page() + + height: int = self.__canvas.estimate_block_height(self.block) + self.__canvas.print_block(self.block, height) + if clear: + self.clear_block() + + def add_heading(self, text: str, heading: TextStyle): + config: TextEntry = {"type": "text", "style": heading, "text": text} + self.block.append(config) + + def add_paragraph(self, text: str): + config: TextEntry = {"type": "text", "style": TextStyle.P, "text": text} + self.block.append(config) + + def add_textfield(self, text: str, key: str, *, max_length: int = 1000): + config: TextFieldEntry = { + "type": "textfield", + "text": text, + "max_length": max_length, + "key": key, + } + self.block.append(config) diff --git a/backend/app/controllers/pdf_wrapper/style_config.py b/backend/app/controllers/pdf_wrapper/style_config.py new file mode 100644 index 00000000..2e4bb8a6 --- /dev/null +++ b/backend/app/controllers/pdf_wrapper/style_config.py @@ -0,0 +1,41 @@ +from . import TextStyle, StyleDict +from reportlab.lib.colors import Color + +font: str = "Helvetica" +font_styles_config: dict[TextStyle, StyleDict] = { + TextStyle.H1: { + "font": (f"{font}-Bold", 22), + "height": 22, + "color": Color(0.15, 0.35, 0.56), # type: ignore + }, + TextStyle.H2: { + "font": (f"{font}-Bold", 18), + "height": 28, + "color": Color(0.15, 0.35, 0.56), # type: ignore + }, + TextStyle.H3: { + "font": (f"{font}-Bold", 15), + "height": 23, + "color": Color(0.15, 0.35, 0.56), # type: ignore + }, + TextStyle.H4: { + "font": (f"{font}-Bold", 12), + "height": 18, + "color": Color(0.15, 0.35, 0.56), # type: ignore + }, + TextStyle.SUBTITLE: { + "font": (font, 12), + "height": 18, + "color": Color(0.5, 0.5, 0.5), # type: ignore + }, + TextStyle.P: { + "font": (font, 10), + "height": 16, + "color": Color(0, 0, 0), + }, + TextStyle.DEFAULT: { + "font": (font, 10), + "height": 13, + "color": Color(0, 0, 0), + }, +} diff --git a/backend/app/controllers/pdf_wrapper/types.py b/backend/app/controllers/pdf_wrapper/types.py new file mode 100644 index 00000000..673fb0f2 --- /dev/null +++ b/backend/app/controllers/pdf_wrapper/types.py @@ -0,0 +1,35 @@ +from enum import Enum +from typing import TypedDict, Literal, Tuple, Union +from reportlab.lib.colors import Color + + +class TextStyle(Enum): + H1 = "h1" + H2 = "h2" + H3 = "h3" + H4 = "h4" + SUBTITLE = "subtitle" + P = "p" + DEFAULT = "default" + + +class TextEntry(TypedDict): + type: Literal["text"] + text: str + style: TextStyle + + +class TextFieldEntry(TypedDict): + type: Literal["textfield"] + text: str + key: str + max_length: int + + +TextBlockConfig = list[Union[TextEntry, TextFieldEntry]] + + +class StyleDict(TypedDict): + font: Tuple[str, int] + height: int + color: Color diff --git a/backend/app/controllers/smart_search.py b/backend/app/controllers/smart_search.py new file mode 100644 index 00000000..db98c99b --- /dev/null +++ b/backend/app/controllers/smart_search.py @@ -0,0 +1,115 @@ +from sqlalchemy.orm import Session +from sqlalchemy import and_, func, ColumnElement +from app import models, schemas, repositories + + +def prep_search_for_query(search_query_value: str) -> str: + adjusted_search_query = search_query_value.replace(" of ", " or ") + return adjusted_search_query + + +def get_basic_search_clause(searchtext: str) -> ColumnElement[bool]: + return models.AlgoritmeVersion.vector.op("@@")( + func.websearch_to_tsquery(schemas.Language.NLD.value, searchtext) + ) + + +def get_similarity_search_clause(db: Session, searchtext: str) -> ColumnElement[bool]: + """ + Full text search query based on concatenation of a set of words from the 'words' table. + The words are selected if their similarity is greater then the threshold when compared to the search value. + """ + similarity_threshold = 0.4 + # similarity threshold is set to 0.4 because it returns good results + + subquery = ( + db.query( + func.websearch_to_tsquery( + schemas.Language.NLD.value, func.string_agg(models.Words.word, " or ") + ) + ) + .filter(func.similarity(models.Words.word, searchtext) > similarity_threshold) + .as_scalar() + ) + return models.AlgoritmeVersion.vector.op("@@")(subquery) + + +def perform_smart_search( + algoritme_query, db, language +) -> schemas.AlgoritmeQueryResponse: + algoritme_version_repo = repositories.AlgoritmeVersionRepository(db) + org_repo = repositories.OrganisationRepository(db) + + searchtext = prep_search_for_query(algoritme_query.searchtext) + organisation = algoritme_query.organisation + limit = algoritme_query.limit + page = algoritme_query.page + offset = (page - 1) * limit + + selected_filters = [] + + filter = [] + filter.append(models.AlgoritmeVersion.published) + filter.append(models.AlgoritmeVersion.language == language) + + if organisation: + selected_filters.append( + schemas.SelectedFilters(name="organisation", value=organisation) + ) + filter.append(models.AlgoritmeVersion.organization == organisation) + + if searchtext: + selected_filters.append( + schemas.SelectedFilters(name="searchtext", value=algoritme_query.searchtext) + ) + + filter.append(get_basic_search_clause(searchtext)) + + # Last entry is the search filter!! + filter_clause = and_(*filter) + + # Perform query + results = algoritme_version_repo.get_published_by_filter( + filter_clause, offset, limit + ) + if len(results) == 0 and searchtext: + # If a searchtext is given, we use similarity search in case of no results. Replace basic search on last entry: + filter[-1] = get_similarity_search_clause(db, searchtext) + filter_clause = and_(*filter) + results = algoritme_version_repo.get_published_by_filter( + filter_clause, offset, limit + ) + + # Get all the records -> limit set to a random big number. + total_count = len( + algoritme_version_repo.get_published_by_filter(filter_clause, 0, 99999999) + ) + organisations = org_repo.get_aggregated_organisations_by_filter(filter_clause) + + filter_data = schemas.FilterData(organisation=organisations) + + return schemas.AlgoritmeQueryResponse( + results=results, + total_count=total_count, + filter_data=filter_data, + selected_filters=selected_filters, + ) + + +def perform_suggestion_search( + searchtext: str, db: Session, language: schemas.Language +) -> schemas.SearchSuggestionResponse: + algoritme_version_repo = repositories.AlgoritmeVersionRepository(db) + + filter = [] + filter.append(models.AlgoritmeVersion.published) + filter.append(models.AlgoritmeVersion.language == language) + + if searchtext: + filter.append(get_basic_search_clause(searchtext)) + + filter_clause = and_(*filter) + + results = algoritme_version_repo.get_published_by_filter(filter_clause) + + return schemas.SearchSuggestionResponse(algorithms=results) diff --git a/backend/app/controllers/templates.py b/backend/app/controllers/templates.py new file mode 100644 index 00000000..661dd7f0 --- /dev/null +++ b/backend/app/controllers/templates.py @@ -0,0 +1,56 @@ +import os +import json +from pathlib import Path +from app import schemas +from functools import lru_cache + + +def get_supplier_names(standard_version: str) -> list[str]: + filenames = os.listdir(f"app/data/templates/{standard_version}") + return [filename[:-5] for filename in filenames] + + +@lru_cache(maxsize=3) +def get_supplier_templates( + supplier: str, standard_version: str +) -> list[schemas.AlgoritmeVersionTemplate]: + file_path = Path(f"app/data/templates/{standard_version}/{supplier}.json") + with open(file_path, "r") as filehandler: + json_obj = json.load(filehandler) + return [schemas.AlgoritmeVersionTemplate(**template) for template in json_obj] + + +@lru_cache(maxsize=1) +def get_template_summary(standard_version: str) -> list[schemas.StandardSupplier]: + suppliers = get_supplier_names(standard_version) + + suppliers_summary: list[schemas.StandardSupplier] = [] + for supplier in suppliers: + templates = get_supplier_templates(supplier, standard_version) + + templates_summary = [] + for template in templates: + templates_summary.append( + schemas.TemplateSummary(name=template.name, id=template.id) + ) + + supplier_summary = schemas.StandardSupplier( + name=supplier, algorithm_descriptions=templates_summary + ) + suppliers_summary.append(supplier_summary) + return suppliers_summary + + +def get_template_by_id( + standard_version: str, id: str +) -> schemas.AlgoritmeVersionTemplate | None: + suppliers = get_supplier_names(standard_version) + + templates: list[schemas.AlgoritmeVersionTemplate] = [] + for supplier in suppliers: + templates.extend(get_supplier_templates(supplier, standard_version)) + + for template in templates: + print(template) + if id == template.id: + return template diff --git a/backend/app/controllers/word_download.py b/backend/app/controllers/word_download.py new file mode 100644 index 00000000..2e4c32e9 --- /dev/null +++ b/backend/app/controllers/word_download.py @@ -0,0 +1,217 @@ +import datetime +import io +from typing import Tuple +from docx import Document, document +from fastapi.responses import StreamingResponse +from fastapi import HTTPException, status +from sqlalchemy.orm import Session +from app import schemas +from app.schemas.config.types import SchemaProperty +from app.config.layouts.types import LayoutJson +from app.util.config_load import get_ttl_hash, collect_structure_data +from app.repositories import AlgoritmeVersionRepository + + +def get_org_data(db: Session, org_name: str) -> list[schemas.AlgoritmeVersionDownload]: + algoritme_version_repository = AlgoritmeVersionRepository(db) + algorithms = algoritme_version_repository.get_latest_by_org_by_lang( + org_name, schemas.Language.NLD + ) + return [schemas.AlgoritmeVersionDownload(**row.dict()) for row in algorithms] + + +def get_algo_data(db: Session, lars: str) -> schemas.AlgoritmeVersionDownload | None: + algoritme_version_repository = AlgoritmeVersionRepository(db) + algorithm = algoritme_version_repository.get_latest_by_lars_by_lang( + lars, schemas.Language.NLD + ) + if algorithm: + return schemas.AlgoritmeVersionDownload(**algorithm.dict()) + + +def insert_rich_text_field(doc: document.Document, field: str): + lines = field.replace("

    ", "

    ").replace("

    ", "
    ") + lines = lines.split("\n") + + current_key_type = None + for line in lines: + line = line.replace("
    ", "\n") + if line.startswith("
    "): + text = line.replace("
    ", "").replace("
    ", "").strip() + if text != "": + doc.add_paragraph(text) + elif line.startswith("
      "): + current_key_type = "List Bullet" + elif line.startswith("
        "): + current_key_type = "List Number" + elif line.startswith("
      1. "): + text = line.replace("
      2. ", "").replace("
      3. ", "").strip() + doc.add_paragraph(text, style=current_key_type) + elif line.startswith("
    ") or line.startswith("
"): + current_key_type = None + return doc + + +def insert_list_field(doc: document.Document, field: list[str] | list[dict]): + if type(field[0]) == str: + if len(field) > 1: + for bullet in field: + doc.add_paragraph(str(bullet), style="List Bullet") + else: + doc.add_paragraph(field[0]) + elif type(field[0]) == dict: + if len(field) > 1: + for bullet in field: + stringified_dict = ", ".join(dict(bullet).values()) # type: ignore + doc.add_paragraph(stringified_dict, style="List Bullet") + else: + stringified_dict = ", ".join(field[0].values()) + doc.add_paragraph(stringified_dict) + return doc + + +def insert_styled_field( + doc: document.Document, + field: str | list[str] | list[dict], + *, + is_rich_text: bool = False, +): + if type(field) == str: + if is_rich_text: + return insert_rich_text_field(doc, field) + doc.add_paragraph(field) + return doc + elif type(field) == list: + return insert_list_field(doc, field) + else: + return doc + + +def build_description( + doc: document.Document, + algorithm: schemas.AlgoritmeVersionDownload, + layout: LayoutJson, + schema: dict[str, SchemaProperty], +): + doc.add_heading(f"{algorithm.name} ({algorithm.lars})", 1) + p = doc.add_paragraph("Publicatiestandaard: ") + p.add_run(f"{algorithm.standard_version}").bold = True + + for tab_group in layout.tabsGrouping: + doc.add_heading(f"{tab_group.label}", 2) + + field_list = tab_group.rows + for field in field_list: + doc.add_heading(f"{schema[field].title}", 3) + + field_value = getattr(algorithm, field) + is_rich_text = schema[field].allowed_html_tags is not None + if field_value is None: + field_value = "" + is_rich_text = False + + doc = insert_styled_field(doc, field_value, is_rich_text=is_rich_text) + + return doc + + +def get_all_algorithm_doc(db: Session, org_name: str): + data = get_org_data(db, org_name) + if len(data) == 0: + return None, None + + standards, layouts = collect_structure_data(get_ttl_hash()) + organisation = data[0].organization + timestamp = datetime.datetime.now().strftime("%Y-%m-%d") + + doc = Document() + doc.add_heading("Algoritmebeschrijvingen", 0) + doc.add_paragraph(f"Algoritmes van {organisation}", style="Subtitle") + doc.add_paragraph( + f"""Dit document bevat algoritmebeschrijvingen van {organisation}, uitgedraaid op {timestamp}. \ +Gebruik het om algoritmebeschrijvingen intern te reviewen en wijzigingen te accorderen voor publicatie \ +op het algoritmeregister van de Nederlandse overheid. Heeft u vragen of heeft u hulp nodig? Neem via mail \ +contact op met: algoritmeregister@minbzk.nl.""" + ) + + for algorithm in data: + doc.add_page_break() + if not algorithm.standard_version: + raise HTTPException( + status_code=status.HTTP_409_CONFLICT, detail="STANDARD_NOT_KNOWN" + ) + layout = layouts[algorithm.standard_version] + schema = standards[algorithm.standard_version] + + doc = build_description(doc, algorithm, layout, schema) + + stream = io.BytesIO() + doc.save(stream) + stream.seek(0) + + filename = f"Algoritmebeschrijvingen van {organisation} op {timestamp}.docx" + return stream, filename + + +def get_one_algorithm_doc(db, lars: str) -> Tuple[io.BytesIO | None, str | None]: + algorithm = get_algo_data(db, lars) + if algorithm is None: + return None, None + + standards, layouts = collect_structure_data(get_ttl_hash()) + organisation = algorithm.organization + name = algorithm.name + timestamp = datetime.datetime.now().strftime("%Y-%m-%d") + + doc: document.Document = Document() + doc.add_heading("Algoritmebeschrijving", 0) + doc.add_paragraph(f"Algoritme: {name} van {organisation}", style="Subtitle") + doc.add_paragraph( + f"""Dit document bevat de algoritmebeschrijving: {name} van {organisation}, uitgedraaid op {timestamp}. \ +Gebruik het om algoritmebeschrijvingen intern te reviewen en wijzigingen te accorderen voor publicatie \ +op het algoritmeregister van de Nederlandse overheid. Heeft u vragen of heeft u hulp nodig? Neem via mail \ +contact op met: algoritmeregister@minbzk.nl.""" + ) + + if not algorithm.standard_version: + raise HTTPException( + status_code=status.HTTP_409_CONFLICT, detail="STANDARD_NOT_KNOWN" + ) + layout = layouts[algorithm.standard_version] + schema = standards[algorithm.standard_version] + + doc = build_description(doc, algorithm, layout, schema) + + stream = io.BytesIO() + doc.save(stream) + stream.seek(0) + + filename = f"{name} {timestamp}.docx" + return stream, filename + + +def generate_word_download( + db: Session, *, org_name: str | None = None, lars: str | None = None +): + if lars: + stream, filename = get_one_algorithm_doc(db, lars) + elif org_name: + stream, filename = get_all_algorithm_doc(db, org_name) + else: + raise ValueError("Please enter one of two identifiers: lars | org_name") + + if stream is None: + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail="No algorithm descriptions found. Unable to make document", + ) + media_type = ( + "application/vnd.openxmlformats-officedocument.wordprocessingml.document" + ) + response = StreamingResponse(io.BytesIO(stream.read()), media_type=media_type) + response.headers["Content-Disposition"] = f'attachment; filename="{filename}"' + return response + + +if __name__ == "__main__": + collect_structure_data() diff --git a/backend/app/data/default/supporting_text.json b/backend/app/data/default/supporting_text.json new file mode 100644 index 00000000..f939f732 --- /dev/null +++ b/backend/app/data/default/supporting_text.json @@ -0,0 +1,394 @@ +{ + "en": { + "Footer: Contact": { + "content": "

Contact us

\n

This website is under development. Do you have questions about the Algorithm Register? Or are you a (government) professional and do you or your organization want to participate in the further development of the Algorithm Register? Look at the information on: About the Algorithm Register and the Frequently Asked Questions; For questions, please contact: algorithmregister@minbzk.nl.

", + "pageTitle": "" + }, + "Footer: Vragen": { + "question14": "How do I stay informed about the development of the Algorithm Register?", + "question15": "Is the Dutch Algorithm Register also the register as described in the European AI Act?", + "question16": "Will there be legislation regarding the Algorithm Register?", + "question17": "Is your question not listed?", + "group1": "A General information", + "group3": "C Complaints or objections", + "group5": "E Legislation and the European AI Act", + "content": "

Frequently asked questions

\n

1. What is the Algorithm Register?

\n

This website provides information about the algorithms used by the Dutch government. This makes the information visible, traceable and accessible to citizens and their representatives, the media and supervisors.

\n

2. What is the aim of this website?

\n

The aim is to make information about algorithms centrally accessible for everyone. That allows everyone to see in which impactful processes these algorithms are used. The information on this website provides the ability to oversee algorithms. For example, discrimination or unlawfulness can be exposed, and whether the algorithm provides desirable outcomes can be checked. When someone does not agree with the use of algorithms, the Algorithm Register indicates how objections can be made.

\n

3. What are algorithms?

\n

An algorithm is a set of rules and instructions executed by a computer. Algorithms help, for example, to analyse problems, but also to make decisions. This allows the government to combine and analyse large amounts of data (source: Algemene Rekenkamer).

\n

Do you want to know more about algorithms? Find more information on Mediawijsheid\"Link or take the (free) National AI-course\"Link.

\n

4. I have questions about an algorithm on this site, who do I contact?

\n

If you have a question about a specific algorithm, please contact the ‘owner’ of the algorithm. Contact details can be found in the description of the algorithm.

\n

For other questions please email: algoritmeregister@minbzk.nl.

\n

5. Are all algorithms used by the government available on this website?

\n

A leading group of government organisations is currently making their algorithms available via this website. In 2023, even more government organisations will publish their algorithms in the Algorithm Register. For the time being, the number of algorithms on this website will continue to grow.

\n

In the future, it will become a legal requirement to make algorithms publicly available. As a result, most relevant algorithms will become available in the Algorithm Register. There will be justified exceptions to this. For example, certain algorithms used for investigation, law enforcement, defense or intelligence gathering. The exact framework is still being finalized.

\n

6. Why do some algorithms contain more information than others?

\n

Currently, the Algorithm Register is completed voluntarily by government organisations. Not every organisation has chosen to publish all information. Ultimately, it will be legally defined which information is mandatory and which information is optional.

\n

7. Who develops and maintains the Algorithm Register?

\n

The development of the Algorithm Register was started by the Public Control of Algorithms Consortium. In it, government organisations worked on policy instruments for the responsible use of algorithms. One of the outcomes of that work was research into the creation of a register of algorithms. The Ministry of the Interior and Kingdom Relations has built on knowledge gained from this research to create this Algorithm Register. The ministry is working with ICTU to develop this website. All organisations that have currently supplied one or more algorithms to the Algorithm Register can be found under the heading ‘Algorithms’.

\n

8. How do algorithm registers of individual government organisations relate to this website?

\n

The Algorithm Register is the central location for all government algorithms. Some government organisations also have their own algorithm register. This gives organisations the opportunity to provide more information or to provide it in a different way. In the current version of this website, information was entered manually. In 2023, the possibility of an automatic upload will be investigated.

", + "pageTitle": "Frequently Asked Questions", + "question1": "What is the Algorithm Register?", + "answer1": "

The Algorithm Register contains information about algorithms used by the government. This information is thus findable and available to citizens, their representatives, the media and regulators.

", + "question2": "What does the government use algorithms for?", + "answer2": "

Algorithms can help to efficiently process large amounts of data and provide better insights. Algorithms help to improve that service and save time and money. The government uses algorithms to analyze data, make decisions and automate tasks. Examples of algorithms used by the government are traffic monitoring and online applications for government products.

", + "question3": "Which algorithms belong in the algorithm register?", + "answer3": "

In any case, this register should include:

\n
    \n
  • The algorithms that are designated as high risk by the proposed European legislation (the AI Act). These are algorithms that have elements of autonomy. In Dutch we usually call these (partly) self-learning algorithms. The algorithm must also be operational in one of the application areas of Annex III. Think of areas such as biometrics, critical infrastructure and employment. More about the risk classification in the AI Act.
  • \n
  • Algorithms that have a direct impact on those involved. For example, they contribute to a decision that affects someone's rights, someone's legal status or their rights under a contract. For example: imposing a fine or granting or refusing a subsidy.
  • \n
\n

In addition, there are a number of other reasons to fully publish algorithms. For example, when algorithms receive a lot of social attention. There are also reasons not to publish an algorithm in full, for example when an algorithm is used for detection. Ideally, the government will then publish the part of the information about the algorithm that can be published.

", + "question4": "Which organizations publish their algorithms in the Algorithm Register?", + "answer4": "

Publication is currently still voluntary for governments. The Algorithm Register therefore contains information about algorithms of government organizations that have chosen this themselves. New organizations are added regularly.

\n

In the future, publication of algorithms that belong in this register will be mandatory for all government organisations; so the national government, provinces, municipalities, water boards. It is not yet clear whether other public sector organizations such as healthcare and education will also fall under this obligation. This will become clearer on the way to legislation in 2025.

", + "question5": "What about my privacy when using algorithms?", + "answer5": "

Some algorithms use personal data for their task. Personal data is data that contains information that can be used to identify an individual, such as name, address, date of birth or financial information. There are many requirements for the use of personal data, including by the government. Many requirements are laid down in legislation, such as the GDPR. The Algorithm Register contains information about which data sources the algorithm uses. And about which tests were performed before the algorithm was put into use, for example a privacy test (DPIA). The Dutch Data Protection Authority monitors compliance with privacy requirements and, since 1 January, also monitors algorithms.

", + "question6": "How many algorithms does the government use and how many are included in this register?", + "answer6": "

We are at the beginning of a process in which the government is actively making algorithms public. The number of algorithms in the register is not yet the total number of algorithms used by the government. To estimate the value of that number, the following question is relevant: how many algorithms does the government actually use? And how many of them are impactful or high-risk according to the AI Act? At the moment there is little insight into the total number of algorithms used by the government. It is therefore also unknown how many algorithms ultimately should end up in the register. Over the years, more and more insight will be gained into the number and nature of government algorithms.

", + "question7": "What information about algorithms can I get from the Algorithm Register?", + "answer7": "

The Publication Standard describes the information needed to describe an Algorithm. This Publication Standard is constantly being improved so that it is more in line with practice, in consultation with governments, stakeholders and experts. The fields from the publication standard are therefore not yet mandatory. The result is that for some algorithms in the register, not all fields have been entered yet. Government organizations are encouraged to publish as much information as possible about their algorithms.

", + "question8": "How do I find an algorithm in this registry?", + "question9": "What do I do if the algorithm I am looking for is not listed?", + "answer9": "

Then contact the organization that uses the algorithm and ask for an explanation of the decision or process. For most organizations, the contact details are in the description of the algorithm. Can't get out of there? Please contact algoritmeregister@minbzk.nl and we will refer you specifically.

", + "question10": "What do I do if the information about the algorithm is unclear or information is missing?", + "answer10": "

Questions about a description or missing information should be directed to the organization that published the algorithm. For most algorithms in the registry, the contact information is in the description. Can't get out of there? Please contact algoritmeregister@minbzk.nl and we will refer you directly.

", + "question11": "Where can I file a complaint or appeal against a government algorithm in this registry?", + "answer11": "

You can lodge an objection and a complaint with the organization that uses the algorithm. (You can read how to do that in this answer [link FAQ 10]. That is always the first step. If you cannot find a solution together, you can get help. For example, from the Nationale Ombudsman. More about what the Nationale Ombudsman can do Directly to the complaint form .

", + "question12": "Can I opt out of using algorithms?", + "answer12": "

You cannot opt out of using algorithms. You can, however, find information in this register about how the algorithm works and what it does. And you can ask for an explanation if you do not understand an algorithm's decision or if you think it is incorrect. You can object if you believe that the algorithm has made mistakes that have disadvantaged you and/or others.

", + "answer15": "

The Dutch Algorithm Register really stems from a Dutch wish, based on a number of reports, parliamentary motions and advice to create a register for more transparency from the Dutch government.

\n

The draft AI Act will probably require that high-risk AI algorithms be documented. These algorithms will eventually end up in this Algorithm Register. In order to comply with the requirements of the law, the publication standard will eventually be adjusted. There are also differences: not all algorithms in the Algorithm Register are high-risk and/or AI algorithms. There are also non-self-learning algorithms and/or algorithms with a lower risk character in this register. That remains the case. The register does seek a connection with the AI Act, so that it becomes easy for governments listed in the Dutch register to also comply with the obligations under the AI Act. Here we also have to wait for what the European Database will look like. It depends on the European Commission, the Dutch government is discussing this.

", + "answer16": "

The need for additional legislation is being investigated. This is being considered in conjunction with EU legislation. This was announced in the letter to the House of Representatives of December 2022. This will certainly last until 2025.

", + "question13": "How do I participate as a government organization?", + "answer13": "

Join us and publish the information about your organization's algorithms. Also think about the further development of this Algorithm Register. You can find this information on the ' Getting involved ' page.

", + "answer17": "

Ask your question via algoritmeregister@minbzk.nl.

", + "group2": "B Using the Algorithm Register", + "group4": "D Participate | to stay informed", + "group6": "F Other question", + "answer8": "

There are two options. You can first search by organisation, word or theme. For example: Municipality X, Parking or Social Security. You will then receive an overview of the algorithms published by this municipality, with this word in the descriptions, or in this theme. A second option is to 'browse' through all the algorithms in the registry .

", + "answer14": "
    \n
  • We regularly organize open meetings. View the agenda on the Pleio page on algorithms.
  • \n
  • On algoritmes.pleio.nl you will find news, the agenda and a number of communities where you can stay informed about a certain subject and where you can talk.
  • \n
  • Subscribe to the newsletter and regularly receive an update of the algorithm news in your mailbox. Sign In.
  • \n
  • algoritmes.overheid.nl is developed with open source software. The code and, for example, the publication standard, can be found on the GitHub page of the Ministry of the Interior and Kingdom Relations.
  • \n
" + }, + "Footer: Privacyverklaring": { + "content": "

Privacy

\n

This website uses analytical cookies only. Cookies are small text files that websites store on your computer. This makes it possible to recognize your computer during your visit. This information helps the development team to improve the site. Analytical cookies answer the following questions:

\n
    \n
  • Is this a new visitor or has the visitor visited the site before
  • \n
  • Which pages were consulted during the visit
  • \n
  • Which site was the visitor directed from
  • \n
  • Did the visitor immediately leave the site ('bouncing').
  • \n
\n

The cookies are not used to create a profile or to follow you further. This website does not place third-party cookies.

\n

Data received via email

\n

Personal information that becomes known to the Algorithm Register by email is treated confidentially by the team. Such personal data will only be kept by the team while they work on a response to your message. Once the question is answered or if no question is asked, the team will only record the question itself and the answer to that question. Upon request, the question and answer can also be deleted.

", + "pageTitle": "Privacy" + }, + "Footer: Toegankelijkheid": { + "content": "

Accessibility

\n

During the development of this website, anything deemed beneficial and any requirements to make it accessible were immediately incorporated. The development team has been trained in digital accessibility. An independent accessibility expert regularly provides advise.

\n

This website complies with WCAG 2.1 level AA, the Web Content Accessibility Guidelines.

\n

This means that the website can be used by anyone including people with a disability.

\n

For more information see:

\n", + "pageTitle": "Accessibility" + }, + "Footer: Webarchief": { + "content": "

Web archive

\n

Websites are an important source of information for citizens, companies and governments. This also applies to previous versions of websites. They may contain information that is still relevant and may confer rights. By archiving websites, they remain permanently accessible: they remain available for reviewing public information. This is mandatory for all government websites.

\n

These versions can be found in the web archive (Dutch only).

\n

The overview shows the archives of all mandatory participants. Click on an archive, select a date from the past and the website will adjust its content to what was current at that time. You can go back as far as January 25, 2023.

\n

Want to learn more? Check out the Guidelines for Archiving Government Websites.

", + "pageTitle": "Webarchive" + }, + "Footer: Over": { + "content": "

About the Algorithm Register

\n

The government wants the government to use algorithms responsibly. People must be able to trust that algorithms comply with society's values and norms. And there must be an explanation of how algorithms work. The government does this by checking algorithms before use for how they work and for possible discrimination and arbitrariness. When the government is open about algorithms and their application, citizens, organizations and media can follow it critically and check whether it follows the law and the rules.

\n

Responsible algorithm use

\n

The following processes, among others, contribute to responsible algorithm use:

\n
    \n
  1. The Algorithm Register helps to make algorithms findable, to explain them better and to make their application and results understandable.
  2. \n
  3. The Algorithm Supervisor (the Dutch Data Protection Authority) coordinates the control of algorithms: do the government's algorithms comply with all the rules that apply to them? Learn more about the regulator .
  4. \n
  5. The Ministry of the Interior and Kingdom Relations is working on the 'Use of Algorithms' Implementation Framework . This makes it clear to governments what requirements apply to algorithms and how they can ensure that their algorithms can meet those requirements.
  6. \n
  7. Legislation: there will be a legal framework for the transparency of algorithms. This was announced in the letter to parliament dated December 2022 .
  8. \n
\n

Open development

\n

The first version of the Algorithm Register was launched in December 2022. This forms the basis for further development. Because we put the solution into practice, we can gain knowledge and experience. We are developing the register openly, together with experts, (potential) users and stakeholders.

\n

Do you want to contribute to that ?

\n

More and more algorithms

\n

The Algorithm Register is not yet complete. Providing information about algorithms is not yet mandatory for government organizations. That obligation will come. Before then, more and more government organizations publish algorithms in the register of their own accord. Because they want to be open and transparent about their processes and the use of algorithms.

\n

Read, for example , the story of the municipality of Amersfoort and the North Sea Canal Area Environment Agency .

", + "pageTitle": "" + }, + "Footer: Meedoen": { + "pageTitle": "Join", + "content": "

Join

\n

You can participate if you work for the government and if you do not work for the government .

\n

Governments: participate and think along

\n

More and more governments are participating and are publishing information about their high-impact algorithms and high-risk algorithms in accordance with the forthcoming European AI Act in this government Algorithm Register.

\n

The starting point is that governments themselves are responsible for drawing up and managing their algorithms in the Algorithm Register. The Algorithm Register supports this with help, guidelines, tools and a publication standard.

\n

Help and handouts

\n
    \n
  1. Does your organization want to participate and publish the algorithms you use? You can read more information about this at algorithms.pleio.nl, for example in the guide 'Getting started with the algorithm register' .
  2. \n
  3. You can find the planning and background information on algorithms.pleio.nl. You will also find stories from organizations about how and why they are connected to the Algorithm Register. For example, from the municipality of Amersfoort and the NZKG Environmental Service .
  4. \n
  5. Have a look at the publication standard – what information do you provide if you want to publish an algorithm? This standard is still under development.
  6. \n
  7. You can also contact us for help at algorithmregister@minbzk.nl .
  8. \n
\n

Tools: easy self-publishing

\n
    \n
  1. You can submit with an online form or automated via an API.
  2. \n
  3. Every quarter we showcase the new tools of the application in public demos. In between you stay informed in the sprint reviews. View the agenda for this .
  4. \n
\n

Interested? Stay informed and join the conversation

\n

We are further developing the Algorithm Register, the tools and standards together with stakeholders. Do you not work for the government and do you like to talk and think along? This can be done in the following ways.

\n
    \n
  1. Join the community on the Pleio platform. Create an account for this .
  2. \n
  3. The registry software is open source. View the code on the GitHub of the Ministry of the Interior and Kingdom Relations.
  4. \n
  5. Public online Heartbeats and Meetups: there are regular meetings about the state of affairs (Heartbeats) and about specific themes (Meetups). View the calendar .
  6. \n
  7. (Potential) users, civil society organizations and experts contribute ideas about the further improvement of the Algorithm Register. So that the Algorithm Register will be as close as possible to what people need. For example, we conduct a lot of interviews for this purpose.
  8. \n
\n
 
" + }, + "Footer: Over algoritmes": { + "pageTitle": "About algorithms", + "img_alt": "The collection 'all algorithms' contains both the subset 'Impactful algorithms' (with influence on people) and the subset 'AI'.", + "content": "

About algorithms

\n
\n

An algorithm is a set of rules and instructions that a computer automatically follows when making calculations to solve a problem or answer a question (source: Netherlands Court of Audit). You come across algorithms everywhere, including in government.

\n
\n
\n

Anyone who regularly does something on the internet comes across algorithms. Browsers, online banking, streaming services such as Netflix, and social media such as Facebook and Instagram; algorithms make it possible.

\n
\n
\n

The government also uses algorithms. Consider applying for a grant online. The algorithm then helps to immediately assess whether you meet the conditions or not. This is an example of an algorithm with clear decision rules and an unequivocal answer: yes or no?

\n
\n
\n

Other algorithms can recognize trends. For example, they show how crime develops in a city. This helps the police and municipality to take the right measures. Or they analyze (anonymous) health data, which can be used to make public health policy. Sometimes these algorithms are '(self) learning'. That is, they are trained to discover patterns themselves.

\n
\n
\n

Impactful algorithms

\n
\n
\n

Algorithms are not perfect. They sometimes make mistakes and there is a risk of prejudice, just like with humans. In the past, this has gone horribly wrong with automated government processes.

\n
\n
\n

The government is working on improvement. It does this, for example, by developing and using algorithms in a responsible manner. It is important that the government is transparent about the impactful algorithms it uses. So that citizens and stakeholders have insight into algorithms that influence their lives. For example, algorithms that have legal consequences for people, or that ensure that the government classifies people, are full of impact. For example, identifying people who are entitled to certain provisions, so that the government can proactively offer help.

\n
\n
\n

Visible and controllable

\n
\n
\n

The Algorithm Register wants to make the impactful algorithms used visible and verifiable. So that you as a citizen, advocate, expert or journalist can watch. If you have any questions or think something is wrong with an algorithm in this register, you can contact the organization that manages the algorithm. Or: Read more about the Algorithm Register.

\n
\n
\n

Relationship with AI

\n
\n
\n

Artificial (or artificial) intelligence (AI) enables computers and machines to perform intelligent tasks. A well-known example of this is ChatGPT, a program that can answer the questions you ask it. Another example is AI that can help a doctor quickly detect different types of cancer.

\n
\n
\n

Algorithms are an important part of AI, as they help computers and machines perform these tasks with mathematical formulas and patterns. AI can therefore discover connections and analyze images, for example. The relationship between AI and algorithms is as follows: AI consists of algorithms, but not all algorithms are part of AI. For example, the aforementioned non-self-learning algorithms are not AI systems, but you will find them in this register.

\n
\n
\n

You can see this connection between AI and algorithms in the diagram below. Part of all algorithms – whether or not part of an AI system – are impactful.

\n
", + "content2": "
\n

That means two things. First: all AI consists of algorithms, but a small part of the algorithms are part of an AI system. Second, there is an overlap between impactful algorithms and AI. Some AI is impactful, other AI is not.

\n
\n
\n

Legislation

\n
\n
\n

The European Union is working on legislation specifically for AI: the AI Act. More about the relationship between the Algorithm Register and the upcoming AI Act.

\n
" + }, + "footer": { + "text": "Please note: this website is under development. The information changes often. Do you want", + "textForLink": "to help?" + }, + "Home": { + "about": "

About algorithms

\n

An algorithm is a set of rules and instructions that a computer automatically follows when making calculations to solve a problem or answer a question. More about algorithms.

", + "collaborate": "

Developing together
More and more government organizations publish information about their algorithms in the Algorithm Register. The register is being developed further. Join us too.

", + "aboutRegister": "

About this register

\n

More and more Dutch government organizations publish the algorithms they use in their work in this Algorithm Register. They focus on impactful algorithms and give the visitor insight into how these algorithms work. More about this register.

", + "highlightTextBottom": "

Or browse all algorithms

", + "toDo": "

What can I do here?

\n

How can you use the Algorithm Register? And what do you do if the algorithm you are looking for is not yet in this registry? View the frequently asked questions.

", + "highlightTextTop": "View the 3 most recently changed algorithm descriptions" + }, + "Zoekbalk": { + "hint": "Search by word, theme or organisation" + }, + "Footer: Versie-informatie": { + "content": "
\n

Version information

\n
\n
\n

October 2023

\n
\n
\n

In this release, a number of important improvements have been made to The Algorithm Register for the user.

\n
\n
\n

1. The download options are extended.

\n
\n
\n

From now on, the algorithm descriptions can be downloaded in single form and in bulk. This can be done in Microsoft Word, in Microsoft Excel with sorting by publication standard, or as a PDF with editable fields.

\n

2. The flows for organizations have been simplified.

\n
\n
\n

This speeds up the process of publishing an algorithm description. A release can be responded to much faster. This now takes a few seconds, instead of 15 minutes.

\n
\n
\n

3. The database has been upgraded to the latest architecture.

\n
\n
\n

The availability of the website has been increased by the features of the new architecture. The user hardly notices this.

\n
\n
\n

4. Version control now shows who last edited the web forms.

\n
\n
\n

This allows editors to see who made previous changes. That means the traceability for organizations is increased. It also helps ICTU with looking back in time and allows them to better help organzations with their changes.

\n
\n
\n

5. The web form is now available at a new address.

\n
\n
\n

After a test period, the web form was moved to https://algoritmes.overheid.nl/webformulier. This also applies to the delivery API, which has been moved to https://algoritmes.overheid.nl/aanleverapi.

\n
", + "pageTitle": "Version information" + }, + "language-disclaimer": { + "closeText": "Close", + "content": "

Please note: The algorithm descriptions in English have been automatically translated. Errors may have been introduced in this process. For the original descriptions, go to the Dutch version of the Algorithm Register.

", + "goToDutch": "Go to Dutch language" + } + }, + "nl": { + "Footer: Contact": { + "content": "

Neem contact op

\n

Deze website is in ontwikkeling. Heb je vragen over het Algoritmeregister? Of ben je een (overheids)professional en wil jij of je organisatie meedoen aan de verdere ontwikkeling van het Algoritmeregister? Kijk naar de informatie op: Over het Algoritmeregister en de  Veelgestelde vragen;Voor vragen, neem contact op met: algoritmeregister@minbzk.nl

", + "pageTitle": "Contact" + }, + "Footer: Vragen": { + "question14": "Hoe blijf ik op de hoogte van ontwikkeling van het Algoritmeregister?", + "question15": "Is het Nederlandse Algoritmeregister ook het register zoals beschreven in de Europese AI Verordening?", + "question16": "Komt er wetgeving rond het Algoritmeregister?", + "question17": "Staat jouw vraag er niet bij?", + "group1": "A Algemene informatie", + "group3": "C Klachten of bezwaren", + "group5": "E Wetgeving en de Europese AI-Verordening", + "content": "

Veelgestelde vragen

\n

1. Wat is het Algoritmeregister?

\n

Op het Algoritmeregister staat informatie over algoritmes die de overheid gebruikt. Zo is deze informatie vindbaar en beschikbaar voor burgers, hun belangenbehartigers, de media en toezichthouders.

\n

2. Wat is het doel van deze website?

\n

Het doel is informatie over algoritmes voor iedereen centraal vindbaar te laten zijn. Op die manier kan iedereen zien in welke impactvolle processen algoritmes gebruikt worden. De informatie geeft de mogelijkheid om toezicht te houden op algoritmes. Zo kan gekeken worden naar discriminatie en onrechtmatigheid, maar ook de wenselijkheid. Wanneer mensen het niet eens zijn met het gebruik van algoritmes, geeft het Algoritmeregister aan waar bezwaar gemaakt kan worden.

\n

3. Wat zijn algoritmes?

\n

Een algoritme is een set van regels en instructies die een computer uitvoert. Algoritmes helpen bijvoorbeeld om problemen te analyseren maar ook om beslissingen te nemen. Zo kan de overheid grote hoeveelheden gegevens (data) combineren en analyseren (bron: Algemene Rekenkamer).

\n

Wil je meer weten over algoritmes? Bekijk de informatie op Mediawijsheid\"Link of bekijk de (gratis) Nationale AI-cursus\"Link.

\n

4. Ik heb een vraag over een algoritme op deze site, waar kan ik deze stellen?

\n

Het kan natuurlijk ook dat je na het lezen van de registratie van een algoritme vragen hebt over een specifiek algoritme. Die kun je stellen aan de ‘eigenaar’ van het algoritme. De contactgegevens vind je in de beschrijving van het algoritme. Alle overige vragen kun je sturen naar: algoritmeregister@minbzk.nl\"Link.

\n

5. Staan alle algoritmes van de overheid op deze website?

\n

Op dit moment stelt een kopgroep van overheidsorganisaties hun algoritmes beschikbaar via deze website. In 2023 publiceren nog meer overheidsorganisaties in het Algoritmeregister. Voorlopig gaat het aantal algoritmes op deze website dus nog groeien.

\n

In de toekomst wordt het wettelijk verplicht algoritmes publiekelijk beschikbaar te maken. Daardoor komen de meeste relevante algoritmes in het Algoritmeregister. Hierop zullen gerechtvaardigde uitzonderingen komen. Denk aan opsporing, rechtshandhaving, defensie of inlichtingenverzameling. De exacte kaders worden nog uitgewerkt.

\n

6. Bij sommige algoritmes staat meer informatie dan bij andere algoritmes?

\n

Momenteel gebeurt het vullen van het Algoritmeregister vrijwillig door overheidsorganisaties. Niet elke organisatie heeft ervoor gekozen alle informatie te publiceren. Uiteindelijk wordt er wettelijk vastgelegd welke informatie verplicht aangeleverd moet worden, en welke informatie optioneel is.

\n

7. Wie werken er aan het Algoritmeregister?

\n

De ontwikkeling van het Algoritmeregister is begonnen met het consortium Publieke controle op algoritmes. Daarin werkten overheidsorganisaties aan beleidsinstrumenten voor een verantwoorde inzet van algoritmes. Een van de resultaten is onderzoek naar het Algoritmeregister. Het ministerie van Binnenlandse Zaken en Koninkrijksrelaties heeft voortgebouwd op deze opgedane kennis om tot dit Algoritmeregister te komen. Voor het ontwikkelen van de website werkt het ministerie samen met ICTU. In het Algoritmeregister is te zien welke organisaties op dit moment algoritmes aangeleverd hebben voor het Algoritmeregister. Kijk daarvoor onder het kopje Algoritmes, hier staan alle organisaties die nu één of meerdere algoritmes hebben aangeleverd.

\n

8. Hoe verhouden de algoritmeregisters van overheidsorganisaties zich tot deze website?

\n

Het Algoritmeregister is de centrale vindplek voor alle algoritmes van de overheid. Sommige overheidsorganisaties hebben daarnaast ook een eigen algoritmeregister. Organisaties hebben daar de mogelijkheid om meer informatie te bieden of op andere wijze. In de huidige versie is de informatie handmatig overgenomen. In 2023 wordt gewerkt aan de mogelijkheid van automatische uitwisseling.

", + "pageTitle": "Veelgestelde vragen", + "question1": "Wat is het Algoritmeregister?", + "answer1": "

In het Algoritmeregister staat informatie over algoritmes die de overheid gebruikt. Zo is deze informatie vindbaar en beschikbaar voor burgers, hun belangenbehartigers, de media en toezichthouders.

", + "question2": "Waarvoor gebruikt de overheid algoritmes?", + "answer2": "

Algoritmes kunnen helpen om grote hoeveelheden gegevens efficiënt te verwerken en betere inzichten te geven. Algoritmes helpen zo om die dienstverlening te verbeteren, en tijd en geld te besparen. De overheid gebruikt algoritmes om gegevens te analyseren, beslissingen te nemen en taken te automatiseren. Voorbeelden van algoritmes die de overheid gebruikt zijn verkeersmonitoring en het online aanvragen van overheidsproducten.

", + "question3": "Welke algoritmes horen in het algoritmeregister thuis?", + "answer3": "

In ieder geval horen in dit register thuis:

\n
    \n
  • De algoritmes die door de voorgenomen Europese wetgeving (de AI-Verordering) als hoogrisico worden aangeduid. Dat zijn algoritmes die elementen van autonomie kennen. In het Nederlands noemen we dat meestal (deels) zelflerende algoritmes. Het algoritme moet daarnaast operationeel zijn in één van de toepassingsgebieden van Annex III. Denk aan gebieden als biometrie, kritieke infrastructuur en werkgelegenheid. Meer over de risicoclassificatie in de AI-Verordening.
  • \n
  • Algoritmes die direct impact hebben op de betrokkenen. Ze dragen bijvoorbeeld bij aan een besluit dat van invloed is op iemands rechten, op iemands juridische status of zijn rechten vanuit een overeenkomst. Denk aan: het opleggen van boete of het toekennen of weigeren van een subsidie.
  • \n
\n

Daarnaast zijn er nog een aantal andere redenen om algoritmes volledig te publiceren. Bijvoorbeeld wanneer algoritmes veel maatschappelijke aandacht krijgen. Er zijn ook redenen om een algoritme niet volledig te publiceren, bijvoorbeeld wanneer een algoritme wordt gebruikt voor opsporing. Idealiter publiceert de overheid dan het deel van de informatie over het algoritme wat wel gepubliceerd kan worden.

", + "question4": "Welke organisaties publiceren hun algoritmes in het Algoritmeregister?", + "answer4": "

Nu is publicatie nog vrijwillig voor overheden. In het Algoritmeregister staat daarom informatie over algoritmes van overheidsorganisaties die daar zelf voor gekozen hebben. Regelmatig komen daar nieuwe organisaties bij.

\n

In de toekomst wordt publicatie van algoritmes die in dit register thuishoren verplicht voor alle overheidsorganisaties; dus de rijksoverheid, provincies, gemeenten, waterschappen. Nog niet duidelijk is of andere organisaties uit de publieke sector zoals zorg en onderwijs ook onder deze verplichting gaan vallen. Dat wordt duidelijker op weg naar wetgeving in 2025.

", + "question5": "Hoe zit het met mijn privacy bij het gebruik van algoritmes?", + "answer5": "

Sommige algoritmes gebruiken persoonsgegevens voor hun taak. Persoonsgegevens zijn gegevens die informatie bevatten die kan worden gebruikt om een individu te identificeren, zoals naam, adres, geboortedatum of financiële informatie. Er zijn veel eisen aan het gebruik van persoonsgegevens, ook door de overheid. Veel eisen staan in wetgeving, zoals de AVG. In het Algoritmeregister staat informatie over welke gegevensbronnen het algoritme gebruikt. En over welke toetsen zijn uitgevoerd voordat het algoritme in gebruik werd genomen, bijvoorbeeld een privacytoets (DPIA). De Autoriteit Persoonsgegevens houdt toezicht op naleving van de privacy-eisen en sinds 1 januari ook toezicht op algoritmes.

", + "question6": "Hoeveel algoritmes gebruikt de overheid en hoeveel komen er in dit register?", + "answer6": "

We staan aan het begin van een proces waarin de overheid actief algoritmes openbaar maakt. Het aantal algoritmes in het register is nog niet het totaal aantal algoritmes dat de overheid gebruikt. Om dat aantal naar waarde te kunnen schatten, is de volgende vraag relevant: hoeveel algoritmes gebruikt de overheid eigenlijk? En hoeveel zijn er daarvan impactvol of hoog-risico volgens de AI-Verordening? Op dit moment is er weinig zicht op het totale aantal algoritmes bij de overheid. Het is dus ook niet bekend hoeveel algoritmes uiteindelijk in het register terecht horen te komen. In de loop der jaren zal er steeds meer inzicht ontstaan in het aantal en de aard van algoritmes bij de overheid.

", + "question7": "Welke informatie over algoritmes haal ik uit het Algoritmeregister?", + "answer7": "

De Publicatiestandaard beschrijft de informatie die nodig is om een Algoritme te beschrijven. Deze Publicatiestandaard wordt steeds verder verbeterd zodat het beter aansluit op de praktijk, in overleg met overheden, belanghebbenden en experts. De velden uit de publicatiestandaard zijn daarom nog niet verplicht. Gevolg is dat bij sommige algoritmes in het register, nog niet alle velden zijn ingevoerd. Overheidsorganisaties worden gestimuleerd om zoveel mogelijk informatie over hun algoritmes te publiceren.

", + "question8": "Hoe vind ik een algoritme in dit register?", + "question9": "Wat doe ik als het algoritme dat ik zoek er niet instaat?", + "answer9": "

Neem dan contact op met de organisatie die het algoritme inzet, en vraag om toelichting op het besluit of het proces. Bij de meeste organisaties staan de contactgegevens in de beschrijving van het algoritme. Kom je daar niet uit? Neem dan contact op met algoritmeregister@minbzk.nl dan verwijzen wij je gericht door. 

", + "question10": "Wat doe ik als de informatie over het algoritme niet duidelijk is of als er informatie ontbreekt?", + "answer10": "

Vragen over een beschrijving of missende informatie, stel je aan de organisatie die het algoritme heeft gepubliceerd. Bij de meeste algoritmes in het register staan de contactgegevens in de beschrijving. Kom je daar niet uit? Neem dan contact op met algoritmeregister@minbzk.nl, dan verwijzen wij je gericht door.

", + "question11": "Waar kan ik een klacht indienen of bezwaar maken tegen een algoritme van de overheid in dit register?", + "answer11": "

Bezwaar maken en een klacht indienen, doe je bij de organisatie die het algoritme inzet. (Hoe je dat doet, lees je in dit antwoord [link FAQ 10]. Dat is altijd de eerste stap. Kom je er samen niet uit, dan kun je hulp krijgen. Bijvoorbeeld bij de Nationale Ombudsman. Meer over wat de Nationale Ombudsman kan betekenen. Direct naar het klachtenformulier.

", + "question12": "Kan ik mij afmelden voor het gebruik van algoritmes?", + "answer12": "

Je kunt je niet afmelden voor het gebruik van algoritmes. Wel kun je in dit register informatie vinden over hoe het algoritme werkt en wat het doet. En je kunt vragen om een toelichting als je een beslissing van een algoritme niet snapt of als je denkt dat het niet klopt. Je kunt bezwaar maken als je denkt dat het algoritme fouten heeft gemaakt die jou en/of anderen hebben benadeeld.

", + "answer15": "

Het Nederlandse Algoritmeregister komt echt voort uit een Nederlandse wens, gebaseerd op een aantal rapporten, kamermoties en adviezen om tot een register te komen voor meer transparantie vanuit de Nederlandse overheid.  

\n

De concept AI-Verordening gaat waarschijnlijk verplicht stellen dat hoogrisico AI-algoritmes worden gedocumenteerd. Deze algoritmes zullen uiteindelijk in dit Algoritmeregister terecht komen. Om te voldoen aan de eisen van de wet wordt op den duur de publicatiestandaard aangepast. Er zijn ook verschillen: niet alle algoritmes in het Algoritmeregister zijn hoogrisico en/of AI-algoritmes. Er staan ook niet-zelflerende algoritmes en/of algoritmes met een lager risicokarakter in dit register. Dat blijft ook zo. Het register zoekt wel de aansluiting op de AI-Verordening Zodat het makkelijk wordt voor overheden die in het Nederlandse register staan daarmee ook te voldoen aan de verplichtingen vanuit de AI-Verordening. Hier is het ook wel wachten op hoe de Europese Databank eruit gaat zien. Het hangt van de Europese commissie af, de Nederlandse overheid is daarover in gesprek.

", + "answer16": "

Er wordt onderzocht of aanvullende wetgeving nodig is. Dit wordt bezien in samenhang met de EU-wetgeving. Dat is aangekondigd in de Kamerbrief van december 2022. Dit duurt zeker nog tot 2025.

", + "question13": "Hoe doe ik mee als overheidsorganisatie?", + "answer13": "

Doe mee en publiceer de informatie over de algoritmes van je organisatie. Denk ook mee over de verdere ontwikkeling van dit Algoritmeregister. Deze informatie vind je op de pagina ‘Meedoen’.

", + "answer17": "

Stel je vraag via algoritmeregister@minbzk.nl.

", + "group2": "B Gebruik van het Algoritmeregister", + "group4": "D Meedoen | op de hoogte blijven", + "group6": "F Andere vraag", + "answer8": "

Er zijn twee mogelijkheden. Je kunt allereerst zoeken op organisatie, woord of thema. Bijvoorbeeld: Gemeente X, Parkeren of Sociale Zekerheid. Je krijgt dan een overzicht van de algoritmes die door deze gemeente, met dit woord in de omschrijvingen, of in dit thema zijn gepubliceerd. Een tweede mogelijkheid is om door alle algoritmes in het register te ‘bladeren’. 

", + "answer14": "
    \n
  • We organiseren regelmatig open bijeenkomsten. Bekijk daarvoor de agenda op de Pleio pagina rond algoritmes.
  • \n
  • Op algoritmes.pleio.nl vind je nieuws, de agenda en een aantal community’s waar je over een bepaald onderwerp op de hoogte blijft en mee kunt praten.
  • \n
  • Abonneer je op de nieuwsbrief en krijg regelmatig een update van het algoritmenieuws in je mailbox. Meld je aan.
  • \n
  • Algoritmes.overheid.nl is ontwikkeld met open source software. De code en bijvoorbeeld de publicatiestandaard, vind je op de GitHub pagina van het ministerie van BZK.
  • \n
" + }, + "Footer: Privacyverklaring": { + "content": "

Privacy

\n

Deze website maakt gebruik van analytische cookies. Cookies zijn kleine tekstbestanden die websites op jouw computer opslaan. Daarmee is jouw computer te herkennen tijdens uw bezoek. Deze informatie helpt het bouwteam om de site te verbeteren. Analytische cookies geven antwoord op bijvoorbeeld de volgende vragen:

\n
    \n
  • Is de bezoeker nieuw of heeft de bezoeker de site al eerder bezocht
  • \n
  • Welke pagina's zijn tijdens het bezoek geraadpleegd
  • \n
  • Van welke site is de bezoeker gekomen
  • \n
  • Heeft de bezoeker de site meteen weer verlaten ('bouncing').
  • \n
\n

Deze cookies worden niet gebruikt om een profiel aan te maken of jou verder te volgen. Deze website plaatst geen cookies van derde partijen (third-party cookies).

\n

Gegevens via e-mail

\n

Persoonlijke informatie die via e-mail bij het Algoritmeregister bekend wordt, behandelt het team vertrouwelijk. Dergelijke persoonlijke gegevens bewaart het team alleen voor de duur van de behandeling van het bericht. Nadat je antwoord hebt gekregen of als er geen antwoord gevraagd wordt, slaat het team alleen de vraag en het antwoord op. Op verzoek verwijdert het team ook de vraag en het antwoord.

", + "pageTitle": "Privacy" + }, + "Footer: Toegankelijkheid": { + "content": "

Toegankelijkheid

\n

Bij het ontwikkelen van deze website worden de wensen en eisen voor een toegankelijke website direct ingebouwd. Het bouwteam van het Algoritmeregister is getraind in digitale toegankelijkheid. Een onafhankelijke toegankelijkheidsexpert levert regelmatig advies.

\n

Deze website voldoet aan WCAG 2.1 niveau AA, de Web Content Accesibility Guidelines.

\n

Dit betekent dat de website gebruikt kan worden door iedereen, inclusief mensen met een functiebeperking.

\n

Voor meer informatie:

\n", + "pageTitle": "Toegankelijkheid" + }, + "Footer: Webarchief": { + "content": "

Webarchief

\n

Websites zijn een belangrijke informatiebron voor burgers, bedrijven en overheden. Dit geldt ook voor vorige versies van websites. Hier kan informatie op staan die nog steeds relevant is en waar rechten aan kunnen worden ontleend. Door websites te archiveren, kunnen ze duurzaam toegankelijk blijven: ze blijven dus beschikbaar voor het terugkijken van openbare informatie. Dit is verplicht voor alle overheidswebsites.

\n

Deze versies komen te staan in het webarchief.

\n

In het overzicht vind je de webarchieven van alle verplichte deelnemers. Klik op een archief, kies een datum uit het verleden via de kalender en de site past haar inhoud aan op wat er toen actueel was. Je kunt teruggaan tot 25 januari 2023.

\n

Meer weten? Bekijk de Richtlijn archiveren overheidswebsites hier.

", + "pageTitle": "Webarchief" + }, + "Footer: Over": { + "content": "

Over het Algoritmeregister

\n

De regering wil dat de overheid algoritmes verantwoord gebruikt. Mensen moeten erop kunnen vertrouwen dat algoritmes voldoen aan de waarden en normen van de samenleving. En er moet uitleg zijn over hoe algoritmes werken. Dat doet de overheid door algoritmes voor het gebruik te controleren op hoe ze werken en op eventuele discriminatie en willekeur daarbij. Wanneer de overheid open is over algoritmes en hun toepassing, kunnen burgers, organisaties en media haar kritisch volgen en controleren of ze de wet en de regels volgt.

\n

Verantwoord algoritmegebruik

\n

Onder andere de volgende trajecten dragen bij aan verantwoord algoritmegebruik:

\n
    \n
  1. Het Algoritmeregister helpt om algoritmes vindbaar te maken, beter uit te leggen en hun toepassing en resultaten begrijpelijk te maken.
  2. \n
  3. De Algoritmetoezichthouder (de Autoriteit Persoonsgegevens) coördineert de controle op algoritmes: voldoen de algoritmes van de overheid aan alle regels die daarvoor gelden? Meer informatie over de toezichthouder.
  4. \n
  5. Het ministerie van BZK werkt aan het Implementatiekader 'Inzet van algoritmes'. Dat maakt voor overheden duidelijk welke eisen er gelden voor algoritmes en hoe ze ervoor kunnen zorgen dat hun algoritmes aan die eisen kunnen voldoen.
  6. \n
  7. Wetgeving: er komt een wettelijk kader voor transparantie van algoritmes. Dat is aangekondigd in de kamerbrief van december 2022.
  8. \n
\n

Open ontwikkeling

\n

In december 2022 is de eerste versie van het Algoritmeregister gelanceerd. Dit vormt de basis voor verdere ontwikkeling. Doordat we de oplossing in de praktijk brengen kunnen we kennis en ervaring op doen. We ontwikkelen het register open door, samen met experts, (potentiële) gebruikers en belanghebbenden.

\n

Wil je daaraan bijdragen?

\n

Steeds meer algoritmes

\n

Het Algoritmeregister is nog niet compleet. Het aanleveren van informatie over algoritmes is nu nog niet verplicht voor overheidsorganisaties. Die verplichting komt er wel aan. Voor die tijd publiceren steeds meer overheidsorganisaties algoritmes uit eigen beweging in het register. Omdat zij open en transparant willen zijn over hun processen en de inzet van algoritmes daarbij.

\n

Lees bijvoorbeeld het verhaal van de gemeente Amersfoort en van de Omgevingsdienst Noordzeekanaalgebied.

", + "pageTitle": "Over het Algoritmeregister" + }, + "Footer: Meedoen": { + "pageTitle": "Meedoen", + "content": "

Meedoen

\n

Je kunt meedoen als je bij de overheid werkt, en als je niet bij de overheid werkt.

\n

Overheden: doe mee en denk mee

\n

Steeds meer overheden doen mee en publiceren in dit Algoritmeregister van de overheid informatie over hun impactvolle algoritmes en algoritmes met een hoog-risico volgens de aanstaande Europese AI Verordening.

\n

Uitgangspunt is dat overheden zelf verantwoordelijk zijn voor het opstellen en het beheer van hun algoritmes in het Algoritmeregister. Het Algoritmeregister ondersteunt daarbij met hulp, handreikingen, tools en een publicatiestandaard.

\n

Hulp en handreikingen

\n
    \n
  1. Wil jouw organisatie meedoen en de algoritmes die jullie gebruiken publiceren? Meer informatie daarover lees je op algoritmes.pleio.nl, bijvoorbeeld in de handreiking ‘Aan de slag met het algoritmeregister’.
  2. \n
  3. Op algoritmes.pleio.nl vind je de planning en achtergrondinformatie. Bovendien vind je daar verhalen van organisaties over hoe en waarom ze zijn aangesloten op het Algoritmeregister. Bijvoorbeeld van de gemeente Amersfoort en de Omgevingsdienst NZKG.
  4. \n
  5. Bekijk de publicatiestandaard – welke informatie lever je aan als je een algoritme wilt publiceren? Deze standaard is nog in ontwikkeling.
  6. \n
  7. Je kunt ook contact met ons opnemen voor hulp via algoritmeregister@minbzk.nl.
  8. \n
\n

Tools: zelf makkelijk publiceren

\n
    \n
  1. Je kunt aanleveren met een online formulier of geautomatiseerd via een API.
  2. \n
  3. Ieder kwartaal presenteren we de nieuwe tools van de applicatie in openbare demo’s. Tussendoor blijf je op de hoogte in de sprintreviews. Bekijk daarvoor de agenda.
  4. \n
\n

Geïnteresseerd? Blijf op de hoogte en praat mee

\n

Het Algoritmeregister, de hulpmiddelen en standaarden ontwikkelen we samen met stakeholders verder door. Werk je niet bij de overheid en praat en denk je graag mee? Dat kan op de volgende manieren.

\n
    \n
  1. Doe mee met de community op het platform Pleio. Maak daarvoor een account aan.
  2. \n
  3. De software van het register is open source. Bekijk de code op de GitHub van het ministerie van BZK.
  4. \n
  5. Openbare online Heartbeats en Meetups: regelmatig zijn er bijeenkomsten over de stand van zaken (Heartbeats) en over specifieke thema’s (Meetups). Bekijk de agenda.
  6. \n
  7. (Potentiële) gebruikers, maatschappelijke organisaties en experts denken mee over de verdere verbetering van het Algoritmeregister. Zodat het Algoritmeregister straks zoveel mogelijk aansluit op wat mensen nodig hebben. We houden daarvoor bijvoorbeeld veel interviews.
  8. \n
\n
 
" + }, + "Footer: Over algoritmes": { + "pageTitle": "Over algoritmes", + "img_alt": "De verzameling 'alle algoritmes' bevat zowel deelverzameling 'Impactvolle algoritmes' (met invloed op mensen) als de deelverzameling 'AI'.", + "content": "

Over algoritmes

\n
\n

Een algoritme is een set van regels en instructies die een computer geautomatiseerd volgt bij het maken van berekeningen om een probleem op te lossen of een vraag te beantwoorden (bron: Algemene Rekenkamer). Je komt algoritmes overal tegen, ook bij de overheid. 

\n
\n
\n

Wie regelmatig iets op internet doet, komt algoritmes tegen. Browsers, online bankieren, streamingdiensten als Netflix, en sociale media als Facebook en Instagram; algoritmes maken het mogelijk.

\n
\n
\n

Ook de overheid gebruikt algoritmes. Denk aan het online aanvragen van een subsidie. Het algoritme helpt dan om direct te beoordelen of je voldoet aan de voorwaarden of niet. Dit is een voorbeeld van een algoritme met duidelijke beslisregels en een eenduidig antwoord: ja of nee?  

\n
\n
\n

Andere algoritmes kunnen trends herkennen. Ze laten bijvoorbeeld zien hoe criminaliteit zich ontwikkelt in een stad. Dat helpt de politie en gemeente de juiste maatregelen te nemen. Of ze analyseren (anoniem) gezondheidsgegevens, waarmee beleid voor de publieke gezondheid gemaakt kan worden. Soms zijn deze algoritmes ‘(zelf)lerend’. Dat wil zeggen dat ze getraind worden om zelf patronen te ontdekken.  

\n
\n
\n

Impactvolle algoritmes 

\n
\n
\n

Algoritmes zijn niet perfect. Ze maken soms fouten en er is een risico op vooroordelen, net als bij mensen. In het verleden is dat een paar keer flink misgegaan met geautomatiseerde processen bij de overheid.  

\n
\n
\n

De overheid werkt aan verbetering. Dat doet ze bijvoorbeeld door algoritmes op een verantwoorde manier te ontwikkelen en te gebruiken. Belangrijk is dat de overheid transparant is over de impactvolle algoritmes die ze gebruikt. Zodat burgers en belanghebbenden inzicht hebben in algoritmes die invloed hebben op hun leven. Impactvol zijn bijvoorbeeld de algoritmes die rechtsgevolgen hebben voor mensen, of die zorgen dat de overheid mensen classificeert. Denk aan het identificeren van mensen die recht hebben op bepaalde voorzieningen, zodat de overheid proactief hulp kan bieden.  

\n
\n
\n

Zichtbaar en controleerbaar 

\n
\n
\n

Het Algoritmeregister wil de gebruikte impactvolle algoritmes zichtbaar en controleerbaar maken. Zodat jij als burger, belangenbehartiger, expert of journalist kan meekijken. Wanneer je vragen hebt, of denkt dat er iets niet klopt met een algoritme in dit register, kun je contact opnemen met de organisatie die het algoritme beheert. Of: Lees meer over het Algoritmeregister.

\n
\n
\n

Relatie met AI 

\n
\n
\n

Artificiële (of kunstmatige) intelligentie (AI) stelt computers en machines in staat intelligente taken uit te voeren. Een bekend voorbeeld daarvan is ChatGPT, een programma dat de vragen kan beantwoorden die je eraan stelt. Een ander voorbeeld is AI die een arts kan helpen om verschillende soorten kanker snel op te sporen.  

\n
\n
\n

Algoritmes zijn een belangrijk onderdeel van AI, omdat ze computers en machines helpen om deze taken uit te voeren met wiskundige formules en patronen. AI kan daardoor bijvoorbeeld verbanden ontdekken en beelden analyseren. De relatie tussen AI en algoritmes is als volgt: AI bestaat uit algoritmes, maar niet alle algoritmes zijn onderdeel van AI. De eerdergenoemde niet-zelflerende algoritmes zijn bijvoorbeeld geen AI-systemen, maar je vindt ze wel terug in dit register.  

\n
\n
\n

Dit verband tussen AI en algoritmes, zie je terug in het onderstaande schema. Een deel van alle algoritmes – al dan niet onderdeel van een AI-systeem – is impactvol.  

\n
", + "content2": "
\n

Dat betekent twee dingen. Ten eerste: alle AI bestaat uit algoritmes, maar een klein deel van de algoritmes zijn onderdeel van een AI-systeem. Ten tweede: er is een overlap tussen impactvolle algoritmes en AI. Sommige AI is impactvol, andere AI niet. 

\n
\n
\n

Wetgeving 

\n
\n
\n

De Europese Unie werkt aan wetgeving specifiek voor AI: de AI Verordening. Meer over de relatie tussen het Algoritmeregister en de aankomende AI Verordening.

\n
" + }, + "footer": { + "text": "Let op: deze website is in ontwikkeling. De informatie verandert vaak. Wil je", + "textForLink": "meehelpen?" + }, + "Home": { + "about": "

Over algoritmes

\n

Een algoritme is een set van regels en instructies die een computer geautomatiseerd volgt bij het maken van berekeningen om een probleem op te lossen of een vraag te beantwoorden. Meer over algoritmes.

", + "collaborate": "

Samen doorontwikkelen
Steeds meer overheidsorganisaties publiceren informatie over hun algoritmes in het Algoritmeregister. Het register wordt open doorontwikkeld. Doe ook mee.

", + "aboutRegister": "

Over dit register

\n

In dit Algoritmeregister publiceren steeds meer Nederlandse overheidsorganisaties de algoritmes die zij gebruiken in hun werk. Ze focussen op impactvolle algoritmes en geven de bezoeker inzicht in hoe deze algoritmes werken. Meer over dit register.

", + "highlightTextBottom": "

Of blader door alle algoritmes

", + "toDo": "

Wat kan ik hier doen?

\n

Hoe kun je het Algoritmeregister gebruiken? En wat doe je als het algoritme dat je zoekt, nog niet in dit register staat? Bekijk de veelgestelde vragen.

", + "highlightTextTop": "Bekijk de 3 meest recent gewijzigde algoritmebeschrijvingen" + }, + "Zoekbalk": { + "hint": "Zoek op woord, thema of organisatie" + }, + "Footer: Versie-informatie": { + "content": "
\n

Versie-informatie 

\n
\n
\n

Oktober 2023 

\n
\n
\n

In deze release zijn een aantal belangrijke verbeteringen op Het Algoritmeregister doorgevoerd voor de gebruiker. 

\n
\n
\n

1. De downloadopties zijn uitgebreid.  

\n
\n
\n

Vanaf nu zijn de algoritmebeschrijvingen in enkele vorm en in bulk te downloaden. Dit kan in Microsoft Word met correcte styling, in Microsoft Excel met sortering per publicatiestandaard, of als PDF met bewerkbare invulvelden.

\n

2. De flows voor organisaties zijn versimpeld en versneld. 

\n
\n
\n

Hiermee versnelt het proces van publiceren van een algoritmebeschrijving. Er kan vele malen sneller gereageerd worden op een vrijgave. Dit duurt nu een paar seconden, in plaats van ongeveer 15 minuten.  

\n
\n
\n

3. De database is geüpgraded naar de nieuwste architectuur.  

\n
\n
\n

De beschikbaarheid van de website is verhoogd door de eigenschappen van de nieuwe architectuur. Verder merkt de gebruiker hier weinig van.  

\n
\n
\n

4 .Door versiebeheer is nu te zien wie de webformulieren het laatst heeft bewerkt.  

\n
\n
\n

Dit maakt het mogelijk voor redacteurs om te zien wie het laatst aanpassingen heeft gemaakt. De traceerbaarheid voor organisaties wordt dus vergroot. Ook helpt het ICTU met het terugkijken in de tijd en kan ze partijen beter helpen met hun wijzigingen.  

\n
\n
\n

5. Het webformulier is nu beschikbaar op een nieuw adres.  

\n
\n
\n

Na een testperiode is het webformulier verhuisd naar https://algoritmes.overheid.nl/webformulier. Dit geldt ook voor de aanlever-API, die is verhuisd naar https://algoritmes.overheid.nl/aanleverapi

\n
", + "pageTitle": "Versie-informatie" + }, + "language-disclaimer": { + "closeText": "Sluiten", + "content": "

Let op: De algoritmebeschrijvingen in het engels zijn automatisch vertaald. Hier kunnen fouten in zitten. Voor de originele beschrijvingen gaat u naar de nederlandse versie van het Algoritmeregister.

", + "goToDutch": "Ga naar Nederlands" + } + }, + "fy": { + "Footer: Contact": { + "content": "", + "pageTitle": "" + }, + "Footer: Vragen": { + "question14": "", + "question15": "", + "question16": "", + "question17": "", + "group1": "", + "group3": "", + "group5": "", + "content": "", + "pageTitle": "", + "question1": "", + "answer1": "", + "question2": "", + "answer2": "", + "question3": "", + "answer3": "", + "question4": "", + "answer4": "", + "question5": "", + "answer5": "", + "question6": "", + "answer6": "", + "question7": "", + "answer7": "", + "question8": "", + "question9": "", + "answer9": "", + "question10": "", + "answer10": "", + "question11": "", + "answer11": "", + "question12": "", + "answer12": "", + "answer15": "", + "answer16": "", + "question13": "", + "answer13": "", + "answer17": "", + "group2": "", + "group4": "", + "group6": "", + "answer8": "", + "answer14": "" + }, + "Footer: Privacyverklaring": { + "content": "", + "pageTitle": "" + }, + "Footer: Toegankelijkheid": { + "content": "", + "pageTitle": "" + }, + "Footer: Over": { + "content": "

Oer dizze site

", + "pageTitle": "" + }, + "Footer: Meedoen": { + "pageTitle": "", + "content": "" + }, + "Footer: Over algoritmes": { + "pageTitle": "", + "img_alt": "", + "content": "", + "content2": "" + }, + "footer": { + "text": "", + "textForLink": "" + }, + "Home": { + "about": "", + "collaborate": "", + "aboutRegister": "", + "highlightTextBottom": "", + "toDo": "", + "highlightTextTop": "" + }, + "Zoekbalk": { + "hint": "" + }, + "Footer: Versie-informatie": { + "content": "", + "pageTitle": "" + }, + "language-disclaimer": { + "closeText": "", + "content": "", + "goToDutch": "" + } + }, + "pap": { + "Footer: Contact": { + "content": "", + "pageTitle": "" + }, + "Footer: Vragen": { + "question14": "", + "question15": "", + "question16": "", + "question17": "", + "group1": "", + "group3": "", + "group5": "", + "content": "", + "pageTitle": "", + "question1": "", + "answer1": "", + "question2": "", + "answer2": "", + "question3": "", + "answer3": "", + "question4": "", + "answer4": "", + "question5": "", + "answer5": "", + "question6": "", + "answer6": "", + "question7": "", + "answer7": "", + "question8": "", + "question9": "", + "answer9": "", + "question10": "", + "answer10": "", + "question11": "", + "answer11": "", + "question12": "", + "answer12": "", + "answer15": "", + "answer16": "", + "question13": "", + "answer13": "", + "answer17": "", + "group2": "", + "group4": "", + "group6": "", + "answer8": "", + "answer14": "" + }, + "Footer: Privacyverklaring": { + "content": "", + "pageTitle": "" + }, + "Footer: Toegankelijkheid": { + "content": "", + "pageTitle": "" + }, + "Footer: Over": { + "content": "", + "pageTitle": "" + }, + "Footer: Meedoen": { + "pageTitle": "", + "content": "" + }, + "Footer: Over algoritmes": { + "pageTitle": "", + "img_alt": "", + "content": "", + "content2": "" + }, + "footer": { + "text": "", + "textForLink": "" + }, + "Home": { + "about": "", + "collaborate": "", + "aboutRegister": "", + "highlightTextBottom": "", + "toDo": "", + "highlightTextTop": "" + }, + "Zoekbalk": { + "hint": "" + }, + "Footer: Versie-informatie": { + "content": "", + "pageTitle": "" + }, + "language-disclaimer": { + "closeText": "", + "content": "", + "goToDutch": "" + } + } +} diff --git a/backend/app/data/preditor/pvc_mounts_here.txt b/backend/app/data/preditor/pvc_mounts_here.txt new file mode 100644 index 00000000..d14f0d3b --- /dev/null +++ b/backend/app/data/preditor/pvc_mounts_here.txt @@ -0,0 +1 @@ +The PVC overwrites anything in this folder. For local development use the supporting_text.json in the app/data/default folder. \ No newline at end of file diff --git a/backend/app/data/templates/0.4.0/Centric.json b/backend/app/data/templates/0.4.0/Centric.json new file mode 100644 index 00000000..6c8acc18 --- /dev/null +++ b/backend/app/data/templates/0.4.0/Centric.json @@ -0,0 +1,44 @@ +[ + { + "id": "centric-burgerzaken-ediensten", + "name": "Burgerzaken: eDiensten", + "description_short": "Dit sjabloon is binnenkort beschikbaar, zodra de sjablonen in versie 0.4.0 beschikbaar zijn", + "organization": null + }, + { + "id": "centric-module-inzicht", + "name": "Burgerzaken: Module Inzicht", + "description_short": "Dit sjabloon is binnenkort beschikbaar, zodra de sjablonen in versie 0.4.0 beschikbaar zijn", + "organization": null + }, + { + "id": "centric-ediensten-voor-aanvragen", + "name": "Sociaal Domein: eDiensten voor aanvragen", + "description_short": "Dit sjabloon is binnenkort beschikbaar, zodra de sjablonen in versie 0.4.0 beschikbaar zijn", + "organization": null + }, + { + "id": "centric-pko-kennissystemen", + "name": "Sociaal Domein: PKO Kennissystemen", + "description_short": "Dit sjabloon is binnenkort beschikbaar, zodra de sjablonen in versie 0.4.0 beschikbaar zijn", + "organization": null + }, + { + "id": "centric-legesberekening", + "name": "Leefomgeving: Legesberekening", + "description_short": "Dit sjabloon is binnenkort beschikbaar, zodra de sjablonen in versie 0.4.0 beschikbaar zijn", + "organization": null + }, + { + "id": "centric-belastingen-lokale-heffingen", + "name": "Belastingen: Berekening belastingbedrag lokale heffingen", + "description_short": "Dit sjabloon is binnenkort beschikbaar, zodra de sjablonen in versie 0.4.0 beschikbaar zijn", + "organization": null + }, + { + "id": "centric-belastingen-woz", + "name": "Belastingen: WOZ taxatiemodellen", + "description_short": "Dit sjabloon is binnenkort beschikbaar, zodra de sjablonen in versie 0.4.0 beschikbaar zijn", + "organization": null + } +] \ No newline at end of file diff --git a/backend/app/data/templates/0.4.0/PinkRoccade.json b/backend/app/data/templates/0.4.0/PinkRoccade.json new file mode 100644 index 00000000..30c072c3 --- /dev/null +++ b/backend/app/data/templates/0.4.0/PinkRoccade.json @@ -0,0 +1,37 @@ +[ + { + "id": "pinkroccade-iburgerzaken", + "name": "iBurgerzaken e-diensten", + "organization": null, + "description_short": null, + "type": "Nee", + "category": [ + "Dienstverlening" + ], + "website": null, + "status": "In gebruik", + "begin_date": "2014-06", + "end_date": null, + "goal": "
Doel
\n
Het doel van de e-diensten met het onderliggende algoritme is inwoners en ondernemers maximaal ondersteunen/begeleiden bij een digitale aanvraag. Daardoor kan deze aanvraag juist en volledig worden ingediend. Het algoritme controleert verschillende gegevens van de inwoner. Als er geen bijzonderheden geconstateerd worden in de aanvraag of aangifte kan deze verwerkt worden zonder tussenkomst van een burgerzakenmedewerker.25 oktober 2023 PinkRoccade Publiekszaken 3 / 5 Als er wel een of meerdere bijzonderheden geconstateerd worden komt de aanvraag/aangifte altijd terecht in een werklijst. Daar wordt deze gecontroleerd door een burgerzakenmedewerker. Het algoritme kan alleen automatisch een aanvraag/aangifte goedkeuren. Een aanvraag/aangifte afkeuren kan alleen de burgerzakenmedewerker.
\n
\n
Impact
\n
De impact is dat een dergelijke aanvraag efficiënt kan worden afgehandeld door de gemeente; burger/bedrijf heeft namelijk diverse stappen (werkzaamheden) al uitgevoerd waardoor de ambtenaar meer tijd overhoudt voor de bijzondere en/of ingewikkelde aangiften/aanvragen die de gemeente ontvangt. In een aantal gevallen kan deze aanvraag zelfs volledig automatisch worden verwerkt. De kwaliteit van de dienstverlening gaat door deze diensten omhoog, net als de kwaliteit van de gegevens in de BRP.
", + "proportionality": "

Alle aanvragen via de balie afhandelen is voor gemeenten geen optie meer. Dat komt door de aantallen en de tijdsdruk. Een algoritme biedt inwoners en ondernemers begeleiding bij (digitale) aanvragen. Een gemeente kan ervoor kiezen om elke digitale aanvraag nog ter beoordeling aan de burgerzakenmedewerker aan te bieden voordat deze wordt afgehandeld. Voor mensen die niet of minder digivaardig zijn bestaat er altijd nog de mogelijkheid om via de balie van de gemeente de aanvraag te doen.

", + "provider": "PinkRoccade Local Government", + "lawful_basis": "
Wet basisregistratie personen
\n
Wet rechten burgerlijke stand
", + "lawful_basis_link": "https://wetten.overheid.nl/BWBR0033715\nhttps://wetten.overheid.nl/BWBR0001851", + "impacttoetsen": [ + "DPIA, via gemeenten" + ], + "iama_description": null, + "url": null, + "lang": "NLD", + "standard_version": "0.4.0", + "uuid": null, + "source_id": null, + "tags": null, + "source_data": "
Gegevens die worden gebruikt komen uit de BRP, burgerlijke stand registers, KvK, CRB (Centraal Rijbewijzenregister) en aangehaakte gegevens.
", + "source_data_link": "BRP: https://www.rvig.nl/basisregistratie-personen \nLV BAG: https://www.kadaster.nl/zakelijk/registraties/basisregistraties/bag \nCRB: https://www.rdw.nl/", + "methods_and_models": "

Via de website van de gemeente kan een inwoner of ondernemer een e-dienst starten. Iedere aanvraag wordt tijdens het invullen al getoetst tegen de voor de aanvraag geldende wet- en regelgeving. Een volledig ingevulde digitale aanvraag/aangifte komt ter beoordeling en afhandeling van een burgerzakenmedewerker, op de werklijst in iBurgerzaken. Bij het openen van een aanvraag of aangifte op de werklijst is het voor de burgerzakenmedewerker zichtbaar welke controle een meldingen heeft opgeleverd, voor een juiste beoordeling en afhandeling. Een gemeente kan voor een aantal digitale aanvragen kiezen of iBurgerzaken, deze zonder tussenkomst van een burgerzakenmedewerker, automatisch mag verwerken. iBurgerzaken verwerkt een aanvraag geheel automatisch als geen enkele controle een waarschuwing oplevert. Daarnaast kan de gemeente ook kiezen in welke situaties de aanvraag altijd op de werklijst ter beoordeling en afhandeling komt. Bijvoorbeeld bij Verhuizing binnen Nederland: als er sprake is van overbewoning op het nieuw adres.

", + "publiccode": null, + "human_intervention": "

Het algoritme gaat uit van een positief scenario. Daardoor worden alleen eenvoudige aangiften en aanvragen automatisch verwerkt. Wanneer een of meerdere bijzonderheden optreden, dan wordt de aanvraag/aangifte altijd door een burgerzakenmedewerker beoordeeld. De burgerzakenmedewerker controleert deze dan zelf; verwerken of afwijzen. Bij afwijzing is het altijd de burgerzakenmedewerker die dit doet en nooit het algoritme.

", + "risks": "

Het is aan gemeenten om vorm te geven aan het risicobeheer en aan de hand daarvan de e-diensten te configureren.

" + } +] \ No newline at end of file diff --git a/backend/app/data/templates/0.4.0/Procura.json b/backend/app/data/templates/0.4.0/Procura.json new file mode 100644 index 00000000..9b3585f7 --- /dev/null +++ b/backend/app/data/templates/0.4.0/Procura.json @@ -0,0 +1,35 @@ +[ + { + "id": "procura-vrijbrp-risicoanalyse", + "name": "vrijBRP - Risicoanalyse", + "organization": null, + "description_short": null, + "type": "Nee", + "category": [ + "Dienstverlening" + ], + "website": null, + "status": "In gebruik", + "begin_date": null, + "end_date": null, + "goal": "
Het doel was het in staat stellen van gemeenten om doelmatiger om te kunnen gaan met controles van verhuismutaties. Impact op burgers is in de regel positief of klein. Veel aangiften kunnen nu automatisch worden verwerkt (sneller). Aangiften die \"uitvallen\" en dus handmatige controle vergen kunnen een iets langere verwerkingstijd hebben.
", + "proportionality": "
Doordat veel eenvoudige aangiften automatisch verwerkt worden houdt de ambtenaar meer tijd over voor de bijzondere en/of ingewikkelde aangiften die de gemeente ontvangt. Hierdoor kunnen deze beter en nauwkeuriger beoordeeld worden. Hierdoor wordt de aangever beter geholpen en worden er minder fouten gemaakt. Dit zorgt voor een betere kwaliteit van de BRP.
", + "provider": "Procura", + "lawful_basis": "
Wet BRP, artikelen 1.4, 2.45 en 2.37a t/m g
", + "lawful_basis_link": "https://wetten.overheid.nl/BWBR0033715", + "impacttoetsen": null, + "iama_description": null, + "url": null, + "lang": "NLD", + "standard_version": "0.4.0", + "uuid": null, + "source_id": null, + "tags": null, + "source_data": "
\n
    \n
  • BSN verhuizende personen
  • \n
  • Aanwezige markering van de verhuizende personen
  • \n
  • Aanwezige markering van het nieuwe adres van de verhuizende personen
  • \n
  • Functie van het oude/nieuwe adres (woonadres/briefadres)
  • \n
  • Onderzoeksgegevens categorie 08
  • \n
  • verblijfplaats verhuizende personen
  • \n
  • Tijd van de e-aangifte
  • \n
  • Reisdocumentgegevens verhuizende personen
  • \n
  • Rijbewijsgegevens verhuizende personen
  • \n
  • BAG-gegevens nieuwe adres verhuizende personen
  • \n
  • Gegevens over curatele in BRP verhuizende personen
  • \n
  • Adreshistorie verhuizende personen
  • \n
\n
", + "source_data_link": null, + "methods_and_models": "
Zodra er een online verhuizing binnenkomt, wordt aan de verhuiszaak een zaak risicoanalyse gekoppeld. Die risicoanalysezaak wordt automatisch uitgevoerd en checkt of de aangifte afwijkende eigenschappen bevat. Zijn er
geen bijzonderheden? Dan wordt de verhuizing automatisch verwerkt. Leveren de controles van de risicoanalyse een score op die boven een drempelwaarde komt? Dan krijgt de verhuiszaak een andere status (in behandeling) waardoor deze niet wordt verwerkt zonder dat een ambtenaar de zaak behandelt. Deze beoordeelt of aanvullende vragen of onderzoek nodig zijn. Is de conclusie dat de aangifte in orde is, dan verwerkt de ambtenaar deze alsnog. De controles in de risicoanalyse zijn grotendeels gebaseerd op de controles van de Landelijke Aanpak Adreskwaliteit (LAA) én controles die de ambtenaar zal herkennen uit de dagelijkse praktijk. Denk bijvoorbeeld aan controle op veelverhuizers, het gebruiksdoel van een woning, overbewoning van een adres of een adres waar veel verhuisbewegingen op plaatsvinden.
", + "publiccode": null, + "human_intervention": "
Zie de omschrijving bij de technische werking. De controles binnen de risicoanalyse kunnen door de gemeente zelf worden bepaald (welke wel/niet). Ook is men zelf in controle over de scores (de zwaarte) die aan elke controle kan worden toegekend en de drempelwaarde die bepaald of een aangifte automatisch wordt verwerkt of niet.
", + "risks": null + } +] \ No newline at end of file diff --git a/backend/app/data/text_loader/supporting_text.json b/backend/app/data/text_loader/supporting_text.json deleted file mode 100644 index 5591fb61..00000000 --- a/backend/app/data/text_loader/supporting_text.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "nl": { - "Footer: Contact": { - "content": "

Neem contact op

Deze site is volop in ontwikkeling. Heb je vragen over het Algoritmeregister? Of ben je een (overheids)professional en wil jij of je organisatie meedoen aan de verdere ontwikkeling van het Algoritmeregister? Kijk naar de informatie op Over deze website en de Veelgestelde vragen.

Heb je toch nog een vraag? Neem dan contact op met: algoritmeregister@minbzk.nl.

", - "pageTitle": "Contact" - }, - "Footer: Over": { - "content": "

Over het Algoritmeregister

De overheid werkt steeds meer digitaal en gebruikt daarvoor steeds vaker algoritmes. Omdat digitalisering niet vanzelfsprekend goed gaat, werkt de overheid aan transparante en verantwoorde inzet van die algoritmes. Zodat de informatie over de algoritmes die de overheid gebruikt voor iedereen beschikbaar is: burgers, hun belangenbehartigers, de media en toezichthouders.

Open ontwikkeling

Het Algoritmeregister is in ontwikkeling. De informatie verandert nog vaak. Nieuwe algoritmes worden toegevoegd en algoritmes worden geactualiseerd. Ook bouwt het ministerie van Binnenlandse Zaken en Koninkrijksrelaties steeds door aan het Algoritmeregister. Dit doet het team op een open manier. Omdat het open source software is, kan iedereen meekijken op de Link naar externe pagina Github van ministerie van Binnenlandse Zaken en Koninkrijksrelaties.

Die open ontwikkeling betekent dat de inhoud door de tijd heen zal wijzigen, bijvoorbeeld:

  • Er komen algoritmes bij of gaan algoritmes af
  • De ‘standaard’ (velden met informatie) wordt gewijzigd en/of uitgebreid
  • De reeds gepubliceerde beschrijving van algoritmes wordt gewijzigd en/of uitgebreid.

Open meedoen

Een aantal overheidsorganisaties heeft op dit moment al algoritmes gepubliceerd in het algoritmeregister. Het doel is om alle overheidsorganisaties met relevante algoritmes aangesloten te hebben. Uiteindelijk zal registratie ook wettelijk verplicht worden.

Overheidsorganisaties kunnen algoritmes aanleveren voor registratie in het Algoritmeregister.

Er zijn verschillende onderdelen waar je aan mee kan doen of waar je feedback op kan geven:

  • Feedback geven op de standaard
  • Feedback op de gepubliceerde beschrijving
  • Feedback op de gebruikservaring van de website (UX)
  • Feedback op de code van deze website

Wil je meedoen? Heb je feedback op bijvoorbeeld een van deze onderwerpen? Neem dan contact op met: Link naar een e-mailadres algoritmeregister@minbzk.nl.

Je kan ook deelnemen aan de community site op het platform Link naar externe pagina Pleio. Maak gratis een account aan (dat kan Link naar externe pagina hier) en doe mee: Link naar externe pagina algoritmes.pleio.nl .

Open source software

Het Algoritmeregister wordt ontwikkeld met open source software (volg het Algoritmeregister op Link naar externe pagina Github). Deze site wordt ontwikkeld zodat deze voor zoveel mogelijk mensen bruikbaar is.

Algoritmebeleid

Het Algoritmeregister is een volgende stap in het verantwoord gebruik van algoritmes binnen de overheid. Daarnaast werkt de overheid aan het versterken van het toezicht op algoritmes. Ook wordt er gewerkt aan een implementatiekader. Daarnaast zet de overheid zicht in voor eisen aan kunstmatige intelligentie in de Europese Unie. Meer informatie over de plannen kun je vinden in de Link naar externe pagina werkagenda Waardegedreven Digitaliseren.

", - "pageTitle": "Over het Algoritmeregister" - }, - "Footer: Privacyverklaring": { - "content": "

Privacy

Deze website maakt gebruik van analytische cookies. Cookies zijn kleine tekstbestanden die websites op jouw computer opslaan. Daarmee is jouw computer te herkennen tijdens uw bezoek. Deze informatie helpt het bouwteam om de site te verbeteren. Analytische cookies geven antwoord op bijvoorbeeld de volgende vragen:

  • Is de bezoeker nieuw of heeft de bezoeker de site al eerder bezocht
  • Welke pagina's zijn tijdens het bezoek geraadpleegd
  • Van welke site is de bezoeker gekomen
  • Heeft de bezoeker de site meteen weer verlaten ('bouncing').

Deze cookies worden niet gebruikt om een profiel aan te maken of jou verder te volgen. Deze website plaatst geen cookies van derde partijen (third-party cookies).

Gegevens via e-mail

Persoonlijke informatie die via e-mail bij het Algoritmeregister bekend wordt, behandelt het team vertrouwelijk. Dergelijke persoonlijke gegevens bewaart het team alleen voor de duur van de behandeling van het bericht. Nadat je antwoord hebt gekregen of als er geen antwoord gevraagd wordt, slaat het team alleen de vraag en het antwoord op. Op verzoek verwijdert het team ook de vraag en het antwoord.

", - "pageTitle": "Privacy" - }, - "Footer: Toegankelijkheid": { - "content": "

Toegankelijkheid

Bij het ontwikkelen van deze website worden de wensen en eisen voor een toegankelijke website direct ingebouwd. Het bouwteam van het Algoritmeregister is getraind in digitale toegankelijkheid. Een onafhankelijke toegankelijkheidsexpert levert regelmatig advies.

Deze website voldoet aan WCAG 2.1 niveau AA, de Web Content Accesibility Guidelines.

Dit betekent dat de website gebruikt kan worden door iedereen, inclusief mensen met een functiebeperking.

Voor meer informatie:

", - "pageTitle": "Toegankelijkheid" - }, - "Footer: Vragen": { - "content": "

Veelgestelde vragen

1. Wat is het Algoritmeregister?

Op het Algoritmeregister staat informatie over algoritmes die de overheid gebruikt. Zo is deze informatie vindbaar en beschikbaar voor burgers, hun belangenbehartigers, de media en toezichthouders.

2. Wat is het doel van deze website?

Het doel is informatie over algoritmes voor iedereen centraal vindbaar te laten zijn. Op die manier kan iedereen zien in welke impactvolle processen algoritmes gebruikt worden. De informatie geeft de mogelijkheid om toezicht te houden op algoritmes. Zo kan gekeken worden naar discriminatie en onrechtmatigheid, maar ook de wenselijkheid. Wanneer mensen het niet eens zijn met het gebruik van algoritmes, geeft het Algoritmeregister aan waar bezwaar gemaakt kan worden.

3. Wat zijn algoritmes?

Een algoritme is een set van regels en instructies die een computer uitvoert. Algoritmes helpen bijvoorbeeld om problemen te analyseren maar ook om beslissingen te nemen. Zo kan de overheid grote hoeveelheden gegevens (data) combineren en analyseren (bron: Algemene Rekenkamer).

Wil je meer weten over algoritmes? Link naar externe pagina Bekijk de informatie op Mediawijsheid of bekijk de (gratis) Link naar externe pagina Nationale AI-cursus.

4. Ik heb een vraag over een algoritme op deze site, waar kan ik deze stellen?

Het kan natuurlijk ook dat je na het lezen van de registratie van een algoritme vragen hebt over een specifiek algoritme. Die kun je stellen aan de ‘eigenaar’ van het algoritme. De contactgegevens vind je in de beschrijving van het algoritme. Alle overige vragen kun je sturen naar: Link naar een e-mailadres algoritmeregister@minbzk.nl.

5. Staan alle algoritmes van de overheid op deze website?

Op dit moment stelt een kopgroep van overheidsorganisaties hun algoritmes beschikbaar via deze website. In 2023 publiceren nog meer overheidsorganisaties in het Algoritmeregister. Voorlopig gaat het aantal algoritmes op deze website dus nog groeien.

In de toekomst wordt het wettelijk verplicht algoritmes publiekelijk beschikbaar te maken. Daardoor komen de meeste relevante algoritmes in het Algoritmeregister. Hierop zullen gerechtvaardigde uitzonderingen komen. Denk aan opsporing, rechtshandhaving, defensie of inlichtingenverzameling. De exacte kaders worden nog uitgewerkt.

6. Bij sommige algoritmes staat meer informatie dan bij andere algoritmes?

Momenteel gebeurt het vullen van het Algoritmeregister vrijwillig door overheidsorganisaties. Niet elke organisatie heeft ervoor gekozen alle informatie te publiceren. Uiteindelijk wordt er wettelijk vastgelegd welke informatie verplicht aangeleverd moet worden, en welke informatie optioneel is.

7. Wie werken er aan het Algoritmeregister?

De ontwikkeling van het Algoritmeregister is begonnen met het consortium Publieke controle op algoritmes. Daarin werkten overheidsorganisaties aan beleidsinstrumenten voor een verantwoorde inzet van algoritmes. Een van de resultaten is onderzoek naar het Algoritmeregister. Het ministerie van Binnenlandse Zaken en Koninkrijksrelaties heeft voortgebouwd op deze opgedane kennis om tot dit Algoritmeregister te komen. Voor het ontwikkelen van de website werkt het ministerie samen met ICTU. In het Algoritmeregister is te zien welke organisaties op dit moment algoritmes aangeleverd hebben voor het Algoritmeregister. Kijk daarvoor onder het kopje Algoritmes, hier staan alle organisaties die nu één of meerdere algoritmes hebben aangeleverd.

8. Hoe verhouden de algoritmeregisters van overheidsorganisaties zich tot deze website?

Het Algoritmeregister is de centrale vindplek voor alle algoritmes van de overheid. Sommige overheidsorganisaties hebben daarnaast ook een eigen algoritmeregister. Organisaties hebben daar de mogelijkheid om meer informatie te bieden of op andere wijze. In de huidige versie is de informatie handmatig overgenomen. In 2023 wordt gewerkt aan de mogelijkheid van automatische uitwisseling.

", - "pageTitle": "Veelgestelde vragen" - } - }, - "en": { - "Footer: Contact": { - "content": "

Contact us

This site is under development. Do you have questions about the Algorithm Register? Or are you a (government) professional and do you or your organisation want to participate in the further development of the Algorithm Register? Find more information at About this website and Frequently asked questions.

If you have further questions, then please contact: algoritmeregister@minbzk.nl.

", - "pageTitle": "Contact us" - }, - "Footer: Over": { - "content": "

About the Algorithm Register

The government increasingly works digitally and uses more and more algorithms when doing so. Since digitalisation does not always work well, the government wants to work towards transparent and responsible use of these algorithms. Therefore, the government is making information about the algorithms used by the government available to everyone: citizens, their representatives, the media and supervisors.

Open development

The Algorithm Register is under development. The information often changes. New algorithms are added, and algorithms are updated. The Ministry of the Interior and Kingdom Relations will continue to build the Algorithm Register. The team working on the register is using an open development style, through open source software. Anyone can view the team’s progress on the Link naar externe pagina GitHub of the Ministry of the Interior and Kingdom Relations. This open development style means that the content will change over time, for example:

  • Algorithms are added, or algorithms are removed
  • The standard (fields of information) is changed and/or expanded
  • The published description of algorithms is changed and/or expanded.

Open participation

A number of government organisations have already published algorithms in the Algorithm Register. The aim is for all government organisations with relevant algorithms to publish their algorithms. Eventually, registration will also become a legal requirement.

Government organisations can provide algorithms for publication in the Algorithm Register.

There are several areas that you can participate by giving:

  • Feedback on the 'standard'
  • Feedback on the published description
  • Feedback on the website’s user experience (UX)
  • Feedback on the code of this website.

Would you like to participate? Do you have feedback on one of these topics? Please contact: algoritmeregister@minbzk.nl.

Open source software

The Algorithm Register is developed with open source software (follow us on Link naar externe pagina Github). This website is being developed to serve as many people as possible.

Algorithm policy

The Algorithm Register is one of the actions made on behalf of responsible use of algorithms within the government. The government also puts effort into the supervision of algorithms. Also there is an implementation framework. Also, the government is making an effort for quality requirements for artificial intelligence in the European Union. You can find more information on this in the Link naar externe pagina werkagenda Waardegedreven Digitaliseren.

", - "pageTitle": "About the Algorithm Register" - }, - "Footer: Privacyverklaring": { - "content": "

Privacy

This website uses analytical cookies only. Cookies are small text files that websites store on your computer. This makes it possible to recognize your computer during your visit. This information helps the development team to improve the site. Analytical cookies answer the following questions:

  • Is this a new visitor or has the visitor visited the site before
  • Which pages were consulted during the visit
  • Which site was the visitor directed from
  • Did the visitor immediately leave the site ('bouncing').

The cookies are not used to create a profile or to follow you further. This website does not place third-party cookies.

Data received via email

Personal information that becomes known to the Algorithm Register by email is treated confidentially by the team. Such personal data will only be kept by the team while they work on a response to your message. Once the question is answered or if no question is asked, the team will only record the question itself and the answer to that question. Upon request, the question and answer can also be deleted.

", - "pageTitle": "Privacy" - }, - "Footer: Toegankelijkheid": { - "content": "

Accessibility

During the development of this website, anything deemed beneficial and any requirements to make it accessible are immediately incorporated. The development team has been trained in digital accessibility. An independent accessibility expert regularly provides advise.

This website complies with WCAG 2.1 level AA, the Web Content Accessibility Guidelines.

This means that the website can be used by anyone including people with a disability.

For more information see:

", - "pageTitle": "Accessibility" - }, - "Footer: Vragen": { - "content": "

Frequently asked questions

1. What is the Algorithm Register?

This website provides information about the algorithms used by the government. This makes the information visible, traceable and accessible to citizens and their representatives, the media and supervisors.

2. What is the aim of this website?

The aim is to make all information about algorithms centrally accessible for everyone. That allows everyone to see in which impactful processes these algorithms are used. The information on this website provides the ability to oversee algorithms. For example, discrimination or unlawfulness can be exposed, and whether the algorithm provides desirable outcomes can be checked. When someone does not agree with the use of algorithms, the Algorithm Register indicates how objections can be made.

3. What are algorithms?

An algorithm is a set of rules and instructions executed by a computer. Algorithms help, for example, to analyse problems, but also to make decisions. This allows the government to combine and analyse large amounts of data (source: Algemene Rekenkamer).

Do you want to know more about algorithms? Find more information on Link naar externe pagina Mediawijsheid or take the (free) Link naar externe pagina National AI-course.

4. I have questions about an algorithm on this site, who do I contact?

If you have a question about a specific algorithm, please contact the ‘owner’ of the algorithm. Contact details can be found in the description of the algorithm.

For other questions please email: algoritmeregister@minbzk.nl.

5. Are all algorithms used by the government available on this website?

A leading group of government organisations is currently making their algorithms available via this website. In 2023, even more government organisations will publish their algorithms in the Algorithm Register. For the time being, the number of algorithms on this website will continue to grow.

In the future, it will become a legal requirement to make algorithms publicly available. As a result, most relevant algorithms will become available in the Algorithm Register. There will be justified exceptions to this. For example, certain algorithms used for investigation, law enforcement, defense or intelligence gathering. The exact framework is still being finalized.

6. Why do some algorithms contain more information than others?

Currently, the Algorithm Register is completed voluntarily by government organisations. Not every organisation has chosen to publish all information. Ultimately, it will be legally defined which information is mandatory and which information is optional.

7. Who develops and maintains the Algorithm Register?

The development of the Algorithm Register was started by the Public Control of Algorithms Consortium. In it, government organisations worked on policy instruments for the responsible use of algorithms. One of the outcomes of that work was research into the creation of a register of algorithms. The Ministry of the Interior and Kingdom Relations has built on knowledge gained from this research to create this Algorithm Register. The ministry is working with ICTU to develop this website. All organisations that have currently supplied one or more algorithms to the Algorithm Register can be found under the heading ‘Algorithms’.

8. How do algorithm registers of individual government organisations relate to this website?

The Algorithm Register is the central location for all government algorithms. Some government organisations also have their own algorithm register. This gives organisations the opportunity to provide more information or to provide it in a different way. In the current version of this website, information was entered manually. In 2023, the possibility of an automatic upload will be investigated.

", - "pageTitle": "Frequently asked questions" - } - } -} \ No newline at end of file diff --git a/backend/app/database/database.py b/backend/app/database/database.py index bc3e892e..d66c9849 100644 --- a/backend/app/database/database.py +++ b/backend/app/database/database.py @@ -1,6 +1,5 @@ from sqlalchemy import create_engine -from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.orm import sessionmaker +from sqlalchemy.orm import sessionmaker, declarative_base from common.database_url import get_database_url from app.config.settings import Settings diff --git a/backend/app/etl/config/excel_column_mapping.py b/backend/app/etl/config/excel_column_mapping.py deleted file mode 100644 index 6d6036d9..00000000 --- a/backend/app/etl/config/excel_column_mapping.py +++ /dev/null @@ -1,39 +0,0 @@ -excel_column_mapping = { - "Naam": "name", - "Organisatie": "organization", - "Afdeling": "department", - "Korte omschrijving": "description_short", - "Type algoritme": "type", - "Domein": "category", - "Link naar publiekspagina": "website", - "Status": "status", - "Doel": "goal", - "Impact": "impact", - "Proportionaliteit": "proportionality", - "Proces": "decision_making_process", - "Link naar projectpagina": "documentation", - "Omschrijving": "description", - "Link naar ontwikkelaar": "application_url", - "Link naar broncode": "publiccode", - "Koppelingen met basisregistraties": "mprd", - "Databronnen": "source_data", - "Methoden en modellen": "methods_and_models", - "Monitoring": "monitoring", - "Menselijke tussenkomst": "human_intervention", - "Risico's": "risks", - "Prestatienormen": "performance_standard", - "Bevoegde autoriteit": "competent_authority", - "Wettelijke grondslag": "lawful_basis", - "Impact Assessment Mensenrechten en Algoritmes (IAMA)": "iama", - "Omschrijving van de IAMA": "iama_description", - "Data Protection Impact Assessment (DPIA)": "dpia", - "Omschrijving van de DPIA": "dpia_description", - "Bezwaarprocedure": "objection_procedure", - "Schema": "standard_version", - "UUID": "uuid", - "URL van de bronregistratie": "url", - "E-mailadres van de contactpersoon": "contact_email", - "Geografisch gebied": "area", - "Taal": "lang", - "Herzieningsdatum": "revision_date", -} diff --git a/backend/app/etl/config/main.py b/backend/app/etl/config/main.py deleted file mode 100644 index 1b86e8da..00000000 --- a/backend/app/etl/config/main.py +++ /dev/null @@ -1,50 +0,0 @@ -column_grouping = { - "inzet": [ - "goal", - "impact", - "proportionality", - "decision_making_process", - "documentation", - ], - "juridisch": [ - "competent_authority", - "lawful_basis", - "iama", - "iama_description", - "dpia", - "dpia_description", - "objection_procedure", - ], - "metadata_algorithm": [ - "schema", - "url", - "contact_email", - "area", - "lang", - "revision_date", - ], - "toepassing": [ - "description", - "application_url", - "publiccode", - "mprd", - "source_data", - "methods_and_models", - ], - "toezicht": [ - "monitoring", - "human_intervention", - "risks", - "performance_standard", - ], - "algoritme": [ - "name", - "organization", - "department", - "description_short", - "type", - "category", - "website", - "status", - ], -} diff --git a/backend/app/etl/data/pub_data.json b/backend/app/etl/data/pub_data.json deleted file mode 100644 index a8b0d53d..00000000 --- a/backend/app/etl/data/pub_data.json +++ /dev/null @@ -1,6892 +0,0 @@ -[ - { - "name": "Top 400/600", - "organization": "Gemeente Amsterdam", - "department": "Actiecentrum Veiligheid en Zorg (Veiligheidshuis Amsterdam-Amstelland)", - "description_short": "Om de stad veiliger te maken co\u00f6rdineert de gemeente, samen met haar maatschappelijke partners, vanuit het Actiecentrum Veiligheid en Zorg (AcVZ) verschillende aanpakken op het snijvlak van veiligheid, zorg en het sociaal domein. De kenmerken van deze aanpakken zijn maatwerk binnen een persoonsgerichte benadering. Het AcVZ voert de programmaregie over een aantal grote integrale persoonsgerichte aanpakken, waaronder de Top400 en Top600.\n\nDe Top600 en Top400 zijn twee programma\u2019s die als doel hebben om het aantal delicten met een hoge impact, ook wel High Impact Crime of HIC genoemd (overvallen, straatroof, inbraak, zwaar geweld, moord/doodslag) en drugshandel-gerelateerde drugs- en geweldsdelicten terug te dringen. Dat gebeurt met behulp van een integrale persoonsgebonden aanpak (maatwerk) gericht op mensen die meermaals verdacht zijn van en veroordeeld zijn voor dergelijke strafbare feiten. De aanpak is erop gericht om de criminaliteit te stoppen, de kansen en de kwaliteit van leven van deze personen te verbeteren, om de negatieve invloed van deze personen op hun eventueel aanwezige minderjarige broers en zussen, en hun minderjarige kinderen te voorkomen, en om de slachtoffers en de omgeving van deze personen te beschermen tegen alles wat uit het criminele gedrag voortkomt.\n\nHet verschil tussen de Top600 en de Top400 is dat de Top400 zich richt op de groep van 12 t/m 23 jaar oud, die strafrechtelijk nog minder ver is (bv. minder veroordelingen) maar met duidelijke zorg(elijke) signalen. De Top600 richt zich op personen met een stevige criminele (HIC) achtergrond, en die niet (meer) op de Top400 lijst voorkomen.\n\nDe Top600 en Top400 zijn twee programma\u2019s van het Actiecentrum Veiligheid en Zorg (AcVZ), waar een netwerk van (overheids)partijen gezamenlijk maatschappelijke problemen op het gebied van veiligheid en zorg aanpakken. Welke problemen dit zijn, wordt gezamenlijk bepaald door de organisaties die samen het AcVZ vormen, onder regie van de Gemeente Amsterdam.", - "type": null, - "category": null, - "website": "https://algoritmeregister.amsterdam.nl/top-400-600/", - "status": null, - "goal": null, - "impact": null, - "proportionality": null, - "decision_making_process": null, - "documentation": "https://algoritmeregister.amsterdam.nl/top-400-600/", - "competent_authority": "Actiecentrum Veiligheid en Zorg (Veiligheidshuis Amsterdam-Amstelland)", - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": "secretariaatcvz@amsterdam.nl", - "area": "Amsterdam", - "lang": "Nederlands", - "revision_date": null, - "description": "Om de stad veiliger te maken co\u00f6rdineert de gemeente, samen met haar maatschappelijke partners, vanuit het Actiecentrum Veiligheid en Zorg (AcVZ) verschillende aanpakken op het snijvlak van veiligheid, zorg en het sociaal domein. De kenmerken van deze aanpakken zijn maatwerk binnen een persoonsgerichte benadering. Het AcVZ voert de programmaregie over een aantal grote integrale persoonsgerichte aanpakken, waaronder de Top400 en Top600.\n\nDe Top600 en Top400 zijn twee programma\u2019s die als doel hebben om het aantal delicten met een hoge impact, ook wel High Impact Crime of HIC genoemd (overvallen, straatroof, inbraak, zwaar geweld, moord/doodslag) en drugshandel-gerelateerde drugs- en geweldsdelicten terug te dringen. Dat gebeurt met behulp van een integrale persoonsgebonden aanpak (maatwerk) gericht op mensen die meermaals verdacht zijn van en veroordeeld zijn voor dergelijke strafbare feiten. De aanpak is erop gericht om de criminaliteit te stoppen, de kansen en de kwaliteit van leven van deze personen te verbeteren, om de negatieve invloed van deze personen op hun eventueel aanwezige minderjarige broers en zussen, en hun minderjarige kinderen te voorkomen, en om de slachtoffers en de omgeving van deze personen te beschermen tegen alles wat uit het criminele gedrag voortkomt.\n\nHet verschil tussen de Top600 en de Top400 is dat de Top400 zich richt op de groep van 12 t/m 23 jaar oud, die strafrechtelijk nog minder ver is (bv. minder veroordelingen) maar met duidelijke zorg(elijke) signalen. De Top600 richt zich op personen met een stevige criminele (HIC) achtergrond, en die niet (meer) op de Top400 lijst voorkomen.\n\nDe Top600 en Top400 zijn twee programma\u2019s van het Actiecentrum Veiligheid en Zorg (AcVZ), waar een netwerk van (overheids)partijen gezamenlijk maatschappelijke problemen op het gebied van veiligheid en zorg aanpakken. Welke problemen dit zijn, wordt gezamenlijk bepaald door de organisaties die samen het AcVZ vormen, onder regie van de Gemeente Amsterdam.", - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": "Personen kunnen alleen instromen in de Top600 en Top400 wanneer ze voldoen aan de criteria van deze aanpakken. Wat deze criteria precies zijn bepaald door de gezamenlijke partners van het Actiecentrum Veiligheid en Zorg (AcVZ) en staan beschreven in het convenant AcVZ en de daaronder vallende regelingen voor gegevensverwerking die bij deze aanpakken horen. De criteria zijn beschikbaar op de website van het AcVZ, net als de convenanten, regelingen en wie de partners zijn.\n\nOver het algemeen zijn er twee keer per jaar \u2018instroommomenten\u2019 voor beide aanpakken. Personen die voldoen aan de criteria stromen in, personen die niet meer voldoen stromen uit.\n\nTop 400 criteria\n\nVoor het bepalen van het instromen voor de Top 400 wordt gebruik gemaakt van data van:\n\nPolitie criteria:\n\nAls verdachten worden aangehouden voor een High Impact Crime (minstens \u00e9\u00e9n keer aangehouden worden binnen vijf jaar) of als verdachten worden aangehouden voor een misdrijf (minstens twee keer binnen twee jaar)\nZorg criteria:\n\nBevat minstens drie van de onderstaande criteria\nheeft op de peildatum een justiti\u00eble maatregel;\nheeft op de peildatum een civielrechtelijke maatregel;\nproces-verbaal leerplicht of thuiszitter of absoluut verzuimer of voortijdig schoolverlater of meer dan 3x schoolwisselingen in de basisschool leeftijd of meer dan 2x schoolwisselingen in het voortgezet (speciaal) onderwijs;\nbetrokken bij huiselijk geweldsincident;\nals verdachte aangehouden tussen 12 en 14 jaar;\naangehouden voor APV (Algemene Plaatselijke Verordening) overtreding dealen in nepdope;\nmaakt op de peildatum onderdeel uit van een geprioriteerde jeugdgroep.\nDe datalijsten worden aangeleverd door verschillende partijen en aan de hand van de criteria komt er een lijst van personen uit die in aanmerking komen voor de aanpak.\n\nTop 600 criteria\n\nVoor de Top 600 voor de categorie HIC spelen de volgende criteria een rol:\n\nPolitie criteria:\n\nVariant 1:\naangehouden inzake HIC (drie keer of vaker binnen vijf jaar); en\nverdachte geweest van HIC (\u00e9\u00e9n keer of vaker binnen twee jaar); en\nvoorgeleid aan Officier van Justitie of Reclassering inzake HIC (\u00e9\u00e9n keer of vaker binnen vijf jaar).\nVariant 2:\naangehouden inzake HIC (\u00e9\u00e9n keer of vaker binnen vijf jaar); en\nverdachte geweest van HIC (\u00e9\u00e9n keer of vaker binnen twee jaar); en\nvoorgeleid aan OvJ/RC inzake HIC (\u00e9\u00e9n keer of vaker binnen vijf jaar); en\nverdachte geweest bij een incident (33 keer of vaker binnen vijf jaar).\nOM-criteria:\n\nVeelplegers: (\u226521 jr) veroordeling met strafoplegging waarvan \u22651x HIC (drie keer of vaker binnen vijf jaar);\nFirst offender jeugd: (<21 jr) veroordeling met strafoplegging voor HIC (1 keer of vaker binnen 5 jaar).\n\nBij de drugs- en geweldsdelicten worden de volgende criteria gebruikt:\n\nPolitie criteria:\n\nLeeftijd < 30 jaar;\nAangehouden inzake handel in harddrugs (1 keer of vaker binnen 5 jaar);\nAangehouden inzake een geweldsdelict, bedreiging of wapenbezit (1 keer of vaker binnen 5 jaar).\nOM criteria:\n\nVeroordeling met strafoplegging voor een misdrijf (2 keer of vaker binnen 5 jaar), waarvan:\nStrafoplegging voor art. 2 Opiumwet (1 keer of vaker binnen 3 jaar), of:\nGevangenisstraf voor art. in Wet Wapens en Munitie (1 keer of vaker binnen 3 jaar), of:\nGevangenisstraf voor zwaar geweldsdelict (1 keer of vaker binnen 3 jaar).\n\nEenmaal opgenomen in de Top600, stroomt een persoon weer uit indien hij of zij niet meer aan de criteria voldoet. Een persoon kan niet uitstromen wanneer hij of zij de afgelopen twee jaar meer dan 180 dagen in detentie is geweest. Eenmaal opgenomen in de Top400 blijft een persoon minimaal twee jaar in de aanpak. Daarna stroomt een persoon uit mits deze in het voorafgaande jaar niet vaker dan \u00e9\u00e9n keer is aangehouden. Een persoon kan niet uitstromen wanneer hij of zij de afgelopen twee jaar meer dan 100 dagen in detentie is geweest.\n\nVoor het bepalen van welke personen aan de criteria van deze aanpakken voldoen, wordt gebruik gemaakt van data van:\n\nGemeenten (Amsterdam, Amstelveen, Aalsmeer, Diemen, Ouder-Amstel, Uithoorn)\n\nInformatie over leerplicht;\nInformatie over jeugdgroepen;\nWoonplaats (feitelijk verblijf);\nLeeftijd.\nPolitie\n\nAanhoudingen, APV-overtredingen en verdachten in onderzoek(en)\nOpenbaar Ministerie\n\nVeroordelingen\nReclassering\n\nLopende justiti\u00eble maatregelen\nJeugdzorg (JBRA en William Schrikker Stichting)\n\nLopende justiti\u00eble en civiele maatregelen\n\nAan de in dit register beschreven criteria kunnen geen rechten worden ontleend. Voor de exacte criteria en juridische grondslagen op basis waarvan personen in een van de AcVZ-aanpakken worden opgenomen verwijzen wij u naar het Algemeen Convenant AcVZ en de daaronder vallende regelingen gegevensverwerking (waaronder regelingen voor de Top600 en Top400), zoals gepubliceerd op de website van het AcVZ.", - "methods_and_models": "Elke binnenkomende dataset is door de aanleverende partij reeds gefilterd op het betreffende onderdeel van de criteria. Zo levert de politie alleen de namen aan van personen die op dat moment aan het politie-deel van de criteria (aantal aanhoudingen, van een bepaald type, in de afgelopen 2 of 5 jaar) voldoen. Alle binnenkomende data wordt vervolgens gecontroleerd door analisten op juistheid, om zeker te zijn dat de personen in de ene dataset dezelfde zijn als in de andere dataset(s). Daarna worden de datasets naast elkaar gelegd, zodat zichtbaar wordt welke personen aan elk onderdeel van de criteria voldoen. Als dit met alle relevante onderdelen van de criteria is gedaan, blijven de personen over die op dat moment aan de criteria voldoen.\n\nDe selectie van personen in de Top400 en Top600 bestaat dus alleen uit het optellen van een bepaald criterium (bv aanhoudingen, of leerplicht processen verbaal) in een bepaalde periode (meestal 2 of 5 jaar), en het vervolgens naast elkaar leggen van die uitkomsten om te zien welke personen er aan elk onderdeel van de criteria voldoen.", - "monitoring": null, - "human_intervention": "De samenstelling van de lijsten wordt gedaan door een team van analisten op het AcVZ. Zij voeren diverse controles uit om de integriteit van de data (klopt de data?) te waarborgen. Na selectie wordt per persoon handmatig een dossier opgesteld waarin nogmaals duidelijk vastgelegd wordt op basis van welke informatie de selectie heeft plaatsgevonden. Na plaatsing op de lijst krijgt een, speciaal daartoe opgeleide regisseur de persoon (en dossier) in regie, waarin nogmaals duidelijk wordt waarom de betreffende persoon op de lijst staat. Bij elk van deze stappen bestaat uitdrukkelijk de mogelijkheid om de selectie ongedaan te maken indien de analist, de dossieropsteller, of de regisseur daar aanleiding voor ziet.", - "risks": "De methodiek om personen te selecteren voor de aanpak Top600 of Top400 heeft een laag risico. Deze bestaan met name uit het onterecht in de aanpak opgenomen worden, en onterecht niet in de aanpak opgenomen worden.", - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:11.986578+00:00", - "lars": "75856898", - "owner": "gemeente-amsterdam" - }, - { - "name": "Vroeg eropaf", - "organization": "Gemeente Amsterdam", - "department": "Directie Inkomen", - "description_short": "In Amsterdam strijden we tegen armoede. Mensen die in armoede dreigen te raken proberen we zo vroeg mogelijk te helpen, om te voorkomen dat ze ernstige schulden krijgen of uit hun woning gezet worden. Als problemen nog klein zijn, kan een advies of een lichte interventie al voldoende zijn. Om dat te kunnen doen, moeten we weten wie er in de schulden dreigt te raken. Daarom krijgen we een melding van onder andere zorgverzekeraars, woningcorporaties, energieleveranciers en Waternet, als zij een klant hebben die een betalingsachterstand bij hen heeft. Dit heet ook wel de \u2018Amsterdamse aanpak vroegsignalering\u2019. Dat de schuldeiser deze gegevens mag doorgeven aan de gemeente, ook persoonsgegevens, staat in de Wet gemeentelijke schuldhulpverlening. Na de melding vult de gemeente de gegevens aan met informatie die bij ons bekend is over de gemelde persoon. Dat is informatie die nodig is om te bepalen of iemand wel of geen uitkeringsgerechtigden is, klant van WPI (de afdeling Werk, Participatie en Inkomen van de gemeente Amsterdam) en om te bepalen naar welke hulpverlener de melding het best doorgestuurd kan worden. Het aanvullen van de melding met de informatie die bij de gemeente bekend is, gebeurt automatisch, na een druk op een knop. Er is altijd iemand nodig om een controle op data te activeren.\n\nHet systeem stuurt de melding door naar een hulpverlener van de gemeente. Hij of zij probeert binnen 14 dagen contact te krijgen met de burger en maakt binnen 28 dagen een eerste analyse. Soms speelt er meer dan een betalingsachterstand. Als de burger hulp aanneemt, maken we gedetailleerde afspraken met hem of haar. De hulpverlener meldt bij het centrale meldpunt welke afspraken zijn gemaakt, zodat een schuldeiser weet wat de volgende stappen zijn voor de betalingsachterstand.", - "type": null, - "category": null, - "website": "https://algoritmeregister.amsterdam.nl/vroeg-eropaf/", - "status": null, - "goal": null, - "impact": null, - "proportionality": null, - "decision_making_process": null, - "documentation": "https://algoritmeregister.amsterdam.nl/vroeg-eropaf", - "competent_authority": "Team Armoedebestrijding", - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": "CIO-office@amsterdam.nl", - "area": "Amsterdam", - "lang": "Nederlands", - "revision_date": null, - "description": "In Amsterdam strijden we tegen armoede. Mensen die in armoede dreigen te raken proberen we zo vroeg mogelijk te helpen, om te voorkomen dat ze ernstige schulden krijgen of uit hun woning gezet worden. Als problemen nog klein zijn, kan een advies of een lichte interventie al voldoende zijn. Om dat te kunnen doen, moeten we weten wie er in de schulden dreigt te raken. Daarom krijgen we een melding van onder andere zorgverzekeraars, woningcorporaties, energieleveranciers en Waternet, als zij een klant hebben die een betalingsachterstand bij hen heeft. Dit heet ook wel de \u2018Amsterdamse aanpak vroegsignalering\u2019. Dat de schuldeiser deze gegevens mag doorgeven aan de gemeente, ook persoonsgegevens, staat in de Wet gemeentelijke schuldhulpverlening. Na de melding vult de gemeente de gegevens aan met informatie die bij ons bekend is over de gemelde persoon. Dat is informatie die nodig is om te bepalen of iemand wel of geen uitkeringsgerechtigden is, klant van WPI (de afdeling Werk, Participatie en Inkomen van de gemeente Amsterdam) en om te bepalen naar welke hulpverlener de melding het best doorgestuurd kan worden. Het aanvullen van de melding met de informatie die bij de gemeente bekend is, gebeurt automatisch, na een druk op een knop. Er is altijd iemand nodig om een controle op data te activeren.\n\nHet systeem stuurt de melding door naar een hulpverlener van de gemeente. Hij of zij probeert binnen 14 dagen contact te krijgen met de burger en maakt binnen 28 dagen een eerste analyse. Soms speelt er meer dan een betalingsachterstand. Als de burger hulp aanneemt, maken we gedetailleerde afspraken met hem of haar. De hulpverlener meldt bij het centrale meldpunt welke afspraken zijn gemaakt, zodat een schuldeiser weet wat de volgende stappen zijn voor de betalingsachterstand.", - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": "Melding schuldeiser\n\nSchuldeisers doen hun melding van een betalingsachterstand in een speciaal daarvoor ontwikkeld registratie- en informatiesysteem genaamd \u2018RIS Matching\u2019. De gegevens van deze dataset zijn allemaal gegevens die nodig zijn om de juiste burger aan te spreken, de juiste hulpverlener te vinden en om een advies te geven bij welke hulp de burger het meeste baat zou hebben. Alleen zorgverzekeraars hebben een wettelijke grondslag (Staatscourant 2015) voor het leveren van het BSN, de overige schuldeisers leveren geen BSN.\n\nDe schuldeiser kan bij de melding de volgende gegevens aanleveren:\n\nKlantnummer\nVroeg of crisis\nSchuldbedrag\nTermijnbedrag\nGeslacht\nVoorletters\nVoorvoegsel\nAchternaam\nStraat\nHuisnummer\nHuisletter\nHuisnummer of toevoegsel\nPostcode\nPlaats\nBSN (in geval van zorgverzekering)\nGeboortedatum\nExtra informatie (Bijvoorbeeld bij welk \u2018label\u2019 iemand verzekerd is. De hoofdmelder is Achmea, maar iemand kan bijvoorbeeld verzekerd zijn bij Zilveren Kruis, Avero, FBTO. Ook staan hier contactgegevens zoals telefoonnummer of mailadres als dit bekend is).\nDatawarehouse afdeling Armoedebestrijding\n\nEen medewerker van de gemeente koppelt de melding van de schuldeiser aan het datawarehouse van de afdeling Armoedebestrijding. Via het datawarehouse kan uit verschillende databases informatie opgevraagd worden, zodat we kunnen bepalen welke hulpverlener met de melding aan de slag kan gaan. In de lijst hieronder staat om welke informatie het precies gaat. De volgende informatie wordt, voor zover bekend en als het een klant van WPI betreft, vanuit het datawarehouse aan de melding gekoppeld. De informatie is niet alleen nodig om de juiste hulpverlener te koppelen aan de melding, maar ook voor de hulpverlener om samen met de juiste klantmanager het gesprek aan te gaan met de klant:\n\nHuisnummer\nHuisletter\nHuisnummer toevoeging\nPlaats\nStadsdeel\nGebied\nBuurt\nA- nummer\nGeboortedatum\nLeeftijd\nUitkering\nAdministratienummer\nCodering\nKlantmanager\nTeam klant manager\nExtra informatie\nKinderen aanwezig\nMeldingsnummer\nBepalen welke afdeling met de melding aan de slag gaat\n\nDe melding van de schuldeiser en de gegevens over de burger uit het datawarehouse van WPI worden vervolgens gekoppeld. Voor elke afdeling is er een unieke code van toepassing. Bijvoorbeeld: de combinatie van het adres Jan van Galenstraat 323 en een leeftijd jonger dan 27 levert de code 5 op, \u2018Dak- en thuisloze Jongeren\u2019. De koppeling zorgt ervoor dat de melding bij de juiste hulpverlener terechtkomt. De code heeft geen andere functie dan te bepalen of men een klant is of niet en bij welke schuldhulpverlener het hoort.\n\nHet systeem kan uit de volgende codes kiezen:\n\nActivering\nNiet-bijstandsgerechtigde\nOnduidelijk\nTraject Briefadressen\nDak- en thuisloze Jongeren\nFIBU (budgetbeheer)\nOndersteuning ondernemers\nWerk en Veiligheid\nKlanten zonder verblijfplaats\nTeam Entree\nWerk\nJongerenpunten\nKoers naar Werk\nGekoppelde gegevens\n\nDe resultaten van de koppeling van dataset 1, 2 en 3 worden opgeslagen in een aparte dataset. In deze dataset staan dus per melding de gegevens die door de schuldeiser zijn gemeld, de gegevens die vanuit de datawarehouse van de afdeling Armoedebestrijding zijn toegevoegd en de code van een afdeling.\n\nTerugkoppeling schuldeiser\n\nDe hulpverlener registreert in het registratie- en informatiesysteem (RIS Vroeg Eropaf) of contact is gelegd met de burger en of er afspraken zijn gemaakt. De schuldeiser kan in het systeem zien wat er met zijn melding is gebeurd. Bijvoorbeeld dat de melding in behandeling is genomen. De schuldeiser kan dan eventueel de automatische incasso stilleggen. Het kan natuurlijk zo zijn dat de burger hulp van de gemeente weigert. Ook dat registreren we in het systeem. De schuldeiser kan dan zelf bepalen om het incassotraject weer te starten.\n\nIn het systeem wordt \u00e9\u00e9n van de volgende opties geregistreerd:\n\nJa, contact met plan van aanpak\nJa, contact niet conform vereisten plan van aanpak\nJa, contact maar weigert hulp\nJa, contact betalingsregeling met melder\nLopend dossier\nGeen contact\nNiet opgepakt door verhuizing, overlijden, detentie, al een betalingsregeling, dubbele melding et cetera.\nNiet opgepakt door gebruik aan capaciteit\nJa, klant bereikt, niet declarabel (alleen contact)\nJa, maar stelt geen prijs op verdere hulpverlening\nNee, klant niet bereikt\nGeen actie ondernomen", - "methods_and_models": "Architectuur van het model\n\nDe schuldeiser doet een melding in het registratie- en informatiesysteem \u2018RIS Matching\u2019. Eens in de twee weken worden alle nieuwe meldingen door een medewerker van de gemeente gekoppeld (door een druk op de knop) aan gegevens over de gemelde persoon uit de datawarehouse van de afdeling Armoedebestrijding en aan gegevens over de verschillende schuldhulpverleningsprogramma\u2019s die beschikbaar zijn. Door die koppeling kan de gemeente bepalen of ze te maken heeft met de juiste burger en welke hulpverlener het best contact op kan nemen met de burger. Vervolgens wordt gecontroleerd of er sprake is van meerdere schuldachterstanden binnen \u00e9\u00e9n huishouden. Tot hier is er sprake van een geautomatiseerd proces. Vervolgens zijn er een paar mogelijkheden:\n\nBij een enkele betalingsachterstand van minder dan 250 euro wordt vanuit RIS Matching automatisch een sms, brief of mail gestuurd (afhankelijk van welke contactgegevens beschikbaar zijn). In dit geautomatiseerde bericht verwijzen we naar de website\nwww.amsterdam.nl/geldproblemen\n. Hier kunnen burgers de schuldhulpverlening in hun stadsdeel vinden. Daar kunnen ze dan zelf contact mee opnemen.\nIs de schuld hoger dan 250 euro dan wordt de melding op basis van informatie over het postcodegebied automatisch doorgestuurd naar een hulpverlener in het juiste stadsdeel of bij een WPI-afdeling. De hulpverlener probeert binnen 14 dagen contact te krijgen met de burger. De hulpverlener maakt binnen 28 dagen een eerste analyse. Vaak speelt er meer dan een betalingsachterstand. Als de burger hulp accepteert, worden er gedetailleerde afspraken met hem of haar gemaakt.\nAls uit de gegevens niet duidelijk wordt of de persoon met schulden bekend is bij de afdeling Armoedebestrijding, dan wordt dit geval in het systeem aangeduid als \u2018onduidelijk\u2019 en doorgezet naar het team Vroeg eropaf. In het uitzonderlijke geval dat een melding niet bij een hulpverlener in het juiste stadsdeel terecht komt, meldt de hulpverlener dit aan de systeembeheerder van RIS Matching. Deze verplaatst de melding dan naar de juiste hulpverlener.", - "monitoring": null, - "human_intervention": "Het systeem maakt een aantal keuzes zelfstandig (geautomatiseerd), bijvoorbeeld om een sms, email of brief te versturen bij een betalingsachterstand lager dan 250 euro, of naar welk postcodegebied de melding doorgestuurd moet worden. Tijdens het proces van gegevens koppelen is er \u00e9\u00e9n moment van menselijk toezicht: het koppelen van de melding van de schuldeisers met de gegevens van de afdeling Armoedebestrijding gebeurt geautomatiseerd, maar voor het starten van de koppeling is wel een menselijke handeling nodig. Vanaf het moment dat de melding doorgestuurd is naar de hulpverleners in het juiste stadsdeel is het proces niet meer geautomatiseerd. De maatschappelijk dienstverlener gaat langs bij de gemelde burger als de burger zelf geen contact opneemt.", - "risks": "Het registratie- en informatiesysteem genaamd \u2018RIS Matching\u2019 wordt geleverd door het bedrijf Inforing, een bedrijf dat dit systeem aan 200 gemeenten levert. Zij voeren regelmatig zogenaamde \u2018pen- en hacktesten\u2019 uit, om te controleren of het systeem niet gehackt kan worden door derden. Ook zorgen zij ervoor dat persoonsgegevens veilig beheerd zijn en niet worden verkocht aan derden. Ook de beveiliging ligt bij Inforing. De beveiliging voldoet aan de BIO-standaard.\n\nBurgers kunnen op elk moment aangeven dat zij niet in het systeem willen worden vermeld. De gegevens worden dan onmiddellijk verwijderd. Daarnaast kunnen burgers altijd inzage krijgen in het systeem. Het gaat hierbij om dataset 4, \u2018gekoppelde gegevens\u2019 (zie: Data). Voor de data in het datawarehouse van de afdeling Armoedebestrijding gelden andere regels, namelijk het Stedelijk Kader Verwerking van Persoonsgegevens en de Algemene Verordening Gegevensbescherming. De datawarehouse en de meldingen van schuldachterstanden zijn twee gescheiden systemen en de meldingen van schuldachterstanden komen niet in het datawarehouse terecht. Op het moment dat de gemeente de gegevens uit het RIS Matching systeem moet verwijderen, blijft er geen informatie over de schuldachterstanden achter bij de gemeente.\n\nDe gemeente Amsterdam, afdeling Armoedebestrijding is verantwoordelijk voor de verwerking van de gegevens die nodig zijn om het proces te doorlopen.", - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:11.997499+00:00", - "lars": "66453169", - "owner": "gemeente-amsterdam" - }, - { - "name": "Handhaving illegale vakantieverhuur", - "organization": "Gemeente Amsterdam", - "department": "Directie Wonen, Toezicht en Handhaving", - "description_short": "In Amsterdam is er beperkt woon- en verblijfsruimte, zowel voor Amsterdammers als voor bezoekers. Het verhuren van een woning of woonboot aan toeristen moet aan bepaalde voorwaarden voldoen. Het mag bijvoorbeeld maximaal 30 nachten per jaar en aan 4 personen per keer. Het moet gemeld worden bij de gemeente.\n\nNiet iedereen houdt zich aan die voorwaarden. De gemeente krijgt soms meldingen van buren die vermoeden dat een woning onterecht verhuurd is. Medewerkers van Toezicht & Handhaving doen daar onderzoek naar.\n\nHet algoritme helpt de meldingen te prioriteren zodat de beperkte handhavingscapaciteit effici\u00ebnt en effectief ingezet kan worden. Door gegevens te analyseren, schat het algoritme het risico in dat de woning op het gemelde adres illegaal wordt verhuurd. Het algoritme gebruikt daarvoor data uit onrechtmatige vakantieverhuur van de afgelopen 5 jaar. Het gaat om meldingen, gegevens die de gemeente tijdens het werkproces heeft verzameld, persoonsgegevens (Basisregistratie Personen) en gegevens over gebouwen (Basisregistratie Adressen en Gebouwen).", - "type": null, - "category": null, - "website": "https://algoritmeregister.amsterdam.nl/handhaving-illegale-vakantieverhuur/", - "status": null, - "goal": null, - "impact": null, - "proportionality": null, - "decision_making_process": null, - "documentation": "https://algoritmeregister.amsterdam.nl/handhaving-illegale-vakantieverhuur", - "competent_authority": "Team Vakantieverhuur/onderhuur", - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": "CIO-office@amsterdam.nl", - "area": "Amsterdam", - "lang": "Nederlands", - "revision_date": null, - "description": "In Amsterdam is er beperkt woon- en verblijfsruimte, zowel voor Amsterdammers als voor bezoekers. Het verhuren van een woning of woonboot aan toeristen moet aan bepaalde voorwaarden voldoen. Het mag bijvoorbeeld maximaal 30 nachten per jaar en aan 4 personen per keer. Het moet gemeld worden bij de gemeente.\n\nNiet iedereen houdt zich aan die voorwaarden. De gemeente krijgt soms meldingen van buren die vermoeden dat een woning onterecht verhuurd is. Medewerkers van Toezicht & Handhaving doen daar onderzoek naar.\n\nHet algoritme helpt de meldingen te prioriteren zodat de beperkte handhavingscapaciteit effici\u00ebnt en effectief ingezet kan worden. Door gegevens te analyseren, schat het algoritme het risico in dat de woning op het gemelde adres illegaal wordt verhuurd. Het algoritme gebruikt daarvoor data uit onrechtmatige vakantieverhuur van de afgelopen 5 jaar. Het gaat om meldingen, gegevens die de gemeente tijdens het werkproces heeft verzameld, persoonsgegevens (Basisregistratie Personen) en gegevens over gebouwen (Basisregistratie Adressen en Gebouwen).", - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": "Identiteits- en huisvestingsgegevens (BRP)\n\nEen beperkte set gegevens uit de Basisregistratie Personen (BRP) over de identiteit en huisvestingssituatie van de bewoners, namelijk:\n\nnaam van de geregistreerde bewoners;\ngeboortedatum;\nvertrekdatum Amsterdam;\nvertrekdatum adres;\nvestigingsdatum adres;\noverlijdensdatum.\nGegevens over gebouwen (BAG)\n\nEen beperkte set gegevens uit de Basisregistratie Adressen en Gebouwen (BAG) over het gebouw, namelijk:\n\nadres, straatcode, postcode;\nid-adres;\nomschrijving pand;\nAmsterdamse BAG-code, landelijke BAG-code;\ntype woning (huur, sociale huur / vrije sector, koop);\nadresseerbaar BAG-ID\naantal kamers;\nvloeroppervlak;\nbouwlaag van voordeur appartement;\naantal bouwlagen;\nomschrijving verdieping woonobject.\nGegevens uit illegale vakantieverhuurzaak\n\nGegevens uit de melding en eventuele gerelateerde illegale vakantieverhuurzaak, namelijk:\n\nzaak id;\ndatum van start van onderzoek / melding;\nstadium van behandeling van de melding;\nstadia nummer, omschrijving en id;\n(meld)code;\ncode overtreding;\ncode (behandelend) medewerker;\nwel / geen anonieme melder;\ndatum melding;\nsituatieschets;\nbevindingen onderzoek;\ngebruiker die melding heeft gecre\u00eberd (met datum), of aangepast (met datum aanpassing);\nbehandelcode (type zaak, indeling in team);\nresultaat;\ndatum wanneer zaak is afgesloten;\nreden waarom zaak is afgesloten.", - "methods_and_models": "Architectuur van het model\n\nGemeente Amsterdam heeft een algoritme ontwikkeld dat verbanden en patronen kan vinden in grote hoeveelheid informatie over illegale vakantieverhuur. Het algoritme berekent welke informatie vaker in verband kan worden gebracht met illegale vakantieverhuur en welke informatie niet. Het algoritme doet dit door wiskundige berekeningen uit te voeren volgens het kansboom-principe. Dat wil zeggen dat het algoritme op basis van een groot aantal kansberekeningen een gemiddelde neemt. Dit gemiddelde wordt gebruikt om de wiskundige verwachting te genereren van illegale vakantieverhuur op een adres. Het algoritme berekent deze verwachting pas als we een nieuwe melding (bijvoorbeeld van een omwonende of verhuurplatform) ontvangen van mogelijke illegale vakantieverhuur.\n\nDit algoritme wordt een \u2018random forest regressie algoritme\u2019 genoemd. Om de door het algoritme gemaakte afwegingen inzichtelijk te maken voor mensen passen we de \u201cSHAP\u201d-methodiek toe (SHapley Additive exPlanations; https://github.com/slundberg/shap). SHAP berekent voor iedere individuele zaak welke indicatoren hebben bijgedragen aan die voorspelling en of dit ervoor zorgde dat de voorspelling hoger of lager werd. Zo kan een medewerker altijd zien waar het algoritme de risico-inschatting op heeft gebaseerd en een afgewogen besluit nemen. Prestatie\n\nHet voordeel van een \u2018random forest regressie\u2019 is dat het een redelijk complex algoritme is dat de werkelijkheid goed kan benaderen. Maar er is wel een kans op overfitting. Een \u2018tree\u2019 met veel lagen perst de data uit om specifieke antwoorden te leveren. Er is onderzocht hoeveel lagen het model nodig heeft om generiek inzetbaar te blijven en dus niet te overfitten. Daarnaast worden continu datapunten gecategoriseerd (gegroepeerd), zodat het model een overzichtelijk aantal mogelijkheden heeft in plaats van een oneindig aantal met continue waarden. Hierdoor is het model beter in staat is om tot een conclusie te komen.", - "monitoring": null, - "human_intervention": "Er is geen sprake van geautomatiseerde besluitvorming. Als we een adres onderzoeken op het vermoeden van illegale vakantieverhuur komt dit voort uit een melding van bijvoorbeeld een omwonende of een verhuurplatform. Het algoritme helpt de medewerkers van Toezicht & Handhaving te bepalen bij welke meldingen de kans op illegale verhuur het grootst is, zodat die meldingen het eerst onderzocht kunnen worden. De medewerker krijgt een overzicht te zien, die toont op grond van welke criteria het algoritme het risico op illegale vakantieverhuur hoog of laag inschat. Op die manier maken we inzichtelijk waarop het algoritme de risico-inschatting heeft gebaseerd.\n\nOf er daadwerkelijk sprake is van illegale vakantieverhuur wordt vastgesteld door de verantwoordelijk toezichthouder en de projecthandhaver. Daarvoor wordt een voor- en buitendienstonderzoek uitgevoerd. Vervolgens wordt het dossier intensief besproken in een debriefing met de medewerkers die tot besluitvorming kunnen overgaan. Het algoritme heeft een wezenlijke invloed op de volgorde waarin we meldingen afhandelen, maar neemt niet zelfstandig de beslissingen of er al dan niet sprake is van illegale vakantieverhuur.\n\nOm te voorkomen dat medewerkers teveel vertrouwen in het algoritme hebben, is er iemand aangesteld om het algoritme en de werking daarvan te monitoren. Daarnaast is een werkinstructie opgesteld voor de medewerkers die met dit instrument gaan werken. Daarbij volgen de medewerkers workshop over de kansen en risico\u2019s van het gebruik van algoritmen.", - "risks": "Het systeem heeft uiteraard gevolgen voor de mogelijke overtreder. Een melding kan namelijk meer of minder prioriteit krijgen dan zonder het algoritme. We hebben verschillende maatregelen getroffen om ervoor te zorgen dat alle risico-inschattingen van het algoritme niet op toeval berusten. Een belangrijk maatregel is dat we dit algoritme in een pilotfase uitvoerig en voortdurend evalueren op bv. betrouwbaarheid, voordat het wordt ge\u00efmplementeerd in de bedrijfsvoering.", - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.002906+00:00", - "lars": "99175375", - "owner": "gemeente-amsterdam" - }, - { - "name": "Meldingen openbare ruimte", - "organization": "Gemeente Amsterdam", - "department": "Onderzoek, Informatie & Statistiek (OIS)", - "description_short": "Als er op straat of in een park iets gemaakt of opgeruimd moet worden, dan kan dat bij de gemeente worden gemeld via SIA, het online meldingensysteem. Ook een gevaarlijke verkeerssituatie of overlast van personen en horeca kan gemeld worden.\n\nVoorheen moesten mensen zelf kiezen bij welke categorie hun melding het beste paste (bijvoorbeeld \u2018overlast\u2019 of \u2018straatmeubilair\u2019), zodat de melding bij de juiste afdeling van de gemeente terecht kwam. Maar de gemeente is een complexe organisatie en de lijst met categorie\u00ebn is lang. Daardoor koos men niet altijd de juiste categorie. Dat zorgde soms voor vertraging in de afhandeling van meldingen.\n\nDaarom gebruiken we nu een algoritme dat woorden herkent, bijvoorbeeld \u2018afval\u2019 en \u2018stoep\u2019. Op basis daarvan wordt bepaald bij welke categorie de melding het best past en welke afdeling de melding moet afhandelen.\n\nDe melder hoeft dus geen categorie meer te kiezen, en de melding wordt sneller afgehandeld omdat hij bij de juiste afdeling terecht komt.", - "type": null, - "category": null, - "website": "https://algoritmeregister.amsterdam.nl/meldingen-openbare-ruimte/", - "status": null, - "goal": null, - "impact": null, - "proportionality": null, - "decision_making_process": null, - "documentation": "https://algoritmeregister.amsterdam.nl/meldingen-openbare-ruimte", - "competent_authority": "Adviseur Onderzoek en ontwikkeling", - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": "CIO-office@amsterdam.nl", - "area": "Amsterdam", - "lang": "Nederlands", - "revision_date": null, - "description": "Als er op straat of in een park iets gemaakt of opgeruimd moet worden, dan kan dat bij de gemeente worden gemeld via SIA, het online meldingensysteem. Ook een gevaarlijke verkeerssituatie of overlast van personen en horeca kan gemeld worden.\n\nVoorheen moesten mensen zelf kiezen bij welke categorie hun melding het beste paste (bijvoorbeeld \u2018overlast\u2019 of \u2018straatmeubilair\u2019), zodat de melding bij de juiste afdeling van de gemeente terecht kwam. Maar de gemeente is een complexe organisatie en de lijst met categorie\u00ebn is lang. Daardoor koos men niet altijd de juiste categorie. Dat zorgde soms voor vertraging in de afhandeling van meldingen.\n\nDaarom gebruiken we nu een algoritme dat woorden herkent, bijvoorbeeld \u2018afval\u2019 en \u2018stoep\u2019. Op basis daarvan wordt bepaald bij welke categorie de melding het best past en welke afdeling de melding moet afhandelen.\n\nDe melder hoeft dus geen categorie meer te kiezen, en de melding wordt sneller afgehandeld omdat hij bij de juiste afdeling terecht komt.", - "application_url": "https://github.com/maartensukel/example-textual-classification-citizen-reports, https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html", - "publiccode": null, - "mprd": null, - "source_data": "Meldingen\n\nDe dataset bestaat uit meldingen die eerder gedaan zijn (vrij tekstveld). In eerste instantie hebben we 300.000 meldingen uit de afgelopen jaren gebruikt om het algoritme te trainen. Regelmatig wordt het bijgetraind met nieuwe meldingen en uitgevoerde correcties op bestaande meldingen. Als het Actie Service Centrum of afdelingen een verkeerde categorisering zien, (zie Menselijk toezicht) corrigeren zij dit handmatig in het meldingensysteem. Deze correcties worden gebruikt bij het bijtrainen. We onderzoeken of het bijtrainen van het algoritme in de toekomst geautomatiseerd kan.\n\nDeze dataset kunnen we in dit register niet openbaar maken. Omdat de data uit een vrij tekstveld komen, kunnen daar persoonsgevegevens in staan, hoewel daar expliciet niet om wordt gevraagd.\n\nEmailadres en telefoonnummer voor vervolgvragen\n\nIemand die een melding doet, kan zijn of haar telefoonnummer en/of emailadres achterlaten als hij of zij dat wil. We houden de melder dan op de hoogte van de voortgang en we hebben de mogelijkheid om hem of haar terug te bellen. Deze informatie wordt niet langer bewaard dan voor dit doel nodig is en wordt dus niet door het algoritme gebruikt.\n\nVoor overige informatie over verwerking van persoonsgegevens, zie: https://www.amsterdam.nl/privacy/specifieke/privacyverklaringen-wonen/meldingen-overlast-privacy", - "methods_and_models": "Architectuur van het model\n\nDe tekst van de melding wordt opgedeeld in losse woorden. Van elk woord uit een melding wordt geanalyseerd hoe uniek het is voor die melding, afgezet tegen de de totale collectie woorden (\u2018TF-IDF\u2019 of \u2018term frequency-inverse document frequency\u2019). Een woord als \u2018de\u2019 of \u2018bedankt\u2019 krijgt daardoor een laag gewicht en een woord als \u2018vuilnis\u2019 krijgt een hoger gewicht.\n\nVan die combinatie van woorden wordt vervolgens met logistische regressie (een machine-learning-techniek) bepaald bij welke categorie de melding hoort en daarmee bij welke afdeling binnen de gemeente de melding het meest waarschijnlijk past.", - "monitoring": null, - "human_intervention": "Alle meldingen die met minder dan 40% zekerheid bij een bepaalde categorie ingedeeld worden, worden doorgestuurd naar het Actie Service Centrum. Vervolgens vindt een menselijke beoordeling plaats en wordt de melding alsnog gecategoriseerd. Ook de meldingen die onterecht doorgestuurd worden naar een verkeerde categorie, worden door de verantwoordelijke afdeling (soms via het Actie Service Centrum) handmatig in de juiste categorie geplaatst.", - "risks": "Er zitten weinig risico\u2019s aan dit algoritme. Het plaatst een melding in de juiste categorie en zorgt dat het sneller bij de juiste afdeling onder de aandacht is. Als het algoritme een melding niet met voldoende zekerheid in een categorie kan plaatsen, komt hij in de categorie \u2018Overig\u2019 terecht. Medewerkers van het Actie Service Centrum bekijken die meldingen en zetten ze handmatig in de juiste categorie. Als het algoritme niet naar behoren werkt, duurt het dus iets langer voordat de melding bij de juiste afdeling is. De melder kan persoonsgegevens toevoegen als hij of zij op de hoogte gehouden wil worden. Deze gegevens worden beveiligd opgeslagen en niet door het algoritme gebruikt.", - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.008382+00:00", - "lars": "21579514", - "owner": "gemeente-amsterdam" - }, - { - "name": "Parkeercontrole", - "organization": "Gemeente Amsterdam", - "department": "Parkeren, Team Analyse & Advies", - "description_short": "\"Om Amsterdam leefbaar en toegankelijk te houden, mag er maar een beperkt aantal auto\u2019s in de stad parkeren. De gemeente controleert of een geparkeerde auto het recht heeft om geparkeerd te staan, dus of iemand parkeergeld heeft betaald of een parkeervergunning heeft. Om effici\u00ebnter te werken doen we die controle met scanauto\u2019s. Daarmee controleren we momenteel meer dan 150.000 offici\u00eble parkeerplaatsen in Amsterdam.\n\nDe scanauto\u2019s zijn uitgerust met camera\u2019s en rijden langs parkeerplaatsen in de stad. De camera\u2019s leggen kentekens van auto\u2019s vast en gebruiken een beeldherkenningsalgoritme om kentekens te identificeren.\n\nHet kentekennummer wordt naar het Nationaal Parkeerregister gestuurd waar gecontroleerd wordt of de auto het recht heeft om geparkeerd te staan. Als blijkt dat iemand geen parkeergeld heeft betaald, dan beoordeelt een controleur aan de hand van omgevingsfoto\u2019s of er sprake is van een bijzondere situatie (laden of lossen, stilstaande auto\u2019s voor een verkeerslicht). Bij twijfel bekijkt een parkeercontroleur de situatie ter plaatse. Als er geen sprake is van een bijzondere situatie, volgt een parkeerbon (\u2018naheffingsaanslag parkeerbelasting\u2019).\n\nHet verhogen van de pakkans vergroot de rechtvaardigheid ten opzichte van degenen die wel betalen of een geldige parkeervergunning hebben. Door te handhaven op de overtreding \u2018stilstaan op de stoep\u2019 wordt de overlast beperkt en de leefbaarheid vergroot voor diegenen die wel betaald of een geldige parkeervergunning hebben.\"", - "type": null, - "category": null, - "website": "https://algoritmeregister.amsterdam.nl/parkeercontrole/", - "status": null, - "goal": null, - "impact": null, - "proportionality": null, - "decision_making_process": null, - "documentation": "https://www.amsterdam.nl/parkeren-verkeer/", - "competent_authority": "Afdelingsmanager straatparkeren", - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": "parkeerdata@amsterdam.nl", - "area": "Amsterdam", - "lang": "Nederlands", - "revision_date": null, - "description": "Om Amsterdam leefbaar en toegankelijk te houden, mag er maar een beperkt aantal auto\u2019s in de stad parkeren. De gemeente controleert of een geparkeerde auto het recht heeft om geparkeerd te staan, dus of iemand parkeergeld heeft betaald of een parkeervergunning heeft. Om effici\u00ebnter te werken doen we die controle met scanauto\u2019s. Daarmee controleren we momenteel meer dan 150.000 offici\u00eble parkeerplaatsen in Amsterdam.\n\nDe scanauto\u2019s zijn uitgerust met camera\u2019s en rijden langs parkeerplaatsen in de stad. De camera\u2019s leggen kentekens van auto\u2019s vast en gebruiken een beeldherkenningsalgoritme om kentekens te identificeren.\n\nHet kentekennummer wordt naar het Nationaal Parkeerregister gestuurd waar gecontroleerd wordt of de auto het recht heeft om geparkeerd te staan. Als blijkt dat iemand geen parkeergeld heeft betaald, dan beoordeelt een controleur aan de hand van omgevingsfoto\u2019s of er sprake is van een bijzondere situatie (laden of lossen, stilstaande auto\u2019s voor een verkeerslicht). Bij twijfel bekijkt een parkeercontroleur de situatie ter plaatse. Als er geen sprake is van een bijzondere situatie, volgt een parkeerbon (\u2018naheffingsaanslag parkeerbelasting\u2019).\n\nHet verhogen van de pakkans vergroot de rechtvaardigheid ten opzichte van degenen die wel betalen of een geldige parkeervergunning hebben. Door te handhaven op de overtreding \u2018stilstaan op de stoep\u2019 wordt de overlast beperkt en de leefbaarheid vergroot voor diegenen die wel betaald of een geldige parkeervergunning hebben.", - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": "Gescande kentekens\n\nScanauto\u2019s met geautomatiseerde kentekenherkenning rijden door de stad om kentekens van geparkeerde auto\u2019s te herkennen. De gegevens die door de scanauto\u2019s worden verwerkt zijn de gescande afbeeldingen van kentekenplaten, samen met de locatie van de auto en tijdstempelgegevens. Als parkeergeld is betaald, worden de gegevens na 48 uur geanonimiseerd (kentekenfoto\u2019s en omgevingsfoto\u2019s worden verwijderd; het kenteken wordt verwijderd uit de metagegevens). Als geen parkeergeld is betaald, worden gegevens zo lang bewaard als nodig is voor bezwaar en beroep.\n\nNationaal Parkeerregister (NPR)\n\nHet Nationaal Parkeerregister is een nationale database waarin alle actuele parkeerrechten van kentekens geregistreerd staan. Het register wordt beheerd door de RDW. De gegevens worden verzameld vanuit de parkeermeters en parkeerapps van gemeentelijke en commerci\u00eble parkeerbedrijven, parkeeraanbieders en handhavers. Gegevens over parkeerrechten worden tot 13 weken na het eindigen van het parkeerrecht in het register bewaard (alleen voor geautoriseerd personeel toegankelijk). De gegevens van het register worden gebruikt om te controleren of iemand ergens mag parkeren.", - "methods_and_models": "Architectuur van het model\n\nAlgoritmen worden gebruikt:\n\nom de kentekenplaat te lokaliseren in de camerabeelden;\nom de afbeeldingen aan te passen voor identificatie en;\nom de individuele karakters van de kentekenplaat te identificeren.\nAls een kentekenplaat is ge\u00efdentificeerd en verwerkt, dan worden de kentekengegevens voor verdere verwerking naar het Nationaal Parkeerregister gestuurd. Een algoritme van NPR controleert vervolgens de geldigheid van parkeerrechten voor het kenteken op een bepaalde tijd en locatie (voor informatie over dat algoritme, zie de informatie op de website van NPR: https://nationaalparkeerregister.nl/downloads/downloads-mobiel-parkeren.html \u2013 in het bijzonder de technische documentatie). Een positieve uitslag betekent dat de auto geldige parkeerrechten heeft. In dat geval worden de scangegevens van de kentekenplaat binnen 48 uur verwijderd. Bij een negatieve uitslag worden de beelden gecontroleerd door een medewerker van EGIS Parking Services B.V., die in opdracht van de gemeente Amsterdam de parkeercontrole uitvoert. EGIS beoordeelt of er sprake is van een bijzondere situatie, zoals laden en lossen of een verkeerslicht. Bij twijfel bekijkt een parkeercontroleur de situatie ter plaatse. Als een kenteken geen geldige parkeerrechten heeft worden de gegevens overgedragen aan de gemeentelijke belastingdienst. Zij gebruiken de database van de RDW om het kenteken te koppelen aan de persoonsgegevens van de eigenaar en stuurt een parkeerbon (\u2018naheffingsaanslag parkeerbelasting\u2019).\n\nDe scanauto wordt naast de controle op betaald parkeren en het handhaven op stilstaan op de stoep ingezet voor de opsporing van gestolen voertuigen en voertuigen met een vordering van de politie of het Openbaar Ministerie aan de hand van de gescande kentekens. Doordat de scanauto de gescande kentekens langs de openbare gegevens bij de RDW (voertuigen die als gestolen staan geregistreerd) legt, kan het Landelijk Informatiecentrum Voertuigcriminaliteit (evt. samen met politie) indien er een match is de opsporing van dat voertuig doen. Tevens worden data verzameld over de parkeerdruk en het type vergunninghouder.", - "monitoring": null, - "human_intervention": "Menselijke controleurs beoordelen de beelden om te zien of er sprake is van een speciale situatie, bijvoorbeeld laden of lossen, of stilstaande auto\u2019s voor een verkeerslicht. Zij controleren ook of kenteken goed gelezen is. Bij twijfel bekijkt een parkeercontroleur de situatie ter plaatse.", - "risks": "Het systeem heeft een laag risico. Het belangrijkste risico is dat het systeem een kenteken verkeerd herkent en iemand een boete krijgt die dat niet verdient.\n\nDit kan gebeuren als een letter of cijfer op het kenteken foutief wordt herkend door zowel het algoritme als de controleur. Om dit risico te beheersen, krijgen mensen de mogelijkheid om via een website (naheffingsaanslag.amsterdam.nl) binnen 6 weken schriftelijk bezwaar te maken. Wie bezwaar maakt, krijgt de gelegenheid om de foto van het kenteken te zien en een situatiefoto, als die beschikbaar is. Eventuele omstanders, ongerelateerde kentekens en andere privacygevoelige informatie worden onherkenbaar gemaakt op die foto\u2019s.", - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.013799+00:00", - "lars": "78451490", - "owner": "gemeente-amsterdam" - }, - { - "name": "Beeldherkenning reclamebelasting", - "organization": "Gemeente Amsterdam", - "department": "Directie Belastingen, Waarderen, Heffen en Toezich", - "description_short": "Amsterdam wil een rustiger straatbeeld en wil daarom reclamebelasting heffen. Voor uitingen die zichtbaar zijn van de openbare weg (zoals gevelreclames, uithangborden en raamreclames) moet reclamebelasting worden betaald. Het formaat van de reclame-uiting bepaalt, naast onder andere het tarief(gebied) en de soort uiting, het bedrag dat betaald moet worden. Om de belastingen te kunnen heffen rijden er een aantal keer per jaar scanauto\u2019s op straat. De camera\u2019s in de scanauto\u2019s herkennen:\n\nreclame-uitingen;\nvoorzien die van co\u00f6rdinaten;\nvan een datum;\nmeten de oppervlakte;\npersoonsgegevens zoals gezichten en kentekens worden geblurd en niet opgeslagen.\n\nHet systeem doet vervolgens een voorstel aan de medewerker voor de reclame-uiting. De medewerker kan de gemaakte afbeelding (foto) en de vastgelegde gegevens zien. De medewerker beoordeelt dit en bepaalt de belastingplichtige en de belastingplicht (soort reclame en oppervlakte). Het systeem leert hiervan, zodat de camera\u2019s de volgende keer op straat de reclame beter herkennen en inmeten.\n\nVoordat de aanslag wordt gemaakt kan de belastingplichtige in de digitale balie van Belastingen nog controleren of alles klopt en wijzigingen doorgeven. Dan wordt de belastingaanslag verstuurd en kan de Reclamebelasting worden betaald.", - "type": null, - "category": null, - "website": "https://algoritmeregister.amsterdam.nl/beeldherkenning-reclamebelasting/", - "status": null, - "goal": null, - "impact": null, - "proportionality": null, - "decision_making_process": null, - "documentation": "https://www.amsterdam.nl/belastingen-heffingen/", - "competent_authority": "Team Waarderen, Heffen en Toezicht", - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": "algoritmen@amsterdam.nl", - "area": "Amsterdam", - "lang": "Nederlands", - "revision_date": null, - "description": "Amsterdam wil een rustiger straatbeeld en wil daarom reclamebelasting heffen. Voor uitingen die zichtbaar zijn van de openbare weg (zoals gevelreclames, uithangborden en raamreclames) moet reclamebelasting worden betaald. Het formaat van de reclame-uiting bepaalt, naast onder andere het tarief(gebied) en de soort uiting, het bedrag dat betaald moet worden. Om de belastingen te kunnen heffen rijden er een aantal keer per jaar scanauto\u2019s op straat. De camera\u2019s in de scanauto\u2019s herkennen:\n\nreclame-uitingen;\nvoorzien die van co\u00f6rdinaten;\nvan een datum;\nmeten de oppervlakte;\npersoonsgegevens zoals gezichten en kentekens worden geblurd en niet opgeslagen.\n\nHet systeem doet vervolgens een voorstel aan de medewerker voor de reclame-uiting. De medewerker kan de gemaakte afbeelding (foto) en de vastgelegde gegevens zien. De medewerker beoordeelt dit en bepaalt de belastingplichtige en de belastingplicht (soort reclame en oppervlakte). Het systeem leert hiervan, zodat de camera\u2019s de volgende keer op straat de reclame beter herkennen en inmeten.\n\nVoordat de aanslag wordt gemaakt kan de belastingplichtige in de digitale balie van Belastingen nog controleren of alles klopt en wijzigingen doorgeven. Dan wordt de belastingaanslag verstuurd en kan de Reclamebelasting worden betaald.", - "application_url": "https://www.cyclomedia.com/nl", - "publiccode": null, - "mprd": null, - "source_data": "Reclame-uiting\n\nVan iedere herkende reclame-uiting in de openbare ruimte wordt (via de co\u00f6rdinaten) een afbeelding van de openbare ruimte gebruikt waarop die uiting is te zien. Persoonsgegevens worden geblurd en niet vastgelegd.\n\n \n\nLocatiegegevens\n\nDe camera en bijbehorende programmatuur registreren de locatie van de herkende reclame-uiting. Hiervoor worden o.b.v. de topografische basiskaart van Nederland geografische co\u00f6rdinaten vastgelegd bij de reclame-uiting.\n\n \n\nDatum\n\nDe datum van constatering wordt vastgelegd.\n\n \n\nSoort\n\nDe soort reclame-uiting wordt automatisch herkend en vastgelegd.\n\n \n\nMeting\n\nDe camera en bijbehorende programmatuur registreren de afmetingen van de reclame-uiting. Hiervoor worden meetpunten van het reclameobject vastgelegd.\n\n \n\nBelastingobject\n\nDe afbeelding, datum, locatie en meting worden naar de belastingapplicatie gestuurd. Het systeem maakt daarbij een nieuw belastingobject aan of koppelt deze gegevens aan een bestaand reclameobject. De fiscale geheimhouding geldt voor deze gegevens.\n\n \n\nFeedback\n\nDe resultaten van de beoordeling van de medewerker zoals soort reclameobject, locatie en afmetingen worden automatisch teruggegeven aan het systeem. Het systeem leert hiervan.\n\n \n\nBelastinggegevens\n\nDe locatiegegevens worden gebruikt om het reclameobject te koppelen aan het WOZ-object (bijvoorbeeld winkel). De belastinggegevens van dat WOZ-object worden gebruikt om de belastingplichtige te bepalen en de belastingplicht samen te stellen. Via een regulier proces worden belastingaanslagen gemaakt. De fiscale geheimhouding geldt voor deze gegevens.", - "methods_and_models": "Architectuur van het model:\n\nDe algoritmes worden gebruikt om:\n\nEen mogelijke reclame-uiting te herkennen en als afbeelding vast te leggen. We nemen de dienst van Cyclomedia af die breed gebruikt wordt om de openbare ruimte vast te leggen. Er wordt gebruik gemaakt van gepatenteerde positioneringstechnologie. Deze technologie wordt niet openbaar gemaakt omdat het bedrijfsinformatie is. In het beeldmateriaal zoekt het systeem de reclame-uitingen en legt die vast in co\u00f6rdinaten. Deze gegevens worden gebruikt om het belastingobject vast te stellen. De nauwkeurigheid in de herkende objecten is minimaal 95%. Door het lerend effect wordt dit percentage omhoog gebracht. Daarnaast is er een controleproces waarbij o.b.v. bestandsanalyse gekeken wordt of er belastingobjecten (bijv. restaurant) zijn waarbij wel reclame wordt verwacht, maar waarvoor geen belastingplicht is aangemaakt.\n\nDe locatiegegevens van de reclame-uiting vast te leggen. Deze gegevens worden gebruikt om de belastingplichtige vast te stellen.\n\nDe soort en afmetingen van de reclame-uiting te bepalen en vast te leggen. Deze gegevens worden gebruikt om de grondslag voor de belasting vast te stellen.\n\nDe datum van de constatering vast te leggen. Deze gegevens worden gebruikt om de heffingsperiode vast te stellen.\n\nTe leren van de door de medewerker bevestigde gegevens. Deze gegevens worden gebruikt om de beeldherkenning verder te optimaliseren.\n\nPrestatie\n\nEr is sprake van fotogrammetrie. De fotogrammetrie houdt zich bezig met de interpretatie en het opmeten van beeldmateriaal bij het bepalen en beschrijven van de vorm en afmeting en ligging van objecten. Hierbij worden de vorm, locatie en de afmetingen bepaald met behulp van wiskundige modellen binnen een geautomatiseerd algoritme. De toegepaste rekenmodellen zijn niet openbaar. Dit is vertrouwelijke bedrijfsinformatie. Er zijn geen (inter)nationale standaarden voor de terrestrische plaatsbepaling, fotogrammetrische en point cloud metingen beschikbaar.\n\nHet is de medewerker die de locatie bevestigt en de oppervlakte van de reclame-uiting berekent. De regels die hiervoor gelden staan in de belastingverordening. De toepassing van deze regels door de medewerker is daarmee bepalend voor de accuratesse en nauwkeurigheid van de meting.\n\nHet algoritme is zelflerend. Het gebruikt de resultaten van de controle door de medewerker om te leren, zodat de beeldherkenning nauwkeuriger wordt.", - "monitoring": null, - "human_intervention": "Het systeem doet alleen een voorstel voor de reclame-uiting aan de medewerker. De medewerker beslist altijd.\n\nDe belastingplichtige heeft de mogelijkheid om de reclame-uitingen die op aanslag worden gebracht te controleren en daarop wijzigingen in te dienen.\n\nDe mogelijkheid tot bezwaar en beroep tegen de aanslag bestaat. Hiervoor kan men terecht op de digitale balie van Belastingen.", - "risks": "Het systeem is qua privacy niet risicovol. Het legt geen persoonsgegevens vast en maakt alleen foto\u2019s van uitingen in de openbare ruimte. Grootste risico hier is dat de locatie van de reclame-uiting bekend wordt waardoor mogelijk het adres van een persoon of bedrijf achterhaald kan worden. Dit kan op straat ook. Onbevoegden kunnen niet bij de opgeslagen beelden door de gerealiseerde informatiebeveiliging.\n\nBeveiligingsrisico\u2019s zijn beheerst door de algehele ingerichte beveiliging op systemen en verbindingen. Deze voldoen aan de eisen.\n\nIn de uitvoering is het grootste risico dat een reclame-uiting niet juist wordt gescand of ingemeten waardoor iemand een verkeerde aanslag krijgt. De medewerker controleert echter altijd en stelt de belastingplicht vast. De belastingplichtige kan reageren op de vastgelegde reclame-uiting en kan in bezwaar en beroep tegen de belastingaanslag. \n\n\n\nIn de uitvoering is het grootste risico dat een reclame-uiting niet juist wordt gescand of ingemeten waardoor iemand een verkeerde aanslag krijgt. De medewerker controleert echter altijd en stelt de belastingplicht vast. De belastingplichtige kan reageren op de vastgelegde reclame-uiting en kan in bezwaar en beroep tegen de belastingaanslag. ", - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.019223+00:00", - "lars": "67971871", - "owner": "gemeente-amsterdam" - }, - { - "name": "Public Eye", - "organization": "Gemeente Amsterdam", - "department": "CTO Innovatieteam", - "description_short": "Amsterdam is een drukke stad. Dit kan soms leiden tot verkeersonveilige situaties. Door data te verzamelen over de aantallen voetgangers is het mogelijk om maatregelen te treffen, waardoor de drukte in goede banen geleid kan worden. Hierdoor blijft de stad comfortabel, bereikbaar en verkeersveilig. Als een situatie door te grote drukte onveilig wordt, kan de gemeente ingrijpen. Dit gebeurt bijvoorbeeld door digitale informatieborden te plaatsen, zodat mensen weten welke routes ze moeten nemen. Of er wordt \u00e9\u00e9nrichtingsverkeer ingesteld.\n\nMet het crowdmonitoring systeem \u2018Public Eye\u2019 brengen we op een paar plekken in Amsterdam de drukte in kaart. Op dit moment is het systeem actief op de Arena Boulevard, op het Marineterrein en op de Dam. Op deze plekken hangen camera\u2019s die zijn gekoppeld aan een server van de gemeente. Op de server analyseert een algoritme hoeveel mensen er op de beelden staan. De informatie over het aantal aanwezige personen wordt doorgestuurd naar medewerkers van de gemeente, die de telling kunnen gebruiken om het verkeer beter te reguleren. De beelden worden niet getoond, alleen de aantallen. Ook bewoners en bezoekers van de stad kunnen de informatie over het aantal aanwezige mensen inzien, via https://druktebeeld.amsterdam.nl/. Op dit moment kan dat alleen voor de locatie Marineterrein. De ambitie is om dit voor alle Public Eye locaties te realiseren.\n\nDe videobeelden worden \u2013 zodra het algoritme het aantal aanwezige mensen heeft geteld \u2013onmiddellijk gewist.\n\nBij elke nieuwe locatie waar Public Eye geplaatst wordt, wordt er een kleine hoeveelheid beeldmateriaal opgenomen waarvan er steekproefsgewijs ca. 300 beelden worden geannoteerd voor de training van het algoritme. Zo kan de drukte op die locatie ook goed geanalyseerd worden. Elke locatie is immers uniek en heeft bijvoorbeeld net een andere lichtinval of camerahoogte.", - "type": null, - "category": null, - "website": "https://algoritmeregister.amsterdam.nl/public-eye/", - "status": null, - "goal": null, - "impact": null, - "proportionality": null, - "decision_making_process": null, - "documentation": "https://algoritmeregister.amsterdam.nl/public-eye", - "competent_authority": "CTO Innovatieteam", - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": "CIO-office@amsterdam.nl", - "area": "Amsterdam", - "lang": "Nederlands", - "revision_date": null, - "description": "Amsterdam is een drukke stad. Dit kan soms leiden tot verkeersonveilige situaties. Door data te verzamelen over de aantallen voetgangers is het mogelijk om maatregelen te treffen, waardoor de drukte in goede banen geleid kan worden. Hierdoor blijft de stad comfortabel, bereikbaar en verkeersveilig. Als een situatie door te grote drukte onveilig wordt, kan de gemeente ingrijpen. Dit gebeurt bijvoorbeeld door digitale informatieborden te plaatsen, zodat mensen weten welke routes ze moeten nemen. Of er wordt \u00e9\u00e9nrichtingsverkeer ingesteld.\n\nMet het crowdmonitoring systeem \u2018Public Eye\u2019 brengen we op een paar plekken in Amsterdam de drukte in kaart. Op dit moment is het systeem actief op de Arena Boulevard, op het Marineterrein en op de Dam. Op deze plekken hangen camera\u2019s die zijn gekoppeld aan een server van de gemeente. Op de server analyseert een algoritme hoeveel mensen er op de beelden staan. De informatie over het aantal aanwezige personen wordt doorgestuurd naar medewerkers van de gemeente, die de telling kunnen gebruiken om het verkeer beter te reguleren. De beelden worden niet getoond, alleen de aantallen. Ook bewoners en bezoekers van de stad kunnen de informatie over het aantal aanwezige mensen inzien, via https://druktebeeld.amsterdam.nl/. Op dit moment kan dat alleen voor de locatie Marineterrein. De ambitie is om dit voor alle Public Eye locaties te realiseren.\n\nDe videobeelden worden \u2013 zodra het algoritme het aantal aanwezige mensen heeft geteld \u2013onmiddellijk gewist.\n\nBij elke nieuwe locatie waar Public Eye geplaatst wordt, wordt er een kleine hoeveelheid beeldmateriaal opgenomen waarvan er steekproefsgewijs ca. 300 beelden worden geannoteerd voor de training van het algoritme. Zo kan de drukte op die locatie ook goed geanalyseerd worden. Elke locatie is immers uniek en heeft bijvoorbeeld net een andere lichtinval of camerahoogte.", - "application_url": "https://github.com/Amsterdam/public-eye, https://www.tapp.nl/projects/public-eye", - "publiccode": null, - "mprd": null, - "source_data": "Trainingsdata: Marineterrein\n\nMet trainingsdata \u2018leert\u2019 het algoritme hoeveel mensen een afbeelding bevat. Deze dataset bevat beelden van vier camera\u2019s in het Marineterreingebied. Het gaat om enkele honderden beelden per camera. Het aantal mensen op de beelden varieert van 0 tot ongeveer 200. De camera\u2019s die gebruikt zijn voor deze beelden hingen tijdens de dataverzameling bij het Marineterrein op 3 tot 15 meter hoogte. In deze dataset hebben we handmatig aangegeven waar in het beeld de hoofden van mensen aanwezig zijn. Deze annotaties zijn in twee fases opgesteld, dat wil zeggen dat elke annotatie eenmaal is gecontroleerd is en zo nodig aangepast. Zo hebben we de kans op fouten bij het annoteren zo klein mogelijk gemaakt. Er is maar een beperkt aantal medewerkers van de gemeente dat rechten heeft om deze data te benaderen.\n\nTrainingsdata: Arena\n\nMet trainingsdata \u2018leert\u2019 het algoritme hoeveel mensen een afbeelding bevat. Deze dataset bevat beelden van vier camera\u2019s in het Arenagebied. Het gaat om ongeveer 300 geannoteerde beelden per camera. Het aantal mensen op de beelden varieert van 0 tot 100. De camera\u2019s die gebruikt zijn voor deze beelden hingen tijdens de dataverzameling rondom de Amsterdam Arena op 10 tot 15 meter hoogte. In deze dataset hebben we handmatig aangegeven waar in het beeld de hoofden van mensen aanwezig zijn. Deze annotaties zijn in drie fases opgesteld, dat wil zeggen dat elke annotatie twee keer gecontroleerd is en zo nodig aangepast. Zo hebben we de kans op fouten bij het annoteren zo klein mogelijk gemaakt. Er is maar een beperkt aantal medewerkers van de gemeente dat rechten heeft om deze data te benaderen.\n\nTrainingsdata: Dam dataset\n\nTrainingsdata: Dam Met trainingsdata \u2018leert\u2019 het algoritme hoeveel mensen een afbeelding bevat. Deze dataset bevat ongeveer 1000 beelden van de Dam in Amsterdam. Al deze beelden zijn opgenomen vanaf dezelfde locatie onder dezelfde hoek. Het zijn \u201cgestitchte\u201d beelden: de beelden van vier verschillende camera\u2019s zijn samengevoegd tot een enkel beeld. Op deze beelden staan tussen de 0 en 200 mensen, en de omstandigheden zijn steeds heel verschillend. Denk aan: weersomstandigheden, lichtinval, tijd van de dag, reflecties in de lens door zonlicht, et cetera. In deze beelden hebben we handmatig aangegeven (ofwel \u201cgeannoteerd\u201d) waar in het beeld de hoofden van mensen aanwezig zijn. Deze annotaties zijn in drie fases opgesteld, dat wil zeggen dat elke annotatie twee keer gecontroleerd is en zo nodig aangepast. Zo hebben we de kans op fouten bij het annoteren zo klein mogelijk gemaakt. Het is om te meten hoe druk het is natuurlijk niet nodig om te weten wie op de beelden staat, het is voldoende om te weten hoeveel mensen op de beelden staan. Er is maar een beperkt aantal medewerkers van de gemeente dat rechten heeft om deze data te benaderen.\n\nTrainingsdata: Shanghaitech Crowd CountingLink naar dataset\n\n\u2018Shanghaitech Part A\u2019 Deze dataset bevat 482 beelden van grote groepen mensen (gemiddeld 501,4 per beeld). Deze beelden zijn willekeurig vanaf het internet verzameld. Deze set bevat annotaties die de locaties van de hoofden van de mensen in het beeld weergeven.\n\n\u2018Shanghaitech Part B\u2019 Deze dataset bevat 716 beelden van groepen mensen (gemiddeld 123.6 per beeld), opgenomen door verscheidene camera\u2019s in de stad Shanghai, met verschillende beeldhoeken. Deze set bevat annotaties die de locaties van de hoofden van de mensen in het beeld weergeven.\n\nDe Gemeente Amsterdam heeft de beelden van de Shanghaitech Crowd Counting dataset niet zelf verzameld. Ze zijn vrij beschikbaar via het internet. Deze dataset wordt alleen gebruikt voor trainingsdoeleinden.\n\nCamerabeelden drukte-analyse\n\nOp dit moment is het systeem actief op de Arena Boulevard, op het Marineterrein en op de Dam. Op deze plekken hangen camera\u2019s die zijn gekoppeld aan een server van de gemeente. Op de server analyseert een algoritme hoeveel mensen er op de beelden staan. De videobeelden worden \u2013 direct na de analyse \u2013gewist.", - "methods_and_models": "Architectuur van het model\n\nEen camera maakt videobeelden van een bepaald gebied. De videobeelden worden \u2013beveiligd door end-to-end encryptie \u2013 naar een lokale server gestuurd. Het algoritme analyseert hoeveel mensen er op de beelden staan. Dat getal wordt gestuurd naar een overzichtspagina (dashboard) voor de operationeel medewerkers van de gemeente, zodat deze een accuraat beeld hebben van de drukte op dit moment. Daarnaast wordt het getal getoond op https://druktebeeld.amsterdam.nl/. Op dit moment wordt alleen de drukte op de locatie Marineterrein getoond, in de toekomst ook voor de andere Public Eye locaties. De videobeelden verlaten de server niet en worden niet opgeslagen. Alleen voor trainingsdoeleinden wordt een zeer beperkt aantal beelden bewaard, deze zijn versleuteld.\n\nPersoonsgegevens worden volgens de geldende wet- en regelgeving (AVG) en de leidraad voor transparantie (TADA) verwerkt. Bij dit project hoort een specifieke privacyverklaring. De locaties en functies van de camera\u2019s zijn opgenomen in het cameraregister van de gemeente Amsterdam.\n\nPrestatie\n\nHet algoritme moet ongeveer 70 procent nauwkeurig zijn om er relevante inzichten uit te kunnen halen om het verkeer te reguleren. In de praktijk levert het algoritme ongeveer 90 procent nauwkeurigheid. Dit leiden we af uit de trainingsbeelden.\n\nNaast de operationele werking wordt er in dit project constant ge\u00efnnoveerd. We zijn continu op zoek naar nieuwe functionaliteiten die het systeem kunnen verbeteren:\n\n\u00c9\u00e9n van de ambities is om het systeem nog privacy vriendelijker te bouwen en dat doen we door een model toe te voegen, waardoor het mogelijk is om met minder beelden per camera het algoritme te trainen. Dit wordt het ViCCT model genoemd.\nWe willen de analyse op de sensor uit laten voeren (de \u201con edge\u201d techniek).", - "monitoring": null, - "human_intervention": "Aan de hand van de trainingsdata wordt de kwaliteit en nauwkeurigheid van het algoritme periodiek ge\u00ebvalueerd door een klein aantal medewerkers van de gemeente die toestemming hebben om de beelden te bekijken. Zij bekijken of het algoritme terecht mensen herkent als mensen.", - "risks": "De videobeelden die gebruikt worden door Public Eye worden \u2013 zodra het algoritme het aantal aanwezige mensen heeft geteld \u2013 gewist. Alleen voor het trainen van het model wordt een klein aantal videobeelden bewaard (ongeveer 300 beelden per locatie).\n\nDe beelden bevinden zich op de gemeentelijke infrastructuur die voldoet aan de Baseline Informatiebeveiliging Overheid (https://www.informatiebeveiligingsdienst.nl/project/baseline-informatiebeveiliging-overheid). Indien de beelden toch ongeanonimiseerd in verkeerde handen zouden komen is het gevaar op van een inbreuk op de privacy relatief laag: de camera hangt op een zodanig grote hoogte, dat het lastig is om op de beelden personen te herkennen. Daarnaast wordt aan dataminimalisatie gedaan: de camera\u2019s in het ArenA-gebied worden uitsluitend aangezet vanaf twee uur voorafgaand aan een evenement totdat het evenement afgelopen is. Op andere tijden staan de camera\u2019s van Public Eye in het ArenA-gebied uit. Er wordt aan gewerkt om de camera\u2019s van Public Eye op de overige locaties ook uit te zetten op momenten dat deze camera\u2019s niet noodzakelijk zijn, bijvoorbeeld \u2019s nachts.\n\nOm Amsterdammers zo goed mogelijk te informeren hangt bij elke camera een sticker met een unieke ID code zodat je op maps.amsterdam.nl/privacy kunt herleiden waarvoor deze camera bedoeld is. In dit geval zijn het alleen telcamera\u2019s. Het privacybeleid van de gemeente Amsterdam is ook op deze website te vinden: https://www.amsterdam.nl/privacy/", - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.024175+00:00", - "lars": "38748497", - "owner": "gemeente-amsterdam" - }, - { - "name": "Druktebeeld (NL)", - "organization": "Gemeente Amsterdam", - "department": "CTO Innovatieteam", - "description_short": "Druktebeeld is een webapp, die een beeld geeft van de actuele drukte in de stad door verschillende informatiebronnen samen te brengen. Het laat bijvoorbeeld zien hoeveel bezoekers er op een locatie zijn of welke parkeerplaatsen in gebruik zijn. Om dit beeld te krijgen, maken we gebruik van de locatiegegevens van de bezoekers via bijvoorbeeld de webapp Weeronline.", - "type": null, - "category": null, - "website": "https://algoritmeregister.amsterdam.nl/druktebeeld-nl/", - "status": null, - "goal": null, - "impact": null, - "proportionality": null, - "decision_making_process": null, - "documentation": "https://algoritmeregister.amsterdam.nl/druktebeeld-nl/", - "competent_authority": "Directie", - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": "innovatie@amsterdam.nl", - "area": "Amsterdam", - "lang": "Nederlands", - "revision_date": null, - "description": "Drukte in de openbare ruimte is al jaren een probleem in Amsterdam. Sinds de coronapandemie is het alleen maar belangrijker geworden om een goed beeld te hebben van de drukte in de stad. Druktebeeld is een webapp, die een beeld geeft van de actuele drukte in de stad door verschillende informatiebronnen samen te brengen. Het laat bijvoorbeeld zien hoeveel bezoekers er op een locatie zijn of welke parkeerplaatsen in gebruik zijn. Om dit beeld te krijgen, maken we gebruik van de locatiegegevens van de bezoekers via bijvoorbeeld de webapp Weeronline.\n\nDruktebeeld is bedoeld om het publiek te informeren over de drukte in de openbare ruimte. Mensen kunnen zien hoe druk het ergens is, en er vervolgens voor kiezen om er op een rustiger moment naartoe te gaan, of om een andere route te nemen. Bovendien helpt Druktebeeld de gemeente bij het managen van drukte als dat nodig is.", - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": "CMSA\n\nHet Crowd Monitoring Systeem Amsterdam (CMSA) geeft informatie over het aantal passanten op een aantal drukke plekken in de stad. Het gaat hier om voetgangers. De gegevens zijn anoniem. In CMSA worden vooral 2D- en 3D-sensoren gebruikt. Hiermee meten we hoe druk het ergens is. \u201cDoor data te verzamelen over aantallen, dichtheden en stromen voetgangers, is het mogelijk slimmere maatregelen te nemen om drukte goed te laten verlopen.\u201d Zie hiervoor de link https://www.amsterdam.nl/privacy/specifieke/privacyverklaring-parkeren-verkeer-bouw/crowdmanagement/)\n\nhttps://api.data.amsterdam.nl/v1/crowdmonitor/passanten/?format=api\n\nResono\n\nOm de drukte in parken, op pleinen en in winkelgebieden in de stad aan te geven, maken we gebruik van gegevens van het bedrijf Resono. \u201cResono meet drukte op elke gewenste locatie met een mobiel panel van meer dan een miljoen mensen. Hiermee maken we een nauwkeurige schatting van de drukte binnen een bepaald tijdsbestek. Locaties kunnen vari\u00ebren in oppervlakte en type. Denk bijvoorbeeld aan een winkel, winkelgebied, parkeerplaats, wijk of stad. Met Resono hebben klanten integraal inzicht in bezoekersgedrag.\u201d (vertaald van reso.no) De gemeente bepaalt voor welke gebieden Resono de gegevens verzamelt. De dataset bevat een schatting van het aantal bewegende personen binnen die gebieden, per kwartier. De gemeente krijgt dus geen informatie over personen, alleen samengevoegde gegevens. Resono voldoet aan de Nederlandse en Europese privacywetgeving. Ze hebben geen persoonlijke informatie over mensen (zoals leeftijd, geslacht), alleen anonieme locatiegegevens. Het privacybeleid van Resono vindt u hier: https://reso.no/privacy-policy/\n\nParkeergaragebezetting\n\nDeze bron geeft bijna realtime de beschikbaarheid weer van parkeerlocaties in Amsterdam, waaronder enkele P+R-locaties. Het gaat om openbare parkeergarages en -terreinen, met een focus op grote locaties (200+ plekken) in de binnenstad. Het gaat hierbij dus niet om parkeren op straat. De gegevens komen van meerdere parkeerbeheersystemen, die de in- en uitrijdende auto\u2019s tellen. De gegevens worden verzameld en eenduidig gemaakt door het bedrijf Vialis. Dit zijn open gegevens die dus door iedereen gebruikt kunnen worden. Het zijn gegevens over de capaciteit en het aantal vrije plekken per locatie. Er wordt onderscheid gemaakt tussen plekken die voor korte termijn kunnen worden gebruikt (bezoekers) en plekken die voor langere tijd kunnen worden gebruikt (abonnementen en licentiehouders). Volledige beschrijving: https://open.data.amsterdam.nl/uploads/actuele_beschikbaarheid_parkeergarages/Beschrijving%20Dataset%20-%20Actuele%20beschikbaarheid%20Parkeergarages%20v2.pdf\n\nNationaal Dataportaal Wegverkeer\n\nFloating car data van het Nationaal Dataportaal Wegverkeer. Dit zijn open data, gebaseerd op samengevoegde en anonieme gegevens uit navigatiesystemen. Ze worden geleverd door Be-Mobile. De data geven de gemiddelde snelheid weer die over de afgelopen 15 minuten werd gereden. Dit wordt vergeleken met de snelheid die daar gemiddeld wordt gereden. Op deze manier kunnen gebruikers zien of er vertragingen zijn.\n\nDe gegevens zijn geanonimiseerd.\n\nGemeentevervoerbedrijf (GVB)\n\nDe gemeente ontvangt wekelijks een overzicht van hoe vaak er op de haltes van het GVB wordt ingecheckt en uitgecheckt. Op basis van deze gegevens maken we een verwachting van de drukte voor de grote metrostations. De gegevens zijn anoniem en samengevoegd per uur met een minimum aantal in- of uitchecks van 15.", - "methods_and_models": "Modelarchitectuur\n\nVoor de visualisaties in Druktebeeld hebben we gebruik gemaakt van drie modellen, \u00e9\u00e9n voor iedere databron. Het doel van de modellen is om een waarde te vertalen naar een drukte-indicator:\nniet druk: makkelijk 1,5m afstand houden / voldoende parkeerplaatsen (kleur groen)\ndruk: mogelijk 1,5m afstand houden / weinig beschikbare parkeerplaatsen (kleur oranje)\nte druk: moeilijk/niet mogelijk om 1,5m afstand te houden / (bijna) geen beschikbare parkeerplaatsen (kleur rood)\nDrukte is enigszins subjectief. Het doel is om via de kleuren in Druktebeeld de gemiddelde drukte van de gebruikers van de app te laten zienw. Toen de 1,5m-maatregel werd afgeschaft, hebben we de definities van de kleuren aangepast. We gebruiken de feedback van gebruikers bij het instellen van druktedrempels (niet direct wanneer de gebruikers feedback geven). De modellen cre\u00ebren twee drempelwaardes per locatie: drempelwaarde lage drukte en drempelwaarde hoge drukte. Deze waarden worden om de paar weken (Resono) of maanden (CMSA & parkeren) berekend en opgeslagen. Als de telling op een locatie, op een bepaald moment is:\nOnder druktedrempel laag, krijgt een locatie de aanduiding \u2018niet druk\u2019.\nTussen druktedrempel laag en druktedrempel hoog krijgt hij de aanduiding \u2018druk\u2019.\nBoven publieksdrempel hoog, krijgt het de aanduiding \u2018te druk\u2019.\nDeze drukte-indicaties worden elk kwartier per locatie (vanuit elke bron) berekend en weergegeven in de Druktebeeld-webapp.\nPassantenmodel (CMSA):\n\nHet doel van dit model is om drempels te cre\u00ebren voor het aantal mensen dat een sensor passeert. De druktedrempels worden direct berekend op basis van de breedte van de straat waar de sensor zich bevindt. Op de Public Eye-pagina van het algoritmeregister (\nhttps://algoritmeregister.amsterdam.nl/public-eye/\n) lichten we dit nader toe. Voor sommige locaties kan het crowdmanagementteam van de gemeente de waarden aanpassen op basis van de feedback van de bezoekers.\nImpressiemodel (Resono):\n\nHet doel van dit model is om drempels te berekenen om in te schatten hoeveel mensen er in een bepaald gebied zijn. Het model is een beslisboom met de volgende input:\nhistorische Resono-gegevens;\ntype locatie (park/plein/winkelstraat);\noppervlakte (vierkante meter van het park/plein/winkelstraat);\nlengte van paden binnen het gebied (verzameld met OpenStreetMap);\nfeedback van de gebruikers van de webapp (input van\nhttps://druktebeeld.amsterdam.nl/feedback\n); en\nfeedback van het crowdmanagementteam van de gemeente.\nDe resulterende druktedrempels verschillen uiteraard per locatie.\nParkeren model:\n\nMet druktedata uit het verleden kunnen we een indicatie geven hoe groot de kans is dat een locatie vol raakt op het moment dat de gebruiker Druktebeeld controleert. De druktedata geven ook een indicatie of er voldoende tijd zit tussen het moment dat een gebruiker Druktebeeld raadpleegt en het moment dat hij arriveert op de parkeerlocatie en een plek vindt.\n\nDe bezettingsgraad wordt bepaald op basis van:\n\nde beschikbare plaatsen;\nde totale capaciteit per garage als het verschil tussen het totaal aantal beschikbare plaatsen; en\nde beschikbare plaatsen van de afgelopen 5 kwartier.\nOp dit moment gebruiken we alleen informatie over kort parkeren. De drempels worden per locatie bepaald door een analyse van historische gegevens. Voor de meeste locaties is de druktedrempel \u2018laag\u2019 vastgesteld op een bezetting van 90 procent. Onder dit percentage zijn er voldoende plekken. Voor deze locaties is de druktedrempel \u2018hoog\u2019 vastgesteld op 95 procent. Tussen de 90% en 95% zijn er voldoende plekken beschikbaar, maar de kans is groot dat deze binnen 30 minuten vol zijn. Voor sommige locaties kunnen sneller vol raken. Op die locaties zijn de drempels \u2018laag\u2019 en \u2018hoog\u2019 respectievelijk 80 procent en 90 procent.\nDrukteverwachtingen metrohaltes:\n\nWe maken een drukteverwachting voor de komende week op de metrohaltes. Daarvoor gebruiken we gegevens over in- en uitchecken uit het verleden, weersdata en de weersverwachting. De drempelwaardes zijn per halte vastgesteld, afhankelijk van hun oppervlakte.\n\nDe drukteverwachting wordt bepaald op basis van:\n\nAantal in- en uitchecks afgelopen jaar\nOppervlakte van de metrohalte\nWeerdata afgelopen week\nWeersverwachting komende week", - "monitoring": null, - "human_intervention": "Er worden geen geautomatiseerde besluiten genomen op basis van de modellen van Druktebeeld. Elke beslissing op basis van drukte wordt genomen door mensen, dat kunnen zowel ambtenaren als burgers zijn, met ondersteuning van de Druktebeeld-data en webapp.\n\nUit de \u2018passer-by\u2019- en \u2018impression\u2019-modellen komen massa-indicaties. Die worden gemonitord door om de paar weken een rapport uit te brengen. Dit rapport evalueert de invoergegevens, de gebruikersfeedback op de drukte-indicaties en de feedback van het crowdmanagementteam op de drukte-indicaties. Het rapport bevat tabellen en grafieken met gegevens en resultaten die onverwacht/onregelmatig lijken. Naar aanleiding van de resultaten van het rapport worden de modellen zo nodig aangepast.", - "risks": "De ge\u00efdentificeerde risico\u2019s zijn:\n\nBesluit wordt genomen op onjuiste indicatie van menigte.\nBewoners/bezoekers hebben het gevoel dat ze bekeken worden door de gemeente.\nOnbedoeld gebruik van de informatie.\nDe gemeente heeft niet onafhankelijk kunnen vaststellen dat de data die Resono verkrijgt volledig geanonimiseerd zijn. ICT heeft een onafhankelijk onderzoek laten uitvoeren en heeft hiervoor een certificaat uitgegeven, zie risico \u2018verkregen data\u2019. Link: https://blog.reso.no/privacy-verified-certificering-toegekend-aan-resono-2/", - "performance_standard": "Key metric: drukte-indicatie (niet druk/druk/te druk) van het model is gelijk aan de crowd-indicatie van de gebruiker (feedback via de Druktebeeld-webapp). Prestaties (gemeten 29/1 \u2013 22/2): 77% ", - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.029161+00:00", - "lars": "16268148", - "owner": "gemeente-amsterdam" - }, - { - "name": "Wmo-voorspelmodel", - "organization": "Gemeente Den Haag", - "department": "Onderwijs, Cultuur en Welzijn", - "description_short": "Het Wmo-voorspelmodel geeft een voorspelling van het aantal unieke gebruikers en de kosten van de Wmo met een voorspelhorizon van zes jaar. Voorspellingen worden gedaan op wijkniveau voor zowel de Wmo-totaal als voor deelproducten van de Wmo (Hulp bij het Huishouden, Ondersteuning thuis en Hulpmiddelen en Diensten). ", - "type": "Op regels gebaseerd", - "category": null, - "website": null, - "status": "Actief", - "goal": "Het algoritme is ontwikkeld omdat de gemeente meer inzicht wil hebben in het gebruik en de kosten van de Wmo de komende jaren. De Haagse bevolking groeit en vergrijst waardoor het gebruik van de Wmo ook naar verwachting gaat toenemen. De vraag is met hoeveel mensen en in welke Haagse wijken en voor welke Wmo-voorzieningen? Het voorspelmodel beantwoordt deze vragen.", - "impact": "Het voorspelmodel doet geen uitspraken over (kansen van) individuele burgers en er is gekozen voor modellen die uitlegbaar zijn. Dit betekent dat we als gemeente geen modellen gebruiken waarvan niet goed is vast te stellen hoe het model tot een bepaalde uitkomst is gekomen (zgn. Black Box modellen). Het Wmo-voorspelmodel vervangt op geen enkele manier de kennis en kunde van onze consulenten en uitvoering. Het instrument is voor hen niet bedoeld, maar vooral voor beleid en het maken en onderbouwen van beleidskeuzes voor de langere termijn. Juist door de kennis van het Wmo-voorspel kunnen we tijdig anticiperen en alle individuen beter blijven ondersteunen. ", - "proportionality": "Er zijn geen alternatieven overwogen om het doel te bereiken. ", - "decision_making_process": "Met de inzichten uit het Wmo-voorspelmodel wordt beleid en uitvoering ondersteund bij beantwoorden van tactische en strategische vragen. Dit zijn vragen en onderwerpen die op de langere termijn spelen (bijvoorbeeld 5 \u00e1 10 jaar). Het model is niet bedoeld voor het beantwoorden van operationele vragen (onderwerpen die op korte termijn spelen) en er is geen sprake van geautomatiseerde besluiten. ", - "documentation": null, - "competent_authority": "Het Wmo-voorspelmodel maakt geen gebruik van persoonskenmerken.", - "lawful_basis": "Er is geen wettelijke grondslag voor het voorspelmodel, maar de gemeente is verantwoordelijk voor de uitvoering van de Wmo en door het model kan de gemeente beter anticiperen op verwachte ontwikkelingen en burgers beter ondersteunen.", - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": "Gezien de aard van het model is dit niet geregeld.", - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": "Nederlands", - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": "Nee", - "source_data": "Er is alleen gebruikgemaakt van open data, namelijk van het bestand Kerncijfers Wijken en Buurten CBS en van het bestand Wmo-cli\u00ebnten; type maatwerkarrangement CBS.", - "methods_and_models": "Het gaat om een regressie model. De prestaties van dit model worden afgemeten aan de hand van de maten RMSE, MAE en MAPE. Dit zijn maten die op verschillende manieren vaststellen hoe groot de voorspelfout is. ", - "monitoring": "Indien het noodzakelijk is een nieuw model te bouwen/te trainen, wordt de privacy officer betrokken bij de keuze van features en zal bij een geheel nieuw model ook opnieuw naar het ethisch kader worden gekeken.", - "human_intervention": "Er is geen sprake van een geautomatiseerd systeem. De inzichten uit het voorspelmodel kunnen alleen door tussenkomst van mensen en met de contextkennis en ervaring van betrokken medewerkers worden gebruikt. ", - "risks": "De risico's van het algoritme zijn vooraf en tijdens het bouwen van het voorspelmodel in kaart gebracht. Omdat het voorspelmodel geen uitspraken doet over individuele personen maar over het gebruik van voorzieningen in wijken, was er geen risico dat met de uitkomsten uit het model de privacy van specifieke individuele personen zou kunnen worden geschonden. Verder is alleen gewerkt met wijken die voldoende groot zijn (meer dan 100 inwoners) en waar voldoende mensen gebruikmaakten van de Wmo (meer dan 100 gebruikers). Een reden hiervoor is dat hierdoor geen onthulling mogelijk is. Dat wil zeggen dat we niet door het combineren van kenmerken kunnen vaststellen wie de mogelijke gebruikers van Wmo-voorzieningen zijn. Verder is bij het bouwen van het model samen met de privacy officer afgewogen welke variabelen wel en welke variabelen niet vanuit privacy overwegingen meegenomen konden worden. Hierbij vormde de AVG steeds het uitgangspunt. Daarnaast is uitlegbaarheid van het model en de uitkomsten een relevant en doorslaggevend criterium. Tenslotte is gebruikgemaakt van De Ethische Data Assistent van de Universiteit van Utrecht om mogelijke ethische problemen vooraf in kaart te brengen. Dit heeft geleid tot het opstellen van een ethisch kader. De vraag welke rol bias speelt in het gebruik van het algoritme is een veel te algemene vraag, aangezien er vele vormen van bias zijn. Als het gaat om vooringenomenheid gericht op specifieke bevolkingsgroepen, dan speelt dat bij dit model geen rol. We zijn niet op zoek naar specifieke individuele personen met specifieke kenmerken, maar willen een inschatting maken van het gebruik van de Wmo in de hele wijk en voor heel Den Haag.", - "performance_standard": "Het model wordt jaarlijks geactualiseerd. De voorspellingen van het oude model worden vergeleken met voorspellingen van het nieuwe model en vergeleken met de realisaties.", - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.034983+00:00", - "lars": "97246956", - "owner": "gemeente-den-haag" - }, - { - "name": "Scanauto kentekenherkenning", - "organization": "Gemeente Den Haag", - "department": "Stadsbeheer", - "description_short": "Het doel van het algoritme is om kentekens automatisch te scannen ten behoeve van parkeerhandhaving en handhaving milieuzones.", - "type": "Op regels gebaseerd", - "category": null, - "website": null, - "status": "Actief", - "goal": "Het doel van het algoritme is de herkenning van kentekens van voertuigen die in overtreding zijn voor respectievelijk naheffing parkeerbelasting en Boete Milieuzone (Wet Mulder).", - "impact": "Een burger komt in aanraking met de uitkomst van het algoritme bij een overtreding - Uitgebreide informatiepagina op www.denhaag.nl", - "proportionality": "Nee, dit is in een aanvulling op de handmatige handhaving.", - "decision_making_process": "Met het algoritme wordt het proces ondersteund om te bepalen of een auto fout geparkeerd is (Fiscale Parkeerhandhaving) en om te bepalen of een auto/vrachtauto ten onrechte in een bepaald gebied rijdt (Handhaving Milieuzones).", - "documentation": null, - "competent_authority": "Gemeente Den Haag", - "lawful_basis": "Gemeentelijke verordeningen voor fiscale parkeerhandhaving en handhaving Milieuzones.", - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": "Ja, respectievelijk Bezwarenprocedure Parkeerhandhaving en idem Milieuzones.", - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": "Nederlands", - "revision_date": null, - "description": null, - "application_url": "Verwerkersovereenkomsten en de (duur van de) contracten die de gemeente sloot met de leveranciers. De gemeente bezit geen uitgebreide documentatie over de toegepaste algoritmes.", - "publiccode": null, - "mprd": "Ja", - "source_data": "RDW, Vergunningen/ontheffingen, GBA, Nationaal Parkeer Register", - "methods_and_models": "Algoritme berust bij de leveranciers. Gemeente neemt dienstverlening af en heeft geen inhoudelijke kennis van de werking van het algoritme.", - "monitoring": "Door tussenkomst van een BOA (wel/geen naheffing/boete of. Wel/niet ontvankelijk / gegrond bezwaar). Dit proces en informatiestroom lopen via de dienstdoende BOA (opsporingsambtenaar).", - "human_intervention": "Door tussenkomst van een BOA (wel/geen naheffing/boete of. Wel/niet ontvankelijk / gegrond bezwaar). Dit proces en informatiestroom lopen via de dienstdoende BOA (opsporingsambtenaar).", - "risks": "Inkoop van dienstverlening van leveranciers die ISO gecertificeerd zijn. Algoritmes blijven berusten bij de leveranciers. Er is sprake van een verwerkersovereenkomst en een DPIA om de risico's voor de gemeente en de burgers zo klein mogelijk te houden.", - "performance_standard": "Er zijn geen specifieke prestaties van het algoritme afgesproken. Dienstverlening door de leverancier wordt periodiek besproken. ", - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.041137+00:00", - "lars": "94936689", - "owner": "gemeente-den-haag" - }, - { - "name": "Zicht op ondermijning", - "organization": "Gemeente Den Haag", - "department": "Bestuursdienst", - "description_short": "Er worden meerdere analyses uitgevoerd in het project Zicht op Ondermijning, zie ook website www.zichtopondermijning.nl. Er wordt continu doorgewerkt aan het toevoegen van inzichten en (nieuwe) analyses.", - "type": "Op regels gebaseerd", - "category": null, - "website": "www.zichtopondermijning.nl ", - "status": "Actief", - "goal": "In de analyses die voor het dashboard Zicht op Ondermijning worden uitgevoerd, worden regelmatig algoritmen toegepast. Soms zijn dit heel eenvoudige algoritmen. Waar rekenregels worden toegepast, is in strikte zin immers al sprake van een algoritme. Er worden ook methodologisch ingewikkeldere algoritmen gebruikt, zoals een beslisboomalgoritme bij de analyse naar\u00a0jonge aanwas\u00a0en\u00a0subgroup discovery\u00a0bij de groepsanalyse naar betrokkenen bij verdachte transacties. Voor het dashboard Zicht op Ondermijning worden algoritmen nooit toegepast om op het niveau van individuele adressen, bedrijven, huishoudens of personen inzichten te bieden of conclusies te trekken. Individuele gegevens zijn gepseudonimiseerd en uitkomsten zijn altijd geaggregeerd. Iedere analyse op het dashboard wordt in het onderdeel\u00a0Verdiepende informatie\u00a0in detail beschreven. Daar staat uitgelegd welke analysemethoden worden toegepast, of dit algoritmen zijn, welke keuzes daarbij gemaakt zijn en welke kenmerken van adressen, bedrijven, huishoudens of personen zijn beschouwd. Migratieachtergrond wordt in dit dashboard alleen gebruikt als kenmerk in beschrijvende statistieken van groepen huishoudens of personen, mits daar voldoende onderbouwing voor bestaat. Het wordt niet gebruikt als kenmerk in classificeringsalgoritmen die worden toegepast op huishoudens of personen.", - "impact": "Er is voor burgers geen dagelijks effect. De analyses uit de City Deal zijn bedoeld om trends en patronen van ondermijnende criminaliteit in kaart te brengen, deze worden niet in individuele gevallen benut. De opbrengsten van analyses worden publiekelijk gedeeld via een dashboard. De gegevens zijn veelal historisch (hebben betrekking op eerdere jaren) en zijn niet real time", - "proportionality": "De beoogde resultaten en inzichten zijn enkel en alleen te bereiken door te werken met microdata van het CBS binnen de kaders van de CBS-wet. Om die reden is daar in 2017 de City Deal 'Zicht op Ondermijning' voor opgesteld en ondertekend. Zie ook: https://zoek.officielebekendmakingen.nl/stcrt-2017-48699.html ", - "decision_making_process": "De uitkomsten van de analyses (en dus algoritmes) worden niet direct gebruikt voor beslissingen in individuele gevallen, hoogstens als input voor beleidskeuzes op hoger abstractieniveau.", - "documentation": null, - "competent_authority": "De verwerking van persoonsgegevens ten behoeve van de uit te voeren analyses geschiedt met inachtneming van de Wet bescherming persoonsgegevens (Wbp) en met ingang van 25 mei 2018 de Algemene verordening gegevensbescherming (AVG) en de Uitvoeringswet Algemene verordening gegevensbescherming alsmede, afhankelijk van de aard van de te verwerken persoonsgegevens, andere relevante wettelijke bepalingen met betrekking tot de bescherming van persoonsgegevens, zoals de Wet politiegegevens (Wpg), de Wet justiti\u00eble en strafvorderlijke gegevens (Wjsg) en de Wet op het Centraal bureau voor de statistiek (Wet CBS).", - "lawful_basis": "Verwerkingen voor wetenschappelijk en historisch onderzoek, statistische doeleinden en archivering in het algemeen belang worden altijd verenigbaar geacht met het oorspronkelijke verzameldoel. Maar ook als het geen verdere verwerkingen zijn, mogen persoonsgegevens worden verwerkt voor deze doeleinden, mits aan de vereisten in de Verordening wordt voldaan. De Verordening eist dat voor de bescherming van de rechten en vrijheden van betrokkenen passende waarborgen worden getroffen. Die waarborgen moeten er onder andere voor zorgen dat technische en organisatorische maatregelen zijn getroffen om zo min mogelijk persoonsgegevens te verwerken, zoals pseudonimiseren of anonimiseren. ", - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": "n.v.t.", - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": "Nederlands", - "revision_date": null, - "description": null, - "application_url": "https://zoek.officielebekendmakingen.nl/stcrt-2017-48699.html ", - "publiccode": null, - "mprd": "Ja", - "source_data": "Omdat er met meerdere algoritmes wordt gewerkt is dit lastig om in een veld op te sommen. Het CBS maakt gebruik van de BRP, BAG, WOZ, Kadaster.", - "methods_and_models": "Zie eerdere opmerking, hangt af van type analyse", - "monitoring": "Alle onderzoeksvragen worden voorgelegd aan de ethische commissie van het CBS voordat een onderzoeksvraag door een analist in behandeling wordt genomen.", - "human_intervention": "Ja, voordat een analyse-uitkomst openbaar wordt gemaakt, controleert het CBS het inzicht op onthullingsrisico.", - "risks": "Het CBS hoeft in belangrijke mate toezicht op het gehele project en waakt o.a. voor onthullingsrisico's. ", - "performance_standard": "N.v.t., gezien de rol/benutting van algoritmen binnen het project Zicht op Ondermijning.", - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.046042+00:00", - "lars": "83779930", - "owner": "gemeente-den-haag" - }, - { - "name": "Regionaal verkeersmodel: V-MRDH", - "organization": "Gemeente Den Haag", - "department": "Stedelijke Ontwikkeling", - "description_short": "Het V-MRDH is een verkeersmodel in de software Omnitrans (ontwikkelaar is DAT-Mobility, Deventer). Het algoritme berekent de hoeveelheid verplaatsingen (auto, OV en fiets) op basis van inputgegevens zoals netwerken en demografische data. Het model wordt gebruikt, intern bij Den Haag, bij andere gemeenten en bij verkeerskundige adviesbureaus.", - "type": "Op regels gebaseerd", - "category": null, - "website": null, - "status": "Actief", - "goal": "De hoeveelheid verkeer op de weg ten gevolge van een plan wordt berekend. Het plan kan zijn: een nieuwe weg of de bouw van een aantal woningen. Het model berekent de hoeveelheid verkeer op hoofdlijnen., bedoeld om scenario's (varianten) met elkaar te vergelijken. ", - "impact": "De burger krijgt nooit te maken met een directe uitkomst van een berekening met het verkeersmodel.", - "proportionality": "Voor de hele MRDH is er een verkeersmodel om toekomstige situaties door te rekenen. Wanneer in een studie ook rijkswegen zijn betrokken, wordt vaak samengewerkt met RWS omdat RWS modellen heeft voor het verkeer op rijkswegen.", - "decision_making_process": "Een berekening wordt gebruikt om beleid op het gebied van mobiliteit te maken of te onderbouwen (mobiliteit is hier de verplaatsing van mensen en goederen). Het algoritme levert nooit direct een besluit op.", - "documentation": null, - "competent_authority": "Er zijn geen persoonsgegevens.", - "lawful_basis": "Input is noodzakelijk voor gemeentelijk beleid.", - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": "Daar is nooit sprake van. Binnen projecten kunnen mensen discussi\u00ebren over de uitkomsten van het model. De uitkomst van het model wordt gebruikt om een advies te onderbouwen.", - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": "Nederlands", - "revision_date": null, - "description": null, - "application_url": "Verkeersmodel | MRDH Metropoolregio Rotterdam Den Haag.", - "publiccode": null, - "mprd": "Ja", - "source_data": "Aantallen inwoners en arbeidsplaatsen van het CBS. Plannen van alle betrokken wegbeheerders, rijk, gemeenten en provincie. Ook bestaande en toekomstige netwerken zijn input voor de berekeningen. ", - "methods_and_models": "De algoritmes in het model behoren tot de standaard-software van de producent van de software: DAT-Mobility, Deventer. ", - "monitoring": "Resultaten van het model worden altijd geanalyseerd door specialisten.", - "human_intervention": "Resultaten van het model worden altijd geanalyseerd door specialisten.", - "risks": "Resultaten van het model worden altijd geanalyseerd door specialisten.", - "performance_standard": "Geen afspraken en geen monitoring van toepassing.", - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.052331+00:00", - "lars": "58239517", - "owner": "gemeente-den-haag" - }, - { - "name": "Verkeersmodel bereikbaarheidsregie", - "organization": "Gemeente Den Haag", - "department": "Stadsbeheer", - "description_short": "Het is een verkeersmodel om stadsbreed de hinder van activiteiten (bouwwerkzaamheden, wegwerkzaamheden en evenementen) op het netwerk Bereikbaarheidsregie (het Haags hoofd verkeersnetwerk) inzichtelijk te maken, te objectiveren en zo te ondersteunen bij de afstemming en planning van die activiteiten zodat de Haagse Bereikbaarheid zo veel mogelijk geborgd blijft.", - "type": "Op regels gebaseerd", - "category": null, - "website": "https://www.dat.nl/", - "status": "Actief", - "goal": "Het doel van het model is om de impact op de verkeersdoorstroming van een enkele activiteit of de samenhang tussen meerdere activiteiten te zien in een gemodelleerde en geabstraheerde omgeving.", - "impact": "Een burger krijgt niet direct met het algoritme te maken. Als een burger gebruikmaakt van de openbare ruimte als deelnemer aan het verkeer en er zijn omleidingen dan merkt de burger dat het algoritme is gebruikt om te komen tot een zo optimaal mogelijke omleiding met zo min mogelijk overlast. ", - "proportionality": "Ja, maar na een marktconsultatie bleek er niets te bestaan dat aan de vraag voldeed. Dit model is nieuw voor de gemeente Den Haag ontwikkeld door de markt.", - "decision_making_process": "De output van het model wordt gebruikt ter onderbouwing van het afgeven van een positief besluit voor een bouwwerk, wegwerk of evenement met impact op het Haagse hoofd verkeersnetwerk in het Stedelijke BereikbaarheidsOverleg (SBO). Daarmee vormt het input voor het instemmingsbesluit.", - "documentation": null, - "competent_authority": "Er is geen sprake van verwerking van persoonsgegevens.", - "lawful_basis": "n.v.t.", - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": "n.v.t.", - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": "Nederlands", - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": "Nee", - "source_data": "Er is initieel gebruikgemaakt van het V-MRDH model (HB-matrix, routekeuzes en intensiteiten) aangevuld met anonieme data uit de koplussen (nullen en enen) van 50 geregelde kruispunten.", - "methods_and_models": "n.v.t.", - "monitoring": "n.v.t.", - "human_intervention": "Het model wordt door een medewerker gevoed met data waarna het kan gaan rekenen. Het model wordt gebruikt als analyse voor de duiding van verkeersstromen door activiteiten. De output wordt gewogen in relatie tot de gesprekken met initiatiefnemers. ", - "risks": "Er zijn geen specifieke risico's in de zin van privacyaspecten rondom persoonsgegevens. Bias speelt geen rol. ", - "performance_standard": "Er zijn geen specifieke afspraken gemaakt om het algoritme te toetsen. Er is een beheer- en onderhoudscontract met de leverancier afgesproken.", - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.057799+00:00", - "lars": "98936960", - "owner": "gemeente-den-haag" - }, - { - "name": "Dynamische microsimulatiemodellen", - "organization": "Gemeente Den Haag", - "department": "Stadsbeheer", - "description_short": "Het programma geeft een visuele weergave van de verkeersafwikkeling op wegen en kruispunten. De werkelijkheid en mogelijke toekomstige werkelijkheid worden geschetst/gesimuleerd op basis van de input. Met dit computermodel kunnen opties voor weg- en kruispuntsinrichtingen en verkeersregelingen vergeleken worden en helpt het dus bij advies en keuzes.", - "type": "Op regels gebaseerd", - "category": null, - "website": "www.ptvgroup.com", - "status": "Actief", - "goal": "Het is bedoeld als hulpmiddel voor de wegbeheerderstaken om de werkzaamheden adequaat te kunnen uitvoeren, eventueel verbeteren en keuzes te onderbouwen.", - "impact": "De burger merkt niet direct iets van het programma. Uiteindelijk merkt de burger als verkeersdeelnemer iets van de keuzes die de gemeente als wegbeheerder, mede op basis van uitkomsten van simulaties, heeft gemaakt voor de verkeersafwikkeling/ een goede doorstroming. ", - "proportionality": "Dit is het meest gebruikte en beproefde microsimulatiepakket voor verkeersafwikkeling. Er is geen aanleiding om iets anders te gebruiken. ", - "decision_making_process": "Het programma wordt gebruikt als hulpmiddel bij (bestuurlijke) besluitvorming over voorgenomen herinrichting van wegen en/of kruispunten en analyse van de werking van verkeersregelingen voor kruispunten. Er wordt dan gekeken wat de herinrichting en/of het regelprogramma voor consequentie heeft in termen van verkeersafwikkeling.", - "documentation": null, - "competent_authority": "Er is geen sprake van persoonsgegevens, alleen verkeersgegevens, weggegevens en verkeerslichtgegevens.", - "lawful_basis": "N.v.t. De wettelijke basis ligt in een goede uitvoering van de wegenverkeerswet. Het is een hulpprogramma voor het werk van de wegbeheerder.", - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": "nee", - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": "Nederlands", - "revision_date": null, - "description": null, - "application_url": "www.ptvgroup.com", - "publiccode": null, - "mprd": "Nee", - "source_data": "Er wordt gebruikgemaakt van anonieme verkeersdata (aantallen voertuigen, fietsers etc. per uur/etmaal), de indeling van de weg, instellingen van het verkeersregelprogramma.", - "methods_and_models": "zie website www.ptvgroup.com ", - "monitoring": "Via de gebruikersgroepen genoemd in de vorige regel.", - "human_intervention": "De uitkomsten zijn input voor verdere verkeerskundige analyse.", - "risks": "Er zijn geen specifieke risico's in de zin van privacyaspecten rondom persoonsgegevens. Bias speelt geen rol. ", - "performance_standard": "Er zijn gebruikersgroepen van wegbeheerders waarmee periodiek wordt afgestemd door de leverancier om eventuele verbeteringen door te voeren.", - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.064225+00:00", - "lars": "93839192", - "owner": "gemeente-den-haag" - }, - { - "name": "Microsimulatiemodellen geregelde kruispunten", - "organization": "Gemeente Den Haag", - "department": "Stadsbeheer", - "description_short": "COCON\u00a0is het acroniem voor \"COherent CONglomeraat van verkeersregeltechnische software\" en is in de verkeersregeltechnische wereld binnen Nederland het meest gebruikte programma om de volgorde waarin verkeersstromen op kruisingen worden afgewikkeld (en wat wel en niet tegelijk mag) te bepalen. De uitkomst is input voor het voor elk kruispunt te maken verkeersregelprogramma.", - "type": "Op regels gebaseerd", - "category": null, - "website": "https://dtvconsultants.nl/producten-en-diensten/cocon-en-graphium/", - "status": "Actief", - "goal": "Het ontwerpen van fasevolgordes van verkeerslichten.", - "impact": "Als een burger gebruikmaakt van de openbare ruimte als deelnemer aan het verkeer komt men indirect in aanraking met de uitkomsten van COCON-berekeningen voor kruispunten. De burger merkt dit aan de volgordeverdeling en tegelijk of juist niet tegelijk mogen kruisen in de groenfases van verkeerslichten.", - "proportionality": "Er zijn geen alternatieven overwogen. Binnen de verkeerskundige wereld is dit product onomstreden. ", - "decision_making_process": "Er is niet echt sprake van de ondersteuning van een besluitvormingsproces, maar een primaire overheidstaak in relatie tot de verkeersveiligheid namelijk het ontwerp van (veilige) en optimaal functionerende kruispunten.", - "documentation": null, - "competent_authority": "Geen sprake van persoonsgegevens.", - "lawful_basis": "Dit volgt uit de wettelijke taak van de wegbeheerder en de wegenverkeerswet. ", - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": "n.v.t.", - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": "Nederlands", - "revision_date": null, - "description": null, - "application_url": "https://dtvconsultants.nl/producten-en-diensten/cocon-en-graphium/", - "publiccode": null, - "mprd": "Nee", - "source_data": "Er wordt gebruikgemaakt van anonieme data over verkeersintensiteiten in relatie tot hoe een met verkeerslichten geregeld kruispunt het beste kan worden ingericht, rekening houdend met de indeling van de rijstroken, de opstellengten, verdeling van de verkeersbewegingen.", - "methods_and_models": "zie website https://dtvconsultants.nl/producten-en-diensten/cocon-en-graphium/", - "monitoring": "n.v.t.", - "human_intervention": "Ja", - "risks": "Er zijn geen specifieke risico's in de zin van privacyaspecten rondom persoonsgegevens. Bias speelt geen rol. ", - "performance_standard": "Leverancier heeft een gebruikersgroep wegbeheerders en aan de hand van periodieke afstemming voeren ze verbeteringen door.", - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.069994+00:00", - "lars": "64871989", - "owner": "gemeente-den-haag" - }, - { - "name": "Automatische regelsoftware verkeerslichten ", - "organization": "Gemeente Den Haag", - "department": "Stadsbeheer", - "description_short": "TLCGen is een applicatie voor het maken/genereren van uniforme, hoogwaardige en beheerbare verkeersregelprogramma's voor verkeerslichten.", - "type": "Op regels gebaseerd", - "category": null, - "website": "https://www.codingconnected.eu/software/tlcgen/", - "status": "Actief", - "goal": "Het ontwerpen van regelprogramma's voor in verkeerslichten. Dit wordt ontworpen met TLCGen. Het functioneert goed als TLCGen het goede regelprogramma genereert dat voldoet aan de wetten en regels over verkeerslichten. En als het regelprogramma goed afgesteld is voor die specifieke kruising in termen van veilig en vlot.", - "impact": "Als een burger gebruikmaakt van de openbare ruimte als deelnemer aan het verkeer en dan in aanraking komt met het regelprogramma dat met TLCGen gemaakt is. De burger merkt dit aan de optimale afstelling van de groenfases van verkeerslichten.", - "proportionality": "Nee, er zijn geen serieuze alternatieven. Er zijn andere generatoren van verkeersregelprogramma's beschikbaar echter deze leveren minder kwaliteit, meer handwerk op dan TLCGen en dus een groter risico voor de wegbeheerder en een lagere beheerbaarheid.", - "decision_making_process": "Er is niet echt sprake van de ondersteuning van een besluitvormingsproces. Het is een primaire overheidstaak van de gemeente als wegbeheerder om het verkeer veilig te ordenen en vlot te geleiden. ", - "documentation": null, - "competent_authority": "Er is geen sprake van verwerking van persoonsgegevens. ", - "lawful_basis": "Dit volgt uit de wettelijke taak van de wegbeheerder en de wegenverkeerswet. ", - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": "nee", - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": "Nederlands", - "revision_date": null, - "description": null, - "application_url": "https://www.codingconnected.eu/software/tlcgen/", - "publiccode": null, - "mprd": "Nee", - "source_data": "Dit zijn data gerelateerd aan de fysieke indeling van kruispunten en de verkeerskeuzes die daaruit volgen. De fysieke eigenschappen van het kruispunt en de volgordeverdeling van verkeerstromen die wenselijk zijn voor de veilige en vlotte verkeersafwikkeling.", - "methods_and_models": "zie website https://www.codingconnected.eu/software/tlcgen/", - "monitoring": "n.v.t.", - "human_intervention": "Menselijke tussenkomst is puur gericht om de input te leveren voor het regelprogramma.", - "risks": "Er zijn geen specifieke risico's in de zin van privacyaspecten rondom persoonsgegevens. Bias speelt geen rol. ", - "performance_standard": "TLCGen is gecertificeerd door de Statistic Committee van Talking Traffic (landelijk samenwerkingsverband). Daarmee voldoen we aan de hoogste standaarden.", - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.075311+00:00", - "lars": "48633752", - "owner": "gemeente-den-haag" - }, - { - "name": "Voorspellen en voorkomen verkeersongevallen", - "organization": "Gemeente Den Haag", - "department": "Stedelijke Ontwikkeling", - "description_short": "Voorspelmodel dat op basis van een brede dataset met wegkenmerken en ongevallen risicoscores geeft op verkeersongevallen.", - "type": "Zelflerend", - "category": null, - "website": null, - "status": "In ontwikkeling", - "goal": "Het doel van het model is tweeledig. In de eerste plaats het ontwikkelen van effectief verkeersveiligheidsbeleid. Daarnaast kan het model worden ingezet om in concrete projecten twee of meer ontwerpen met elkaar te vergelijken op de score van verkeersveiligheid.", - "impact": "Specifiek voor verkeerskundigen, burgers zien uiteindelijk aanpassingen aan de weg, minder ongevallen (is doel).", - "proportionality": "Destijds was dit het enige model dat correlaties onderzoekt tussen ongevalcijfers en kenmerken van de weg, het kruispunt of de omgeving. ", - "decision_making_process": "Het model is een hulpmiddel voor het prioriteren van verkeersveiligheidsbeleid. Er is dus geen sprake van geautomatiseerde besluitvorming.", - "documentation": null, - "competent_authority": "Er is geen sprake van werken met persoonsgegevens. ", - "lawful_basis": "Noodzakelijk voor gemeentelijk beleid.", - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": "Het algoritme zoekt een verband tussen objectief vast te stellen variabelen. Het gaat om de correlatie van geregistreerde ongevallen en objectief waarneembare data van de weg of de omgeving. De gebruiker besluit hier wel of geen consequentie aan te verbinden. Daarom is er geen sprake van een mogelijkheid om hier bezwaar tegen te maken. ", - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": "Nederlands", - "revision_date": null, - "description": null, - "application_url": "www.ongevalrisico.nl\nhttps://docs.google.com/presentation/d/1_Kt3_mMHhjH-KZgKJxmmqlf9rlRdJr9mgaUUBcGtBDU/edit?authuser=1#slide=id.p4", - "publiccode": null, - "mprd": "Ja", - "source_data": "www.ongevalrisico.nl\nhttps://docs.google.com/presentation/d/1_Kt3_mMHhjH-KZgKJxmmqlf9rlRdJr9mgaUUBcGtBDU/edit?authuser=1#slide=id.p4 O.a. BGT, NWB en BRON", - "methods_and_models": "Algoritme is XGBoost. Validatie: AUC, ROC, confusion matrix, subjectieve meldingen van burgers over verkeersveiligheid.", - "monitoring": "Door de expert.", - "human_intervention": "Ja, adviserende uitkomsten voor wegexperts. Modeluitkomsten worden nooit 1 op 1 overgenomen.", - "risks": "Er wordt uitdrukkelijk geen data gekoppeld die is te herleiden naar persoonlijk niveau. De uitkomsten worden door een expert beoordeeld voor gebruik.", - "performance_standard": "Hier zijn geen afspraken voor gemaakt.", - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.081003+00:00", - "lars": "56214518", - "owner": "gemeente-den-haag" - }, - { - "name": "PDF naar 3D-objecten (Vector-data)", - "organization": "Gemeente Den Haag", - "department": "Publiekszaken", - "description_short": "Uit diverse soorten tekeningen gegevens over gebouwen zoals oppervlakte/grootte, type, indeling, geometrie (vorm en ligging) herleiden voor gebruik in (basis)registraties. De status van PDF2GIS is 'in ontwikkeling'. PDF2GIS bevindt zich in de testfase van fase 1 appartementstekening (van 3 fasen).", - "type": "De algoritmen zijn zowel op regels gebaseerd als t.z.t. zelflerend. Er wordt gebruik gemaakt van bestaande algoritmen. Die worden zo mogelijk verbeterd. Correcties door de gebruiker van PDF2GIS voeden in de toekomst het zelflerend vermogen, bijv. in het tekenen van lijnen en lezen van tekstlabels. Voor fase 2 bouwtekeningen wordt voor het zelflerende algoritme traindata opgebouwd door zelf bouwtekeningen te annoteren. ", - "category": null, - "website": "De code wordt niet openbaar gepubliceerd. De applicatie PDF2GIS wordt in opdracht van de gemeente Den Haag ontwikkeld door Coders Co. De businesscase en het intellectueel eigendom liggen bij de leverancier. PDF2GIS is ge\u00efnitieerd vanuit project Startup in Residence.", - "status": "In ontwikkeling", - "goal": "De applicatie PDF2GIS is bedoeld om gegevens over gebouwen te herleiden uit splitsingstekeningen (fase 1), bouwtekeningen (fase 2) en plattegronden van makelaars (fase 3). Het betreft het in samenhang inwinnen van objecten, relaties en attributen van objecten zoals onder meer pand, verblijfsobject, gebouwzone, bouwlaag, ruimte en het appartementsrecht. Het in samenhang inwinnen komt de kwaliteit (o.a. volledigheid, consistentie en nauwkeurigheid) ten goede. Een hogere kwaliteit vermindert vragen en afstemmingsproblemen tussen bijv. (basis)registraties. De applicatie komt uiteindelijk in de plaats van het meten in een papieren tekening of in een digitale tekening met bijv. Bluebeam (waarbij bestaande lijnen worden overgetekend). Een gegevensbeheerder of geo-informatiebeheerder bedient de applicatie en kan in elk van 13 stappen ingrijpen om correcties aan te brengen. De gegevens worden gebruikt in (basis)registraties zoals WOZ, BAG en in de toekomst wellicht SOR (Samenhangende objectenregistratie). Het programma functioneert goed wanneer de kwaliteit van de gegevens zich kan meten aan handmatig ingewonnen gegevens.", - "impact": "Het effect op het dagelijks leven van burgers en bedrijven is dat de applicatie PDF2GIS gegevens oplevert over woningen en bedrijfsgebouwen. Dit soort gegevens, zoals grootte/oppervlakte en geometrie, wordt in de basisregistratie BAG vastgelegd en in de (basis)registratie WOZ in het taxatieproces gebruikt ten behoeve van het nemen van de WOZ-beschikkingen. Een burger of bedrijf kan de gegevens zelf zien via de bagviewer.kadaster.nl of het woz-waardeloket.nl. Voor een direct belanghebbende eigenaar/gebruiker van een gebouw kunnen gegevens in detail getoond worden op een WOZ-taxatieverslag. Wellicht worden gegevens ook opgenomen in een Twin City nederlandin3d.nl/denhaag en t.z.t. in de SOR (samenhangende objectenregistratie).", - "proportionality": "Er bestaat geen alternatief voor de algoritmen van PDF2GIS. PDF2GIS wordt juist zelf gezien als alternatief voor een traditionele manier van inwinnen van gebouwengegevens. Bij een traditionele manier van werken maken individuele, gemeentelijke medewerkers elk op hun eigen wijze een interpretatie van lijnen en tekst om daaruit gebouwgegevens te herleiden. Hierbij worden verhoudingsgewijze minder consequente interpretaties gedaan en verhoudingsgewijze meer fouten gemaakt, bijv. in het kalibreren. De kracht van PDF2GIS is het in samenhang kunnen inwinnen van gegevens die nu nog in verschillende basisregistraties afzonderlijk worden bijgehouden. De huidige praktijk is dat gegevens in vier verschillende registraties (WOZ, BAG, BGT, 3D-stadsmodel) niet gelijktijdig en vanuit verschillende bronnen worden bijgehouden. Dit is verhoudingsgewijze duur (verschillen terugmelden e.d.) en de kwaliteit is verhoudingsgewijze laag (door o.a. verschillen in tijd, nauwkeurigheid, precisie enz.). Er bestaan geen andere programma's met algoritmen die gebouwengegevens in samenhang kunnen inwinnen en die daarbij gebruik maken en daarbij gebruikmaken van bestaande, bekende gegevens over gebouwen, zoals in het stelsel van basisregistraties of de WOZ-registratie.", - "decision_making_process": "PDF2GIS ondersteunt geen besluitvormingsproces. PDF2GIS wordt beoogd een rol te spelen in primaire processen waarin gebouwengegevens worden toegepast. O.a. het beheren van basisregistraties (o.a. BAG over adressen en gebouwen) en de uitvoering van de Wet WOZ (waardering onroerende zaken). Indirect spelen de gegevens uit PDF2GIS een rol in de heffing van belastingen door overheden (via de grootte en de WOZ-waarde die mede op de oppervlakte/grootte gebaseerd is).", - "documentation": null, - "competent_authority": "Er is geen sprake van de verwerking van persoonsgegevens.", - "lawful_basis": "Op grond van o.a. Wet BAG (over het beheren adressen en gebouwen-gegevens) wordt de grootte van het verblijfsobject gemeten, op grond van de Wet WOZ (over de waardering van onroerende zaken) de grootte van gebouwzones op bouwlagen binnen het WOZ-object. WOZ maakt gebruik van BAG en in Den Haag is WOZ ook nog eens gedelegeerd bronhouder voor oppervlaktegegevens in de BAG (WOZ meet voor BAG om gemeentebreed voor elk gebouw dezelfde oppervlakte-gegevens te hanteren).", - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": "Er kan 'bezwaar' gemaakt worden tegen de uitkomst van het proces waarin het algoritme PDF2GIS wordt gebruikt. Websites zoals bagviewer.kadaster.nl en wozwaardeloket.nl tonen enkele basale basisgegevens van gebouwen. Bij de BAG kan op grond van gerede twijfel altijd een terugmelding worden ingediend. Bij de WOZ kan de belanghebbende (eigenaar/gebruiker) van een gebouw na ontvangen van een WOZ-beschikking en een taxatieverslag gemotiveerd een bezwaar indienen (een vraag stellen kan altijd) en daarbij wijzen op onjuiste gegevens. In het kader van het bezwaar (of als vraag) wordt dit beoordeeld en indien nodig verbeterd.", - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": "Nederlands", - "revision_date": null, - "description": null, - "application_url": "Documentatie van relevante algoritmen is hier te vinden: https://paperswithcode.com/paper/east-an-efficient-and-accurate-scene-tekst; https://tesseract-ocr.github.io/tessdoc/Home.html; https://docs.opencv.org/4.5.3/d6/d10/tutorial_py_houghlines.html", - "publiccode": null, - "mprd": "Ja", - "source_data": "Er wordt in het algoritme PDF2GIS gebruikgemaakt van gegevens in basisregistraties. Dit betreft de WOZ (waardering onroerende zaken), BAG (adressen en gebouwen), BGT (grootschalige topografie) en BRK (kadaster) als gegevensbron. Het resultaat van PDF2GIS wordt idealiter verwerkt naar (basis)registraties WOZ en BAG, in de toekomst naar de SOR (samenhangende objectenregistratie). Het algoritme verwerkt een tekening (appartementstekening fase 1, bouwtekening in fase 2 en plattegrond van makelaar in fase 3) tezamen met bekende gegevens uit basisregistraties. De bewerking leidt zoveel mogelijk tot gegevens over gebouwen. Dit zijn de objecten, relaties en attributen zoals genoemd in informatiemodellen van BAG (IMBAG), WOZ (IMWOZ) en de SOR.", - "methods_and_models": "PDF2GIS maakt onder meer gebruik van algoritmen zoals tekst-detectie (EAST algoritme), tekstherkenning (Tesseract OCR), lijn-herkenning (Hough Line Transform), polygonen-vormende algoritmen alsmede algoritmen voor het georefereren (rubber-sheeting e.d.).", - "monitoring": "De risico's worden gemonitord bij elke tekening die wordt verwerkt. Beoordeeld wordt of de tekening overeenkomt met de werkelijkheid. En de uitkomst van het algoritme wordt afgezet tegen bekende gegevens van het gebouw op tekening.", - "human_intervention": "Ja, zeker is er sprake van tussenkomst van de mens in de zin van gebruiker van het algoritme PDF2GIS. Het destilleren van gebouwengegevens uit gescande (soms oude, minder goed leesbare) tekeningen is (nog) te complex om 'blind' uitsluitend aan een algoritme over te kunnen laten. Het verwerken van een tekening wordt in fase 1 in 13 stappen uitgevoerd. En in elke stap wordt de gebruiker geacht correcties aan te brengen als dat nodig is. De gebruiker moet het resultaat ook voorlopig nog zelf verwerken in evt. afnemende (basis)registraties.", - "risks": "Aan het werken met de algoritmen van PDF2GIS zijn geen risico's verbonden. De grootste valkuil is het werken met een tekening die niet een actuele situatie weergeeft. De medewerker die met PDF2GIS werkt let hierop door beeldmateriaal te bestuderen zoals luchtfoto's. Bovendien vormt de output van PDF2GIS op termijn de input van een keten waarin gebouwgegevens gevalideerd en gedistribueerd worden. Van bias, in die zin dat het algoritme een systematisch verschil in representativiteit kan opleveren ('discrimineert'), is geen sprake. Hooguit kan het zijn dat algoritmen beter werken op tekeningen van veel voorkomende gebouwen (appartementen) en minder goed op unieke gebouwen, waardoor de gebruiker vaker handmatige correcties moet uitvoeren.", - "performance_standard": "De prestatie van de algoritmen in PDF2GIS wordt beoordeeld op basis van vakmanschap van de gebruikers van de applicatie. De gebruiker van de applicatie PDF2GIS toetst de output van PDF2GIS op basis van vakmanschap en aan de hand van reeds bekende gegevens van de gebouwen die op tekening staan. Voor de grootte/oppervlakte van objecten zijn meetinstructies op basis van NEN 2580 hiervoor een leidraad. Voor nauwkeurigheid van oppervlaktegegevens zijn criteria geformuleerd in BAG- en WOZ-regelgeving leidend. In beginsel worden tekeningen ingepast op gebouwen die veelal met terrestrische landmeettechnieken zijn ingemeten met hoge nauwkeurigheid (centimeters nauwkeurigheid).", - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.087049+00:00", - "lars": "56889459", - "owner": "gemeente-den-haag" - }, - { - "name": "Tactisch capaciteitsoptimalisatiemodel", - "organization": "Gemeente Den Haag", - "department": "Onderwijs, Cultuur en Welzijn", - "description_short": "Het algoritme berekent hoeveel medewerkers er nodig zijn om verzuimmeldingen op te pakken. Binnen het algoritme kunnen verschillende doelstellingen worden gedefinieerd , om de benodigde capaciteit te kunnen bepalen. ", - "type": "Op regels gebaseerd. (Mixed Lineair Programming Model). ", - "category": null, - "website": "Er is (nog) geen openbare publicatie van het algoritme. ", - "status": "Actief", - "goal": "Het algoritme wordt gebruikt om te berekenen a) hoeveel medewerkers er nodig zijn om de werkzaamheden uit te kunnen voeren, ter ondersteuning van de werkprocessen en b) introduceert een innovatieve technologie (beslsimodellen) , met name bedoelt om te kunnen evalueren of beslismodellen modellen ingezet kunnen worden op dagelijks (operationeel) niveau. ", - "impact": "Bij een goede interpretatie van de modelresultaten kan er een keuze gemaakt worden voor een verdeelstrategie van de verzuimmeldingen. Mogelijke impact: a) kortere doorlooptijden, b) lagere werkvoorraden , c) rationalisering van prioriteiten om verzuimmeldingen op te pakken, d) efficientere inzet FTE's", - "proportionality": "Het alternatief voor het gebruik van een algoritme is een handmatige berekening. Bij een handmatige berekening kan een optimale toewijzing niet bepaald kan worden ( er zijn teveel mogelijkheden. Een wiskundig model kan wel de optimale oplossing vinden). Daarnaast kan een handmatige berekening tot fouten leiden en vergt het erg veel tijd.", - "decision_making_process": "Het model dient op dit moment met name als een Proof of Concept om te kunnen beslissen of een operationeel planningmodel geimplementeerd kan worden ( zie Operationeel capaciteitsoptimalisatiemodel). ", - "documentation": null, - "competent_authority": "Niet relevant; de gebruikte gegevens zijnniet herleidbaar naar individuele personen.", - "lawful_basis": "Leerplichtwet.", - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": "Nee, algoritme slechts voor intern gebruik.", - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": "Nederlands", - "revision_date": null, - "description": null, - "application_url": "Algoritmiek is gedocumenteerd, maar niet openbaar gemaakt, omdat het model slechts voor intern gebruik is bedoeld. ", - "publiccode": null, - "mprd": "Nee", - "source_data": "Geanonimiseerde gegevens over casemanagers (id en beschikbaarheid), type en aantal verzuimmeldingen", - "methods_and_models": "Mixed Integer Lineair Programeren", - "monitoring": "Op dit moment worden de uitkomsten van het model nog niet gebruikt voor de besluitvorming.", - "human_intervention": "Er vindt geen geautomatiseerde besluitvorming plaats. Het model wordt slechts gebruikt voor analyses voor intern gebruik, waarbij er geen koppeling met verschillende bronnen plaatsvindt.", - "risks": "Geen risco. De model uitkomsten zijn zogenaamde adviezen, die gebaseerd zijn op veronderstellingen waar het model mee wordt gevoed. Het is van belang om de veronderstellingen goed te begrijpen, zodat de modeluitkomsten goed geinterpreteerd kunnen worden. Het model is beslissingsondersteunend en niet beslissingsnemend. ", - "performance_standard": "Hoogte werkvoorraad, gemiddelde doorlooptijd verzuimmelding, aantal FTE's", - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.093210+00:00", - "lars": "42584722", - "owner": "gemeente-den-haag" - }, - { - "name": "Bevolkingsprognosemodel", - "organization": "Gemeente Den Haag", - "department": "Stedelijke Ontwikkeling", - "description_short": "De bevolkingsprognose geeft Inzicht in de samenstelling, spreiding en de toekomstige omvang van de bevolking.", - "type": "Op regels gebaseerd", - "category": null, - "website": null, - "status": "Actief", - "goal": "Inzicht te hebben in de (mogelijke) toekomstige ontwikkeling van de Haagse bevolking naar leeftijd.", - "impact": "Het model heeft geen directe invloed op het dagelijks leven van burgers. ", - "proportionality": "GBPRO is een model dat gemaakt is door en voor Nederlandse gemeenten. Er zijn geen vergelijkbare alternatieven beschikbaar waarbij je op lokaal (gemeente) niveau de situatie qua sterfte, geboorte en migratie zo goed mogelijk kan inschatten.", - "decision_making_process": "De uitkomsten zijn input voor gemeentelijke beleidsmakers zoals bv op het gebied van ruimtelijke ordening, stedelijke ontwikkeling, sociale ontwikkeling, arbeidsmarkt, volkshuisvesting, economie, zorg en welzijn en onderwijs.", - "documentation": null, - "competent_authority": "Niet relevant; de gebruikte gegevens zijn geaggregeerd en niet herleidbaar naar individuele personen.", - "lawful_basis": "Input is noodzakelijk voor gemeentelijk beleid.", - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": "Geen persoonsgegevens dus niet van toepassing.", - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": "Nederlands", - "revision_date": null, - "description": null, - "application_url": "Opvraagbaar.", - "publiccode": null, - "mprd": "Nee", - "source_data": "Geaggregeerde gegevens van minimaal 5 jaar voor: Basisbevolking naar leeftijd en geslacht\nGeboorten naar leeftijd moeder\nSterfte naar leeftijd en geslacht\nVertrek Binnenland naar leeftijd en geslacht\nVertrek Buitenland naar leeftijd en geslacht\nVestiging Binnenland naar leeftijd en geslacht\nVestiging Buitenland naar leeftijd en geslacht", - "methods_and_models": "Op basis van de aanname van de (gecorrigeerde) kansen wordt de prognose voor het eerste jaar\nper leeftijd en geslacht opgesteld.\nDit gebeurt door eerst de correctie voor het binnenlands vertrek te bepalen, waarna het totaal\nvertrek binnenlands en buitenlands bepaald wordt. Om vervolgens het aantal geboorten te kunnen\nbepalen worden eerst vestiging, vertrek, zowel binnenlands als buitenlands berekend en de sterfte\nberekend, waarna het totaal aantal geboorten kan worden berekend. Als het aantal geboorten is\nberekend worden deze nuljarig gemaakt en verdeeld over de geslachten. In het proces wordt\ndaarna weer het vertrek bepaald, de instroom en de sterfte. De laatste stap is de beginbevolking\nnaar leeftijd en geslacht plus de vestiging naar leeftijd en geslacht min het vertrek naar leeftijd en\ngeslacht min de sterfte naar leeftijd en geslacht. Deze laatste cyclus levert de eindbevolking van\nhet eerste prognosejaar. Deze bevolking is de startbevolking van het tweede prognosejaar. Op\ndeze wijze wordt de prognose het ingesteld aantal jaren vooruit berekend. Met behulp van de\ncorrectiematrix is het mogelijk om de prognose met een gewijzigde aanname opnieuw door te\nrekenen.", - "monitoring": "Resultaten van het model worden altijd geanalyseerd door specialisten.", - "human_intervention": "Ja, opgeven van parameters zoals toekomstige vruchtbaarheid, sterftekansen, immigratie en emigratie, woningvoorraad. De uitkomsten van het model zijn input voor verwerking door diverse beleidsvelden, via menselijke tussenkomst.", - "risks": "Resultaten van het model worden altijd geanalyseerd door specialisten.", - "performance_standard": "Jaarlijks worden de uitkomsten van de prognose vergeleken met de realisatie.", - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.100137+00:00", - "lars": "91458197", - "owner": "gemeente-den-haag" - }, - { - "name": "Algoritme datakwaliteit", - "organization": "Gemeente Den Haag", - "department": "Stedelijke Ontwikkeling", - "description_short": "Quality-Bot (Q-Bot) ontdekt zelfstandig bestaande en nieuwe patronen in de data. Deze gebruiken we als Quick Scan om de datakwaliteit in te schatten en mogelijke fouten te ontdekken. Vervolgens kunnen goede patronen geadopteerd worden als datakwaliteitsregels om de datakwaliteit continu te monitoren. ", - "type": "Zelflerend", - "category": null, - "website": "n.v.t., proprietary code", - "status": "Actief", - "goal": "Doel van het algoritme is om patronen om mogelijke (structurele) fouten in data te ontdekken om deze te vertalen naar kwaliteitsregels. Het is bedoeld om de bronhouder te voeden met nieuwe inzichten over de data kwaliteit. Het is niet bedoeld om zelfstandig data te corrigeren.", - "impact": "Het effect is indirect voor de burger. Het effect is direct voor de medewerkers van Den Haag die ondersteund worden om de kwaliteit van de dienstverlening naar de burger te verbeteren. De kwaliteit van de registratie wordt beter en daarmee ook de kwaliteit van de dienstverlening.", - "proportionality": "Ja, Q-bot brengt focus aan bij het verbeteren van datakwaliteit. Het helpt dataspecialisten gericht fouten of bijzonderheden in data op te sporen en op te lossen.", - "decision_making_process": "Draagt bij aan het data controle en correctie proces. De rol van het algoritme is om suggesties te doen voor verbetering met als doel om de data beter kloppend te maken. Beleid en besluitvorming blijven bij de bronhouder liggen.", - "documentation": null, - "competent_authority": "Er worden geen persoonsgegevens verwerkt.", - "lawful_basis": "Geen, er worden geen persoonsgegevens verwerkt.", - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": "Ja door de medewerkers erfpacht, en dat is juist de bedoeling.", - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": "Nederlands", - "revision_date": null, - "description": null, - "application_url": "n.v.t., Phinion biedt dienst aan als een SaaS.", - "publiccode": null, - "mprd": "Nee", - "source_data": "Erfpacht contracten, eigendommen en kadasterpercelen. Deze zijn aan elkaar verbonden.", - "methods_and_models": "Zelfgebouwd algoritme dat gebruik maakt van verschillende, bestaande machine learning algoritmes. Diverse bestaande algoritmes worden toegepast op de data en resultaten hieruit worden verzameld. Vervolgens selecteert het eigen algoritme welke patronen relevant en sterk zijn.", - "monitoring": "Risico's worden beheerst door middel van evaluatie van medewerkers.", - "human_intervention": "Ja, dit is de kern van de applicatie.", - "risks": "Beheersing van de risico's ligt bij de gemeente. De risico's zijn beperkt omdat het algoritme geen zelfstandige beslissingen neemt. De bias is uitsluitend technisch van aard en heeft geen impact op de besluitvorming en de burger.", - "performance_standard": "Prestatie gebeurt via gebruikersevaluatie. De medewerkers bepalen welke patronen ze willen gebruiken en hoe goed deze zijn.", - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.105792+00:00", - "lars": "67582219", - "owner": "gemeente-den-haag" - }, - { - "name": "Herkenning bijplaatsing ORAC's", - "organization": "Gemeente Den Haag", - "department": "Stadsbeheer", - "description_short": "Digitaal scannen en categoriseren van types bijplaatsingen bij Orac\u2019s.", - "type": "Zelflerend", - "category": null, - "website": null, - "status": "Gestopt", - "goal": "De technische ontwikkeling inzake beeldherkenning uitbaten in het operationeel proces door gebruik te maken van de scanauto\u2019s van parkeerhandhaving. Beeldherkenning kan een goede toevoeging zijn aan de verschillende manieren waarop bijplaatsingen worden gesignaleerd, aangezien scanauto\u2019s nu ook al door de stad rijden. Het doel is het versterken van de MOR-keten en opvolging te versnellen. Reductie op herhaalmeldingen, dubbelmeldingen, handmatige handelingen en de opvolgtijd van opruimen is -naast de dienstverlening aan de burger- een significante verbetering van de bedrijfsvoering voor de ketenpartners. Met toepassing van scantechnologie wordt beoogd om met -uitbreiding van- bestaande middelen de meldingenketen extra te voeden. De opruiming van afval en de handhaving erop kunnen mogelijk nog sneller worden opgevolgd. ", - "impact": "\u2022 Bijplaatsingen worden sneller gedetecteerd en opgeruimd (schone stad);\n\u2022 De melder wordt sneller ge\u00efnformeerd (betere dienstverlening), wanneer een melding tevens m.b.v. de scantechnologie wordt gedetecteerd.", - "proportionality": "Ja, er zijn verschillende initiatieven om de overlast van afval te bestrijden. Dit project is een aanvulling in de aanpak en geen alternatief.", - "decision_making_process": "De raad nam op 20 februari 2020 een motie aan waarin de raad het college oproept een onderzoek uit te voeren naar de inzet van scanauto\u2019s (RIS 304747), uit dit onderzoek bleek de technologie voor handen. \nHet college wilde ook onderzoeken of de data verkregen door de scantechnologie ge\u00efntegreerd kunnen worden met meldingen uit het meldsysteem (zodat ze samen \u00e9\u00e9n informatiebron vormen voor de planning van de operatie op straat) en/of de data gebruikt kunnen worden voor informatiegestuurd werken in de capaciteitsplanning en de beleidsmatige aanpak van bijplaatsingen. Het onderzoek is uitgevoerd en heeft uitgewezen dat koppeling van gegevens te realiseren is. ", - "documentation": null, - "competent_authority": "Er worden geen persoonsgegevens verwerkt.", - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": "n.v.t.", - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": "Nederlands", - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": "Nee", - "source_data": "Beeldopnames van orac's.", - "methods_and_models": null, - "monitoring": "n.v.t.", - "human_intervention": "Een deskforce monitort de beeldherkenning met name om het zelflerend effect van de toegepaste kunstmatige intelligentie te bevorderen op automatische toekenning aan de juiste afvalcategorie en de opvolging van de informatievoorziening naar de betrokken ketenpartners.", - "risks": "Er zijn risico's m.b.t. opslag beelden, deze zijn nog niet in kaart gebracht.", - "performance_standard": "n.v.t.", - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.111557+00:00", - "lars": "44714491", - "owner": "gemeente-den-haag" - }, - { - "name": "Smartcity/ geluidsherkenning", - "organization": "Gemeente Den Haag", - "department": "Bedrijfsvoering", - "description_short": "Algoritme dat op basis van spectrogrammen detecteert welk geluid in het spectrogram te zien is. In ontwikkeling, nog niet actief, er wordt nog geen data gedeeld. ", - "type": "Op regels gebaseerd", - "category": null, - "website": "De Cyrb-sensoren zijn toegevoegd aan onderstaande kaart.\nhttps://ddh.maps.arcgis.com/apps/webappviewer/index.html?id=8531785e9a8c4450be8839385003f1bc", - "status": "In productie", - "goal": "Het algoritme is ontwikkeld om geluiden te herkennen. In de huidige toepassing wordt voor geluiden die boven een bepaald decibelniveau liggen vastgesteld wat de aard van het luide geluid was. Dit geeft inzicht in het soort geluiden dat overlast geeft. Het algoritme is bedoeld om een globaal beeld te krijgen waar, wanneer er wat voor soorten geluidsoverlast aanwezig zijn zodat daar verder onderzoek naar gedaan kan worden. De uitkomsten van het algoritme zijn niet bedoeld als grond voor directe besluiten of acties zonder verificatie van de uitkomsten.", - "impact": "Het effect van de uitkomst van het algoritme: Door een beter inzicht in de oorzaak van geluidsoverlast die wordt ervaren door burgers, kan de gemeente haar taak in het handhaven van een prettige comfortabele buitenruimte beter uitvoeren. Naast het kunnen vaststellen van het type geluid (geluidherkenning) werd in een testopstelling ook het geluidniveau (decibel) gemeten. Op dit moment zijn er geen burgers die in contact komen met het algoritme. Twee bewoners van de omgeving waar dit algoritme is getest zijn tijdens de duur van de test betrokken geweest om te onderzoeken of de beoogde concept toepassing werkt. Zij hebben middels een dashboard inzicht gekregen in de decibelniveau\u2019s die gemeten worden in de buitenruimte (nb: het algoritme zelf meet geen decibels). Bij deze twee bewoners is een sensor aan hun gevel opgehangen om te kunnen verifi\u00ebren wat de geluidsniveau\u2019s bij hun woning zijn. Naast deze twee intensief betrokken bewoners is tijdens de zomer van 2020 een groter evenement georganiseerd om bezoekers en bewoners van en aan de boulevard te informeren, tijdens het Smart @Sea festival. Via publicaties in de (lokale) kranten, op websites van de gemeente Den Haag en Provincie Zuid Holland worden bewoners ge\u00efnformeerd over de diverse testen die worden uitgevoerd in het kader van het Living Lab Scheveningen programma. Deze test om inzicht te krijgen in geluidsoverlast en geluidsbeleving valt ook binnen dat programma. https://www.denhaag.nl/nl/in-de-stad/wonen-en-bouwen/ontwikkelingen-in-de-stad/ontwikkelingen-scheveningen-kust/nieuwe-uitvindingen-in-living-lab-scheveningen.htm", - "proportionality": "Er is geen alternatief voor het geluidsherkenningsalgoritme. Het algoritme is een toevoeging op het meten van geluidsniveau\u2019s. ", - "decision_making_process": "Het algoritme wordt niet gebruikt voor besluitvorming. Het algoritme bepaalt uitsluitend welk geluid zichtbaar is in een spectrogram.", - "documentation": null, - "competent_authority": "De gemeente Den Haag is de Verwerkingsverantwoordelijke, Cyrb de verwerker. Er is geen verstrekker of ontvanger.", - "lawful_basis": "Er is geen wettelijke grondslag gekozen. Zo lang het systeem nog niet werkt, is het ook niet nodig om de DPIA uit 2019 bij te werken. ", - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": "Er is geen formele bezwaarprocedure. Het algoritme herkent geluiden in de openbare ruimte. Op basis van het algoritme worden geen besluiten genomen waar individuen mee tekort kunnen worden gedaan. Mochten burgers onverhoopt bezwaar willen maken dan kan dit door het bezwaar kenbaar te maken via info@cyrb.nl.", - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": "Nederlands", - "revision_date": null, - "description": null, - "application_url": "Niet beschikbaar", - "publiccode": null, - "mprd": "Nee", - "source_data": "Het algoritme verwerkt uitsluitend spectrogrammen die weer zijn gegenereerd op basis van zelf ingewonnen audiobestanden.", - "methods_and_models": "Bij het evalueren van het model wordt de confusion matrix gebruikt en de categorical-crossentropy als metric. ", - "monitoring": null, - "human_intervention": "Nee", - "risks": "Het algoritme is getraind op openbare datasets van vergelijkbare geluiden. Omdat deze niet altijd hetzelfde klinken en dezelfde karakteristieken hebben (en aard) als de geluiden die op locatie worden opgevangen zou het algoritme fouten kunnen maken in de geluidsherkenning. Omdat het algoritme alleen ter beeldvorming dient levert dit niet direct risico's op voor de betrokken burgers en ondernemers. Het risico op uitlekken van data (opgenomen geluiden) is ondervangen door het geluid niet op het apparaat op te slaan maar direct de geluidsherkenning op het apparaat uit te voeren.", - "performance_standard": "Er zijn geen afspraken vastgelegd om de kwaliteit van de geluidsherkenning te verifi\u00ebren. Het algoritme geeft zelf overigens ook aan met welke mate van zekerheid een geluid is herkend.", - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.119050+00:00", - "lars": "32429839", - "owner": "gemeente-den-haag" - }, - { - "name": "Uitrekenen WOZ-waarde", - "organization": "Gemeente Den Haag", - "department": "Publiekszaken", - "description_short": "Het bepalen en fiatteren van de WOZ-waarde op basis van taxatiemodellen en het opstellen van een taxatieverslag. De status van 4Woz 2.0 is in productie. In de gemeente Den Haag worden in 2022 voor het eerst taxatiewaarden bepaald met 4Woz. Dit taxatieproces wordt momenteel (november 2021) ontworpen. Nu gebeurt het taxeren nog met vergelijkbare taxatiemodellen binnen IBS (Integraal Belasting Systeem), dat door de gemeente Den Haag zelf is gebouwd.", - "type": "De algoritmen van de huidig te implementeren taxatiemodellen van 4Woz zijn volledig op regels gebaseerd. Een toekomstig in gebruik te nemen taxatiemodel binnen 4Woz is gebaseerd op machine learning.", - "category": null, - "website": "De code wordt niet openbaar gepubliceerd. De applicatie 4Woz is een standaard WOZ-taxatiesysteem van het bedrijf 4Value, dat ook door andere gemeenten in Nederland wordt gebruikt.", - "status": "Actief", - "goal": "De applicatie 4Woz ondersteunt in het taxatieproces ten behoeve van de uitvoering van de wet WOZ. 4Woz ondersteunt het beheren van objectkenmerken, het analyseren van marktgegevens, het bepalen van taxatiewaarden, het controleren en fiatteren van de taxatiewaarden tot (in IBS) te beschikken WOZ-waarden en het opstellen van het taxatieverslag als onderbouwing van de WOZ-waarde. De algoritmen spelen met name een rol bij het bepalen van de taxatiewaarden en het opstellen van het taxatieverslag omdat hieraan complexe berekeningen en vergelijkingen ten grondslag liggen. Het algoritme voor het taxeren functioneert goed wanneer het waardeniveau correct is, de onderlinge waardeverhoudingen goed zijn en er een aansluiting is van de getaxeerde waarden op de geanalyseerde marktgegevens. Het algoritme voor het opstellen van het taxatieverslag werkt goed als taxatieverslagen de getaxeerde waarde aannemelijk maken, bijv. door de presentatie van alle objectkenmerken van het object zelf, het vermelden van de eigen marktgegevens en (bij woningen) de verwijzing naar drie vergelijkbare verkochte woningen met een WOZ-waarde.", - "impact": "Het effect op het dagelijks leven van burgers en bedrijven is dat de applicatie 4Woz de gemeente Den Haag in staat stelt jaarlijks voor alle WOZ-objecten in Den Haag een nieuwe, actuele WOZ-taxatie te maken en deze te onderbouwen met een taxatieverslag. De WOZ-taxaties worden jaarlijks bij een voor bezwaar en beroep vatbare WOZ-beschikking aan burgers en bedrijven verzonden (op papier of digitaal). Daarover wordt gecommuniceerd via lokale media, de website van de gemeente Den Haag en MijnDenHaag.nl. De WOZ-waarde van de woning is beperkt openbaar en te raadplegen via het wozwaardeloket.nl. Burgers en bedrijven kunnen van de WOZ-objecten waarvan zij belanghebbende (eigenaar en/of gebruiker) zijn het taxatieverslag opvragen. Afnemers van de WOZ-waarde, zoals de Rijksbelastingdienst en het Hoogheemraadschap, gebruiken de WOZ-waarde voor o.a. belastingheffing.", - "proportionality": "Er bestaat geen beter alternatief voor de algoritmen van 4Woz. 4Woz wordt momenteel juist zelf gezien als alternatief voor een traditionele manier van taxeren waarbij buiten het taxatiemodel van IBS om individuele taxaties gemaakt kunnen worden. Bij een volledig traditionele manier van werken maken individuele, gemeentelijke taxateurs elk op hun eigen wijze een interpretatie van objectkenmerken en marktgegevens tot een taxatiewaarde. Een geautomatiseerd taxatiemodel dat werkt volgens algoritmen draagt er in het algemeen aan bij dat de analyse van marktgegevens, het taxeren van objecten en het onderbouwen door middel van een taxatieverslag veel consistenter en eenduidiger verloopt. De frequentie van jaarlijks taxeren en WOZ-beschikkingen nemen is alleen mogelijk dankzij algoritmen zoals in 4Woz opgenomen.", - "decision_making_process": "De applicatie 4Woz ondersteunt in het taxatieproces ten behoeve van de uitvoering van de wet WOZ. Dit is een wettelijke taak die aan alle gemeenten in Nederland is opgedragen. De Wet WOZ heeft ten doel de waardebepaling van onroerende zaken in de gemeente ten behoeve van onder meer belastingheffing door overheden Rijk, Hoogheemraadschap en gemeente. In 4Woz worden de taxaties bepaald en door WOZ-taxateurs gefiatteerd. De WOZ-waarden en taxatieverslagen worden aan het IBS (Integraal Belasting Systeem) geleverd, dat de voor bezwaar en beroep vatbare besluiten neemt, die WOZ-beschikkingen worden genoemd. Deze worden tezamen met de aanslagen van gemeentelijke belastingen aan de burgers en bedrijven kenbaar gemaakt binnen acht weken na 1 januari van elk jaar.", - "documentation": null, - "competent_authority": "De verwerkingsverantwoordelijke is de gemeente Den Haag. De rechtmatige grondslag is de Wet WOZ.", - "lawful_basis": "De wettelijke basis die het werken met algoritmen/taxatiemodellen zoals 4Woz noodzakelijk maakt is de Wet WOZ (waardering onroerende zaken). Hierbij stelt de gemeente Den Haag jaarlijks van alle WOZ-objecten de waarde vast via een voor bezwaar en beroep vatbare WOZ-beschikking. De getaxeerde waarde wordt onderbouwd met een taxatieverslag dat voor belanghebbenden beschikbaar is. De gemeente voert de Wet WOZ mede uit voor de afnemers, o.a. de Rijksbelastingdienst en het Hoogheemraadschap. Gegevens worden aan de afnemers geleverd via de Landelijke Voorziening WOZ (LV WOZ).", - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": "Er kan bezwaar gemaakt worden tegen de uitkomst van het proces waarin het algoritme 4Woz wordt gebruikt. De uitkomst van de algoritmen is de WOZ-waarde die bij voor bezwaar en beroep vatbare WOZ-beschikking is vastgesteld. Een andere uitkomst van het algoritme is een taxatieverslag dat de WOZ-waarde onderbouwt. Volgens de Wet WOZ kan de belanghebbende (eigenaar/gebruiker) van een WOZ-beschikking binnen zes weken na dagtekening van de beschikking gemotiveerd een bezwaar indienen en daarbij wijzen op onjuiste gegevens. In het kader van de behandeling van het bezwaar worden de grieven beoordeeld en aan de WOZ-beschikking ten grondslag liggende gegevens incl. WOZ-waarde indien nodig verbeterd. De uitspraak op het bezwaarschrift staat open voor beroep. Ook kan de belanghebbende altijd een vraag richten aan de Belastingzaken van de gemeente Den Haag. Dit kan soms leiden tot ambtshalve aanpassingen.", - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": "Nederlands", - "revision_date": null, - "description": null, - "application_url": "Niet van toepassing.", - "publiccode": null, - "mprd": "Ja", - "source_data": "Bij de Wet WOZ wordt zeer veel gebruik gemaakt van basisregistraties. Het WOZ-object wordt afgebakend op basis van gegevens over eigendom vastgelegd in de Basisregistratie Kadaster, BRK. En het gebruik wordt gebaseerd op natuurlijke en niet-natuurlijke personen die in de Basisregistratie Personen (BRP) en/of het Handelsregister (NHR) zijn vermeld. Bij de afbakening van WOZ-objecten wordt ook de relatie gelegd naar panden en adresseerbare objecten uit de Basisregistratie Adressen en Gebouwen (BAG). Een deel van de belastingapplicatie IBS vormt tevens de Basisregistratie WOZ (waardering onroerende zaken), waarin het object, het belang (de belastingplicht) en de WOZ-waarde zijn vastgelegd. Het sectormodel WOZ geeft inzicht in de honderden gegevens die in een belastingapplicatie en taxatiesysteem zoals 4Woz zijn opgenomen. Het voert te ver dit hier uit te schrijven. Twee hoofdgroepen data worden via het algoritme verwerkt, In de eerste plaats zijn dit objectkenmerken zoals primaire objectkenmerken (soort object, grootte, bouwjaar, bijgebouwen e.d.), secundaire objectkenmerken die een kwalificatie zijn van bijv. ligging, onderhoud, kwaliteit en uitstraling. De tweede groep data omvat marktgegevens, zoals vraagprijzen, koopsommen, huurprijzen, stichtingskosten en grondprijzen. Deze worden veelal tot kengetallen herleid. Het algoritme rekent vervolgens met objectkenmerken x kengetallen de waarden van WOZ-objecten in onderdelen uit. De opstelsom van de waarde van onderdelen is de taxatiewaarde die na controle wordt gefiatteerd en geleverd aan IBS (Integraal Belasting Systeem).", - "methods_and_models": "In feite zijn de algoritmen zeer eenvoudige wiskundige bewerkingen zoals optellen, aftrekken, vermenigvuldigen en delen bij het bereken van taxatiewaarden uit objectkenmerken en prijzen per eenheid. Ditzelfde geldt bij het opstellen van taxatieverslagen. Ingewikkeldere deelprocessen zoals het coderen en opmeten van objectkenmerken en het classificeren van objecten in groepen e.d. is nog ouderwets handwerk. Dit geldt ook voor het instellen van de prijzen per eenheid waarmee gerekend wordt. Dat er toch algoritmen worden toegepast in de vorm van 4Woz heeft te maken met het feit dat bijna 300.000 WOZ-objecten met een veelvoud aan WOZ-deelobjecten en objectkenmerken) in een jaarlijks proces getaxeerd worden. Daarbij helpt het algoritme dit op een consistente wijze te doen zodat zo goed mogelijk kan worden gewaarborgd dat gelijke objecten gelijk behandeld worden. ", - "monitoring": "De uitkomsten van de algoritmen van 4Woz zijn afhankelijk van de kwaliteit van objectkenmerken, een juiste analyse van marktgegevens en de juiste inrichting van de uitgangspunten van de taxatiemodellen. Er wordt aan de voorkant van dit taxatieproces een groot belang gehecht aan het vakmanschap van de gegevensbeheerders WOZ voor een eenduidige en volledige registratie van objectkenmerken. Op dezelfde wijze wordt belang gehecht aan vakmanschap van de WOZ-taxateur voor de juiste marktanalyse, kennis van de markt, de inrichting en werking van de taxatiemodellen en de controle van taxaties. Via informeel contact zijn ook vele burgers en bedrijven in staat informatie te verschaffen ten behoeve van het taxatieproces en/of de bezwarenbehandeling.", - "human_intervention": "Ja, zeker is er sprake van tussenkomst van de mens in de zin van de gebruiker van de applicatie 4Woz. Gegevensbeheerders WOZ verzorgen het op consistente wijze beheren van objectkenmerken, WOZ-taxateurs analyseren marktgegevens in wisselwerking met belanghebbenden (burgers en bedrijven). WOZ-taxateurs richten de modellen in, wat neerkomt op het bepalen van prijzen per eenheid en het instellen van de invloed van objectkenmerken op de taxatiewaarde. De uitkomst van het taxatiemodel wordt ten slotte gecontroleerd door WOZ-taxateurs voordat de WOZ-waarden worden vastgesteld.", - "risks": "Voor geautomatiseerde taxatiemodellen zijn risico's met name een gebrekkige kwaliteit van objectkenmerken, onvoldoende of onvoldoende geanalyseerde marktgegevens, de inrichting van de taxatiemodellen met kengetallen en een gebrekkig controleproces van getaxeerde waarden. De uitkomsten van de algoritmen van 4Woz zijn afhankelijk van de kwaliteit van objectkenmerken, een juiste analyse van marktgegevens en de juiste inrichting van de uitgangspunten van de taxatiemodellen. Er wordt aan de voorkant van dit taxatieproces een groot belang gehecht aan het vakmanschap van de gegevensbeheerders WOZ voor een eenduidige en volledige registratie van objectkenmerken. Op dezelfde wijze wordt belang gehecht aan vakmanschap van de WOZ-taxateur voor de juiste marktanalyse, kennis van de markt, de inrichting en werking van de taxatiemodellen en de controle van taxaties. Via informeel contact zijn ook vele burgers en bedrijven in staat informatie te verschaffen ten behoeve van het taxatieproces en/of de bezwarenbehandeling.", - "performance_standard": "Bij de uitvoering van de Wet WOZ wordt voor beoordeling van de uitkomsten van het taxatieproces (met de algoritmen van o.a. 4Woz) gebruikgemaakt van controleprotocollen die als voorbeeld zijn opgesteld door de Waarderingskamer. De Waarderingskamer is een onderdeel van het Ministerie van Financi\u00ebn dat toezicht houdt op de uitvoering van de Wet WOZ. In het kader van de toepassing van de beoordelingsprotocollen wordt onder meer de aansluiting op marktniveau beoordeeld op basis van ratio's en kengetallen. Dit gebeurt zowel voor de hele gemeente als voor groepen objecten en individuele objecten. Ook wordt gekeken naar vraagprijzen in relatie tot WOZ-waarden (van te koop staande objecten), naar een consistente waardeontwikkeling ten opzichte van een vorige waarde peildatum, naar de marktontwikkeling van wel/niet verkochte objecten, naar bevindingen uit de bezwarenbehandeling en ten slotte worden de taxatieverslagen beoordeeld.", - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.126607+00:00", - "lars": "41525861", - "owner": "gemeente-den-haag" - }, - { - "name": "Model van Bijstand naar Werk", - "organization": "Gemeente Den Haag", - "department": "Sociale Zaken en Werkgelegenheidsprojecten", - "description_short": "Algoritme dat op grond van kenmerken doelgroepen kan identificeren binnen de groep mensen in de bijstand. Het doel is: op maat dienstverlening naar werk of participatie. ", - "type": "Op regels gebaseerd", - "category": null, - "website": null, - "status": "Gestopt", - "goal": "Doel was om op grond van kenmerken een passend aanbod te kunnen bepalen voor mensen in de bijstand naar werk of participatie trajecten. ", - "impact": "Het algoritme was een eenmalige manuele analyse. Het is te vroeg om te zeggen hoe gebruik, risico beheersing en communicatie precies vorm zouden krijgen. ", - "proportionality": "De standaard dienstverlening is dat consulenten op grond van gesprekken en data de keuzes voor dienstverlening maken. Een advies op grond van het algoritme zou hier een aanvulling op kunnen zijn.", - "decision_making_process": "Het algoritme had kunnen helpen te bepalen welke burger in de bijstand gebaat is bij bepaalde dienstverlening van de gemeente. Het gaat om een advies aan de consulent. Besluitvorming is niet geautomatiseerd. Alle burgers in de bijstand krijgen dienstverlening, niemand wordt uitgesloten.", - "documentation": null, - "competent_authority": "De gemeente Den Haag is verantwoordelijk voor de verwerking. Eenmalig is met een leverancier gewerkt en werd een verwerkersovereenkomst gesloten. Er worden persoonsgegevens verwerkt. De juridische grondslag is uitvoering van de wettelijke taak Participatiewet. De verwerkingsverantwoordelijke is de gemeente Den Haag.", - "lawful_basis": "De juridische grondslag is uitvoering van de wettelijke taak Participatiewet.", - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": "Het algoritme is niet gefinaliseerd. Sowieso geldt: de consulent spreekt de kandidaat en neemt de uitkomst van het algoritme mee in het gesprek. Op grond van dit gesprek wordt een vervolgtraject afgesproken.", - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": "Nederlands", - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": "Nee", - "source_data": "Bijstandsgegevens, gegevens over re-integratie en participatie trajecten, over schuldhulpverlening en zelfredzaamheid. De output wordt niet gebruikt als input in een ander geautomatiseerd proces. ", - "methods_and_models": "Data analyse m.b.v. Excel en R. Decision tree. Cluster algoritme. Tekstmining.", - "monitoring": "Het algoritme is niet in productie genomen. Als het in productie zou komen worden de uitkomsten van het algoritme regelmatig ge\u00ebvalueerd om eventuele biases te herkennen. Ook zal worden ge\u00ebvalueerd hoe het algoritme wordt toegepast door de consulent. ", - "human_intervention": "Ja", - "risks": "Er is een DEDA traject uitgevoerd (De Ethische Data Assistent) om potenti\u00eble ethische problemen te herkennen. Ook is een DPIA uitgevoerd om privacy risico's te herkennen. Tijdens ontwikkeling van het algoritme houdt de projectgroep de risico's in de gaten. Mocht het algoritme klaar zijn en ge\u00efmplementeerd worden dan zal extra bewaking op de risico's worden ingericht. Het bewust vermijden van bias en aandacht voor inclusie blijven een aandachtspunt in de operatie.", - "performance_standard": "Eerst wordt bepaald of onderscheidende klantsegmenten mogelijk zijn met de beschikbare data. Vervolgens wordt getoetst of bepaalde segmenten een grotere kans op uitstroom naar werk hebben en of er andere belangrijke focusgebieden zijn voor dienstverlening op maat. Het algoritme functioneert goed als het de kans op uitstroom naar werk verhoogt of zorgt voor een betere dienstverlening naar participatie. ", - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.132776+00:00", - "lars": "71627856", - "owner": "gemeente-den-haag" - }, - { - "name": "Aanvraag uitkering Bijstand /Bbz Levensonderhoud", - "organization": "Gemeente Den Haag", - "department": "Sociale Zaken en Werkgelegenheidsprojecten", - "description_short": "Het algoritme wordt gebruikt door de 4 grootste Nederlandse gemeenten (G4) en controleert op basis van ingevulde velden in het aanvraagformulier of een persoon in aanmerking komt voor een uitkering.", - "type": "Op regels gebaseerd", - "category": null, - "website": null, - "status": "Actief", - "goal": "Doel is om het proces van het aanvragen van een uitkering te standaardiseren zodat de kwaliteit geborgd is. ", - "impact": "Dit algoritme heeft betrekking op bewoners van Den Haag die een aanvraag doen voor een uitkering Bijstand/ Bbz Levensonderhoud. We communiceren de uitkomst naar de ontvanger van de uitkering. De gebruikte beslisregels in het algoritme zijn verplicht vanuit de Participatiewet.", - "proportionality": "Voor aanvragers zonder DIGID of iemand uit een kwetsbare doelgroep zal een consulent aan de gemeentebalie het formulier helpen invullen en dan doorzetten naar Galo. De aanvraag doorloopt daarna hetzelfde proces met het algoritme. ", - "decision_making_process": "Na ontvangst van het aanvraagformulier worden ingevulde gegevens door het algoritme in het systeem Galo gecontroleerd. Ook worden brongegevens uit de Suwi-keten gebruikt, een verplichting vanuit de Participatiewet. Op basis van deze informatie volgt een signalering aan de consulent die de aanvraag afhandelt. Besluitvorming is niet geautomatiseerd, de consulent beslist. ", - "documentation": null, - "competent_authority": "De gemeente Den Haag is verantwoordelijk voor de verwerking. Het technisch onderhoud van het algoritme is uitbesteed aan Wigo4IT. Er worden persoonsgegevens verwerkt. De juridische grondslag is uitvoering van de wettelijke taak Participatiewet. ", - "lawful_basis": "De juridische grondslag is uitvoering van de wettelijke taak Participatiewet (met als onderdeel de wet SUWI) en WEU (wet eenmalige uitvraag). ", - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": "Er kan bezwaar gemaakt worden tegen het besluit.", - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": "Nederlands", - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": "Ja", - "source_data": "Gegevens van de aanvrager(s) en personen die invloed hebben op de hoogte en het recht van de uitkering. \nBRP, persoons-, familie-en adresgegevens.\nUWV: dienstverbanden, uitkeringen, inkomsten\nRDW: voertuigbezit\nKvk: gegevens onderneming\nDUO: Studie en ontvangst WSF", - "methods_and_models": "Beslisboom", - "monitoring": "Door in het aanvraagformulier vragen te stellen die met ja/nee te beantwoorden zijn of door een vooraf aangegeven optie. Daardoor zijn de gegevens optimaal betrouwbaar. Het enige risico bij het aanvraagproces is dat een burger, door het formulier verkeerd in te vullen een onterecht negatief of positief advies krijgt (van algoritme en consulent). Dit risico wordt geminimaliseerd door het formulier zo eenvoudig mogelijk te maken. Het aanvraagformulier en de bevraging van de brongegevens voldoen aan het wettelijke kader waarbinnen de gegevens mogen worden opgevraagd. (participatiewet, wet Suwi, WEU)", - "human_intervention": "Ja", - "risks": "Het aanvraagformulier is dusdanig vormgegeven dat de ingevulde informatie eenduidig is (door bijv. vooringevulde waarden te selecteren en geen open tekstvelden te gebruiken) zodat er geen risico is om tot de verkeerde conclusie te komen. De signaleringen vanuit dit proces worden periodiek getoetst met de geldende wetgeving in de Participatiewet. De uitkomst beperkt zich tot een signalering, het besluit ligt altijd bij een medewerker. ", - "performance_standard": "Criterium is de juistheid van de signalering. De signaleringen vanuit dit proces worden periodiek getoetst met de geldende wetgeving in de Participatiewet. De uitkomst beperkt zich tot een signalering, het besluit ligt altijd bij een medewerker. ", - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.139937+00:00", - "lars": "54281370", - "owner": "gemeente-den-haag" - }, - { - "name": "Ondersteuning berekening uitkering", - "organization": "Gemeente Den Haag", - "department": "Sociale Zaken en Werkgelegenheidsprojecten", - "description_short": "Het algoritme wordt gebruikt door de 4 grootste Nederlandse gemeenten (G4) en bepaalt op grond van wet- en regelgeving of er recht is op een uitkering, soort uitkering, hoogte en duur en geeft dit als advies aan de consulent.", - "type": "Op regels gebaseerd", - "category": null, - "website": null, - "status": "Actief", - "goal": "Doel is een correct besluit op grond van wet- en regelgeving.", - "impact": "Dit algoritme heeft betrekking op bewoners van Den Haag die een aanvraag doen voor een uitkering of een uitkering ontvangen, bijvoorbeeld voor levensonderhoud. Zij hebben ermee te maken op het moment dat zij een uitkering ontvangen. We communiceren de uitkomst naar de ontvanger van de uitkering. ", - "proportionality": "Een alternatief zou zijn: handmatige opvoer en controle van de uitkeringscomponenten. Maar dit vraagt veel kennis van de consulent op het gebied van wet en regelgeving en is daarmee een te groot risico op fouten. ", - "decision_making_process": "Het gaat om het besluitvormingsproces over het recht op uitkering, welke uitkering, de hoogte en de duur. Het algoritme is een advies aan de consulent. Besluitvorming is niet geautomatiseerd, de consulent beslist. ", - "documentation": null, - "competent_authority": "De gemeente Den Haag is verantwoordelijk voor de verwerking. Het technisch onderhoud van het algoritme is uitbesteed aan Wigo4IT. Er worden persoonsgegevens verwerkt. De juridische grondslag is uitvoering van de wettelijke taak Bijstandswet. ", - "lawful_basis": "De juridische grondslag is uitvoering van de wettelijke taak Bijstandswet.", - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": "Er kan bezwaar gemaakt worden tegen het besluit.", - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": "Nederlands", - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": "Ja", - "source_data": "Er is o.a. een koppeling met de BRP en Suwinet. Gezinssituatie, woonsituatie, inkomen, vermogen, persoonlijke gegevens. Normgegevens vanuit wet en regelgeving. ", - "methods_and_models": "Beslisboom", - "monitoring": "Het algoritme werkt met gegevens uit de basisregistratie van de gemeente. Aanpassingen door consulenten zijn herleidbaar. En daarnaast op basis van gegevens die gestructureerd zijn ingevoerd op basis van voorgedefinieerde waarden. De consulent is alert op het checken van de uitkomsten. De burger kan vragen stellen of vragen om herziening. ", - "human_intervention": "Ja", - "risks": "De afdeling Beleid werkt de wet en regelgeving uit. Bij de automatisering van dit proces zijn de risico's in kaart gebracht. Het systeem wordt bij elke release opnieuw getest. Dagelijks vindt technische en menselijkse controle plaats.", - "performance_standard": "Er vinden dagelijks technische controles plaats. Daarnaast kan de consulent fouten constateren en geeft deze door aan functioneel beheer. Bij nieuwe releases wordt getest door Wigo4IT, functioneel beheer en consulenten.", - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.145741+00:00", - "lars": "86652588", - "owner": "gemeente-den-haag" - }, - { - "name": "Cyrb geluidsherkenning", - "organization": "Gemeente Den Haag", - "department": "Stadsbeheer", - "description_short": "Algoritme dat een geluid detecteert en vaststelt wat voor soort geluid het is. Het soort geluid wordt vastgelegd.", - "type": "Op regels gebaseerd", - "category": null, - "website": null, - "status": "Actief", - "goal": "Het gaat om een pilot. Het algoritme is ontwikkeld om geluiden te herkennen. Daarnaast is het bedoeld om een beeld te krijgen waar, wanneer er wat voor soorten geluidsoverlast aanwezig is. Een derde doel is om eventueel direct te acteren als het type geluid of het geluidsniveau daar aanleiding toe geeft. ", - "impact": "De uitkomsten van het algoritme zijn gevalideerd met bewoners om te onderzoeken of de beleving van het geluid overeenkomt met de gemeten waardes. Als een burger/bezoeker/bedrijf zorgt voor geluidsoverlast of een verontrustend type geluid (bijv. pistoolschot) krijgt de burger te maken met handhaving of politie.", - "proportionality": "Er is geen alternatief; dit is de simpelste en minst inbreukmakende meting.", - "decision_making_process": "Het algoritme wordt gebruikt om een handhaver af te sturen op een situatie waar mogelijk wat mis is, afgaande op het type geluid. Er is geen sprake van geautomatiseerde besluitvorming. ", - "documentation": null, - "competent_authority": "Er worden geen persoonsgegevens verwerkt. De gemeente Den Haag is verantwoordelijk. Cyrb zorgt voor de verwerking.", - "lawful_basis": "Gemeentewet. Artikel 172 Handhaving openbare orde", - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": "Er is geen formele bezwaarprocedure. Er vindt altijd een menselijke check plaats van de uitkomsten. Mochten burgers onverhoopt bezwaar willen maken dan kan dit door het bezwaar kenbaar te maken bij de gemeente.", - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": "Nederlands", - "revision_date": null, - "description": null, - "application_url": "Zie Cyrb.nl", - "publiccode": null, - "mprd": "Nee", - "source_data": "Geluidsfragmenten", - "methods_and_models": "Bij het evalueren van het model wordt de confusion matrix gebruikt en de categorical-crossentropy als metric. ", - "monitoring": "Kritisch zal bekeken worden of de sensoren de verwachte meerwaarde ook echt bieden. Bevindingen van burgers zijn welkom en worden mee-overwogen", - "human_intervention": "Ja", - "risks": "Het algoritme is getraind op openbare datasets van vergelijkbare geluiden. Omdat deze niet altijd hetzelfde klinken en dezelfde karakteristieken hebben (en aard) als de geluiden die op locatie worden opgevangen zou het algoritme fouten kunnen maken in de geluidsherkenning. Omdat het algoritme alleen ter beeldvorming dient levert dit niet direct risico's op voor de betrokken burgers en ondernemers. Er is geen risico op schending van de privacy doordat het geluid zelf niet wordt opgeslagen. Bij de categorisering van het geluid zijn geen aspecten meegenomen die zouden kunnen leiden tot bias, bijv. nationaliteit. ", - "performance_standard": "Voor de totale oplossing geldt dat de effectiviteit onderzocht wordt. Daarvoor wordt gemeten of de signalen nuttig waren, de drempelwaardes goed staan, of de locatie van de microfoon goed is, of er genoeg opvolging gegeven kan worden, etc. ", - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.153015+00:00", - "lars": "22733216", - "owner": "gemeente-den-haag" - }, - { - "name": "Left luggage detection", - "organization": "Gemeente Den Haag", - "department": "Stadsbeheer", - "description_short": "Herkennen van bijgeplaatst afval naast ondergrondse containers", - "type": "Op regels gebaseerd", - "category": null, - "website": "https://zoek.officielebekendmakingen.nl/gmb-2021-464650.pdf ", - "status": "Gestopt", - "goal": "Het algoritme is oorspronkelijk ontwikkeld voor de detectie van vergeten bagage. Functioneert goed bij vaste camera's (niet draaibaar of inzoombaar) en bij voldoende licht. Werkt niet goed bij dynamische omgevingen of in het duister.", - "impact": "Het algoritme detecteert vermoedelijke bijplaatsingen van afval. Vervolgens kijkt een handhaver op de video of het echt een bijplaatsing is. Daarna worden de bijbehorende beelden bekeken door een handhaver om te zien of de bijplaatser in beeld is. Daarna kan de handhaver de bijplaatser - als die wordt herkend door de handhaver - een bestuurlijke boete geven. Dat is wat de burger ervan merkt. Camera's worden geplaatst op grond van het Aanwijzingsbesluit van de burgemeester: https://zoek.officielebekendmakingen.nl/gmb-2021-464650.pdf", - "proportionality": "Alle 'lichtere' middelen (meer toezicht, meer informatie over regels, meer containers en nog tientallen andere middelen) zijn uitgeprobeerd en leverden niet het gewenste resultaat. De camera's worden nu ook ingezet als aanvullend instrument.", - "decision_making_process": "Handhaving Afvalstoffenverordening, geen geautomatiseerde besluiten", - "documentation": null, - "competent_authority": "Verwerkingsverantwoordelijk is de gemeente Den Haag. De rechtmatige grondslag: zie volgende regel. Er is geen sprake van verwerking van persoonsgegevens in het algoritme: het algoritme geeft een hit als hij detecteert dat een niet bewegend object langere tijd blijft staan. Op de camerabeelden zijn wel personen herkenbaar in beeld maar deze worden alleen bekeken door hiervoor aangewezen handhavers na een signaal van het algoritme. ", - "lawful_basis": "Art. 151c Gemeentewet, jo. APV en Afvalstoffenverordening Den Haag", - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": " Nee, maar de uitkomsten van het algoritme worden altijd beoordeeld door een persoon. Bezwaar kan worden gemaakt tegen een boete. ", - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": "Nederlands", - "revision_date": null, - "description": null, - "application_url": "Het algoritme is ontwikkeld en geinstalleerd door de leverancier van het camerasysteem, Connection Systems. Daar is de documentatie op te vragen. ", - "publiccode": null, - "mprd": "Nee", - "source_data": "Camerabeelden", - "methods_and_models": "Het algoritme berust bij de leveranciers. Gemeente neemt dienstverlening af en heeft geen inhoudelijke kennis van de werking van het algoritme.", - "monitoring": "Er zijn geen risico's omdat er altijd een persoon de uitkomsten beoordeelt.", - "human_intervention": "Ja, zie de beschrijving.", - "risks": "Voor het project is een Gegevensbeschermings effectbeoordeling (GEB) uitgevoerd en een Data privacy impact assessment (DPIA). Het enige risico is een vals positief (het lijkt op een bijplaatsing, maar is het niet) of een vals negatief (het was een bijplaatsing, maar het algoritme heeft dat niet herkend). In beide gevallen zijn de gevolgen voor de betrokkene nihil. Bij een vals positief verwijdert de handhaver de beelden na beoordeling. Bij een vals negatief gebeurt er niks met de beelden. Beelden zonder herkenning worden automatisch verwijderd door het systeem.", - "performance_standard": "Aan het eind van het project wordt het in totaal ge\u00ebvalueerd. O.a. het aantal vals positieve herkenning en vals negatieve herkenning door het algoritme.", - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.158885+00:00", - "lars": "53531982", - "owner": "gemeente-den-haag" - }, - { - "name": "Voorspelling drukte en stembiljettengebruik bij stembureaus", - "organization": "Gemeente Den Haag", - "department": "Publiekszaken", - "description_short": "Op basis van de opkomst in de eerste 3 uren (volgens de StembureauApp) wordt een prognose over de komende 10 uren gemaakt voor drukte en afname stembiljetten. ", - "type": "Op regels gebaseerd", - "category": null, - "website": null, - "status": "Actief", - "goal": "Voor signalering van mogelijke drukte en daaraan gekoppelde stembiljettenverbruik. Het algoritme geeft een score normaal, rustig en druk. Deze score wordt zichtbaar op de Wachtrij app voor het publiek. Daarnaast gebruikt de controlekamer van de verkiezingen de gegevens voor advies aan de voorzitter van het stembureau over benodigde extra stembiljetten. Ook kan besloten worden door de voorzitter van het stembureau om mensen naar een ander bureau te verwijzen.", - "impact": "De kiezer beslist zelf of hij/zij gebruik maakt van de Wachtrij app en de gegevens die het algoritme gegenereerd heeft.", - "proportionality": "Eerste versie was een telling van het daadwerkelijk aantal bezoekers in het Stembureau als input voor voorraadbeheersing van het aantal stembiljetten. Dit werkte minder goed.", - "decision_making_process": "Geen directe besluitvorming, indicatie van mogelijke drukte en/of lage voorraad stembiljetten. Voor actie wordt concreet gekeken naar voorraden en drukte bij specifieke stembureaus", - "documentation": null, - "competent_authority": "Gemeente Den Haag is verwerkingsverantwoordelijke. Er is geen sprake van persoonsgegevens, slechts van tellingen.", - "lawful_basis": "Kieswet", - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": "Nee ", - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": "Nederlands", - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": "Nee", - "source_data": "De StembureauApp registreert dat er mensen gestemd hebben maar niet wie. De aantallen worden gebruikt voor het algoritme. Geen afhankelijkheden", - "methods_and_models": "Gemiddelden per uur, historische curves over tijd en lineaire regressie.", - "monitoring": "Nvt", - "human_intervention": "Ja", - "risks": "Geen risico want kiezer beslist zelf welk stembureau hij/zij bezoekt. Geen geautomatiseerde besluitvorming. Bias speelt geen rol want het aantal kiezers wordt geteld onafhankelijk van persoonsgegevens.", - "performance_standard": "Algoritme is simpel, foutloos, telt en geeft weer.", - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.165697+00:00", - "lars": "27924554", - "owner": "gemeente-den-haag" - }, - { - "name": "Druktemeting - personen tellen", - "organization": "Gemeente Den Haag", - "department": "Stadsbeheer", - "description_short": "Algoritme dat het aantal personen telt in een camerabeeld", - "type": "Op regels gebaseerd", - "category": null, - "website": "De camera's zijn toegevoegd aan onderstaande kaart.\nhttps://ddh.maps.arcgis.com/apps/webappviewer/index.html?id=8531785e9a8c4450be8839385003f1bc", - "status": "Actief", - "goal": "Het gaat om een pilot. Doel is effici\u00ebnte handhaving op drukte. Het algoritme is niet bedoeld om mensen te herkennen of iets te doen met persoonsgegevens.", - "impact": "Burgers krijgen met het effect van het algoritme te maken als de handhaver besluit langs te komen. Communicatie wordt voorbereid.", - "proportionality": "Het is een eerste experiment om geautomatiseerd te tellen in plaats van alleen gebruik te maken van inzet van handhavers.", - "decision_making_process": "Als het aantal personen in Scheveningen op een aantal locaties op de boulevard boven een bepaalde waarde komt komt er een signaal naar de Centrale van Handhaving (met geblurrde beelden - zie algoritme Druktemeting - blurren). De Centrale kan ervoor kiezen een handhaver er naartoe te sturen. Er zijn geen geautomatiseerde besluiten. Een communicatieuiting over het beleid wordt voorbereid (juli 2022).", - "documentation": null, - "competent_authority": "Gemeente Den Haag dienst Stadsbeheer is de verwerkingsverantwoordelijke. Verwerking vindt plaats door de leverancier Natix (Hamburg), met wie een verwerkingsovereenkomst is gesloten. ", - "lawful_basis": "Gemeentewet. Artikel 172 Handhaving openbare orde (camerabeelden) en Artikel 151C (verwerking camerabeelden onder regie van de politie).", - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": "N.v.t. Een handhaver trekt zelf conclusies.", - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": "Nederlands", - "revision_date": null, - "description": null, - "application_url": "N.v.t. want wordt uitgevoerd door een leverancier.", - "publiccode": null, - "mprd": "Nee", - "source_data": "Camerabeelden. ", - "methods_and_models": "Convolutional Neural Network / Feature Pyramid Networks.", - "monitoring": "De risico's van de camera's worden gevolgd. Het algoritme zelf heeft geen risico's. ", - "human_intervention": "Ja, de handhaver.", - "risks": "Er is een ethische toetsing gedaan en een impact assessment (AIIA). Ook is een DPIA uitgevoerd (de DPIA druktemeting en groepsdynamiek) waarin de risico's en maatregelen zijn beschreven t.a.v. privacy. Er is geen bias, want de personen worden geteld zonder voorkeur. De keuze waar de camera's hangen is gemaakt samen met de handhavers. ", - "performance_standard": "Signalen moeten waardevol zijn. Er zullen evaluaties worden gehouden. Na het experiment zal de toegevoegde waarde tegen het belang worden afgewogen.", - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.173767+00:00", - "lars": "46779276", - "owner": "gemeente-den-haag" - }, - { - "name": "Druktemeting - groepsdynamiek inschatting", - "organization": "Gemeente Den Haag", - "department": "Stadsbeheer", - "description_short": "Algoritme dat bewegingen in een groep op camerabeelden classificeert", - "type": "Op regels gebaseerd", - "category": null, - "website": "De camera's zijn toegevoegd aan onderstaande kaart.\nhttps://ddh.maps.arcgis.com/apps/webappviewer/index.html?id=8531785e9a8c4450be8839385003f1bc", - "status": "Actief", - "goal": "Het gaat om een pilot. Doel is effici\u00ebnte handhaving op drukte. Het algoritme is niet bedoeld om mensen te herkennen of iets te doen met persoonsgegevens.", - "impact": "Burgers krijgen met het effect van het algoritme te maken als de handhaver besluit langs te komen. Communicatie wordt voorbereid.", - "proportionality": "Het is een eerste experiment om geautomatiseerd de groepsdynamiek vast te stellen in plaats van alleen gebruik te maken van inzet van handhavers.", - "decision_making_process": "Als op Scheveningen op camerabeelden een groep een bepaalde snelheid heeft komt er een signaal naar de Centrale van Handhaving (met geblurrde beelden - zie algoritme Druktemeting - blurren). De Centrale kan ervoor kiezen een handhaver er naartoe te sturen. Er zijn geen geautomatiseerde besluiten. Een communicatieuiting over het beleid wordt voorbereid (juli 2022).", - "documentation": null, - "competent_authority": "Gemeente Den Haag dienst Stadsbeheer is de verwerkingsverantwoordelijke. Verwerking vindt plaats door de leverancier Natix (Hamburg), met wie een verwerkingsovereenkomst is gesloten. ", - "lawful_basis": "Gemeentewet. Artikel 172 Handhaving openbare orde (camerabeelden) en Artikel 151C (verwerking camerabeelden onder regie van de politie).", - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": "N.v.t. Een handhaver trekt zelf conclusies.", - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": "Nederlands", - "revision_date": null, - "description": null, - "application_url": "N.v.t. want wordt uitgevoerd door een leverancier.", - "publiccode": null, - "mprd": "Nee", - "source_data": "Camerabeelden. ", - "methods_and_models": "Niet bekend bij de gemeente.", - "monitoring": "De risico's van de camera's worden gevolgd. Het algoritme zelf heeft geen risico's. ", - "human_intervention": "Ja, de handhaver.", - "risks": "Er is een DPIA uitgevoerd (DPIA druktemeting en groepsdynamiek) waarin de risico's en maatregelen zijn beschreven. Er is geen bias, want de dynamiek wordt bepaald zonder voorkeur op type personen. De keuze waar de camera's hangen is gemaakt samen met de handhavers. ", - "performance_standard": "Signalen moeten waardevol zijn. Er zullen evaluaties worden gehouden. Na het experiment zal de toegevoegde waarde tegen het belang worden afgewogen.", - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.179388+00:00", - "lars": "95818782", - "owner": "gemeente-den-haag" - }, - { - "name": "Druktemeting - blurren van het beeld", - "organization": "Gemeente Den Haag", - "department": "Stadsbeheer", - "description_short": "Algoritme dat op de Scheveningse boulevard zorgt dat (na tellen en bepalen van de groepsdynamiek) het camerafragment geblurrd wordt.", - "type": "Op regels gebaseerd", - "category": null, - "website": "De camera's zijn toegevoegd aan onderstaande kaart.\nhttps://ddh.maps.arcgis.com/apps/webappviewer/index.html?id=8531785e9a8c4450be8839385003f1bc", - "status": "Actief", - "goal": "Het gaat om een pilot. Doel is effici\u00ebnte handhaving op drukte. Het algoritme is bedoeld om mensen niet herkenbaar te laten zijn. Zelfs persoonsgegevens als lengte en dikte mogen niet herleidbaar zijn.", - "impact": "Burgers krijgen met het effect van het algoritme te maken als de handhaver besluit langs te komen. Communicatie wordt voorbereid.", - "proportionality": "Het is een eerste experiment om met geblurrde (=geanonimiseerde) beeldfragmenten te werken, naast het alleen werken met handhavers.", - "decision_making_process": "Als op Scheveningen op grond van camerabeelden een signaal wordt afgegeven naar de Centrale van Handhaving wordt een geblurrd beeldfragment aangemaakt. De Centrale kan ervoor kiezen een handhaver er naartoe te sturen. Er zijn geen geautomatiseerde besluiten. Een communicatieuiting over het beleid wordt voorbereid (juli 2022).", - "documentation": null, - "competent_authority": "Gemeente Den Haag dienst Stadsbeheer is de verwerkingsverantwoordelijke. Verwerking vindt plaats door de leverancier Natix (Hamburg), met wie een verwerkingsovereenkomst is gesloten. ", - "lawful_basis": "Gemeentewet. Artikel 172 Handhaving openbare orde (camerabeelden) en Artikel 151C (verwerking camerabeelden onder regie van de politie).", - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": "N.v.t. Een handhaver trekt zelf conclusies.", - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": "Nederlands", - "revision_date": null, - "description": null, - "application_url": "N.v.t. want wordt uitgevoerd door een leverancier.", - "publiccode": null, - "mprd": "Nee", - "source_data": "Camerabeelden. ", - "methods_and_models": "Niet bekend bij de gemeente.", - "monitoring": "De risico's van de camera's worden gevolgd. Het algoritme zelf heeft geen risico's. ", - "human_intervention": "Ja, de handhaver.", - "risks": "Er is een DPIA uitgevoerd (DPIA druktemeting en groepsdynamiek) waarin de risico's en maatregelen zijn beschreven. Er is geen bias, want de blurring wordt bepaald zonder voorkeur op type personen. De keuze waar de camera's hangen is gemaakt samen met de handhavers. ", - "performance_standard": "Onherkenbaarheid van de personen. Daarnaast moeten signalen bruikbaar zijn om te zien of actie nodig is. Er zullen evaluaties worden gehouden. Na het experiment zal de toegevoegde waarde tegen het belang worden afgewogen.", - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.187683+00:00", - "lars": "57517331", - "owner": "gemeente-den-haag" - }, - { - "name": "Voorspelmodel Jeugdhulp", - "organization": "Gemeente Den Haag", - "department": "Onderwijs, Cultuur en Welzijn", - "description_short": "Het voorspelmodel voor Jeugdhulp voorspelt het aantal unieke jongeren met Jeugdhulp zonder verblijf met een voorspelhorizon van zes jaar. Naast het aantal jongeren worden ook voorspellingen gedaan over de kosten. Voorspellingen worden gedaan op wijkniveau, voor de stadsdelen en voor heel Den Haag. ", - "type": "Op regels gebaseerd", - "category": null, - "website": null, - "status": "Actief", - "goal": "Het algoritme is ontwikkeld omdat de gemeente Den Haag beter voorbereid wil zijn op de toekomst. Als de gemeente weet hoeveel jongeren naar verwachting de komende zes jaar gebruik gaan maken van Jeugdhulp zonder verblijf en van de kosten die dat met zich meebrengt, kan zij beter anticiperen op deze vraag en de ondersteuning blijven bieden aan alle jongeren die daar in de toekomst behoefte aan hebben. ", - "impact": "Het voorspelmodel doet geen uitspraken over (kansen van) individuele burgers en er is gekozen voor modellen die uitlegbaar zijn. Dit betekent dat we als gemeente geen modellen gebruiken waarvan niet goed is vast te stellen hoe het model tot een bepaalde uitkomst is gekomen (zgn. Black Box modellen). Het Jeugdvoorspelmodel vervangt op geen enkele manier de kennis en kunde van onze consulenten en uitvoering. Het instrument is voor hen niet bedoeld, maar vooral voor beleid en het maken en onderbouwen van beleidskeuzes voor de langere termijn. Juist door de kennis van het Jeugdvoorspelmodel kunnen we tijdig anticiperen en alle individuen beter blijven ondersteunen. ", - "proportionality": "Nee", - "decision_making_process": "Met de inzichten uit het Jeugdvoorspelmodel wordt beleid en uitvoering ondersteund bij beantwoorden van tactische en strategische vragen. Dit zijn vragen en onderwerpen die op de langere termijn spelen (bijvoorbeeld 5 \u00e1 10 jaar). Het model is niet bedoeld voor het beantwoorden van operationele vragen (onderwerpen die op korte termijn spelen) en er is geen sprake van geautomatiseerde besluiten. ", - "documentation": null, - "competent_authority": "Het voorspelmodel Jeugdhulp maakt geen gebruik van kenmerken op persoonsniveau", - "lawful_basis": "Er is geen wettelijke grondslag voor het voorspelmodel, maar de gemeente is verantwoordelijk voor de uitvoering van de Jeugdwet en door het model kan de gemeente beter anticiperen op verwachte ontwikkelingen en burgers beter ondersteunen.", - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": "Gezien de aard van het model is dit niet geregeld.", - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": "Nederlands", - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": "Nee", - "source_data": "Er is alleen gebruikgemaakt van open data, namelijk van het bestand Kerncijfers Wijken en Buurten CBS en van het bestand 'Jongeren met jeugdzorg en jeugdzorgtrajecten in natura; wijken' van het CBS.", - "methods_and_models": "Het gaat om een regressie model. De prestaties van dit model worden afgemeten aan de hand van de maten RMSE, MAE en MAPE. Dit zijn maten die op verschillende manieren vaststellen hoe groot de voorspelfout is. ", - "monitoring": "Indien het noodzakelijk is een nieuw model te bouwen/te trainen, wordt de privacy officer betrokken bij de keuze van features en zal bij een geheel nieuw model ook opnieuw naar het ethisch kader worden gekeken.", - "human_intervention": "Er is geen sprake van een geautomatiseerd systeem. De inzichten uit het voorspelmodel kunnen alleen door tussenkomst van mensen en met de contextkennis en ervaring van betrokken medewerkers worden gebruikt. ", - "risks": "De risico's van het algoritme zijn vooraf en tijdens het bouwen van het voorspelmodel in kaart gebracht. Omdat het voorspelmodel geen uitspraken doet over individuele personen maar over het gebruik van voorzieningen in wijken, was er geen risico dat met de uitkomsten uit het model de privacy van specifieke individuele personen zou kunnen worden geschonden. Verder is alleen gewerkt met wijken die voldoende groot zijn (meer dan 100 inwoners) en waar voldoende mensen gebruikmaakten van de Jeugdhulp (meer dan 70 gebruikers). Een reden hiervoor is dat hierdoor geen onthulling mogelijk is. Dat wil zeggen dat we niet door het combineren van kenmerken kunnen vaststellen wie de mogelijke gebruikers van Jeugdhulpvoorzieningen zijn. Verder is bij het bouwen van het model samen met de privacy officer en de ethical officer afgewogen welke variabelen wel en welke variabelen niet vanuit privacy overwegingen meegenomen konden worden. Hierbij vormde de AVG steeds het uitgangspunt. Daarnaast is uitlegbaarheid van het model en de uitkomsten een relevant en doorslaggevend criterium. De vraag welke rol bias speelt in het gebruik van het algoritme is een veel te algemene vraag, aangezien er vele vormen van bias zijn. Als het gaat om vooringenomenheid gericht op specifieke bevolkingsgroepen, dan speelt dat bij dit model geen rol. We zijn niet op zoek naar specifieke individuele personen met specifieke kenmerken, maar willen een inschatting maken van het gebruik van Jeugdhulp zonder verblijf in de hele wijk en voor heel Den Haag.", - "performance_standard": "Het model wordt jaarlijks geactualiseerd. De voorspellingen van het oude model worden vergeleken met voorspellingen van het nieuwe model en vergeleken met de realisaties.", - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.193147+00:00", - "lars": "46768937", - "owner": "gemeente-den-haag" - }, - { - "name": "Geluidsmodel", - "organization": "Gemeente Utrecht", - "department": "Ruimte", - "description_short": "Het voorspellen of de geluidsnormen worden overtreden in een bepaald gebied. Meer specifieke informatie mbt dit algoritme volgt.", - "type": null, - "category": null, - "website": null, - "status": null, - "goal": null, - "impact": null, - "proportionality": null, - "decision_making_process": "Het algoritme combineert criteria aan een bestand van bepaalde gebieden en geeft informatie of er sprake is van overschrijding van de geluidsnormen", - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": null, - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": null, - "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker", - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.201043+00:00", - "lars": "84217598", - "owner": "gemeente-utrecht" - }, - { - "name": "Luchtkwaliteitsmodel", - "organization": "Gemeente Utrecht", - "department": "Ruimte", - "description_short": "Het voorspellen of de luchtkwaliteitsnormen worden overtreden in een bepaald gebied. Meer specifieke informatie mbt dit algoritme volgt.", - "type": null, - "category": null, - "website": null, - "status": null, - "goal": null, - "impact": null, - "proportionality": null, - "decision_making_process": "Het algoritme combineert criteria aan een bestand van bepaalde gebieden en geeft informatie of er sprake is van overschrijding van de luchtkwaliteitsnormen", - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": null, - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": null, - "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker", - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.206564+00:00", - "lars": "25883972", - "owner": "gemeente-utrecht" - }, - { - "name": "Signaleren vogels", - "organization": "Gemeente Utrecht", - "department": "Ruimte", - "description_short": "Het voorspellen van het aantal vogels in een bepaald gebied. Meer specifieke informatie mbt dit algoritme volgt.", - "type": null, - "category": null, - "website": null, - "status": null, - "goal": null, - "impact": null, - "proportionality": null, - "decision_making_process": "Het algoritme combineert historische data tot informatie over het aantal vogels in een bepaald gebied in de nabije toekomst", - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": null, - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": null, - "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker", - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.212571+00:00", - "lars": "59635361", - "owner": "gemeente-utrecht" - }, - { - "name": "Woonbouwlocaties", - "organization": "Gemeente Utrecht", - "department": "Ruimte", - "description_short": "Het voorspellen van vraag en aanbod van het aantal woonbouwlocaties in een bepaald gebied. Meer specifieke informatie mbt dit algoritme volgt.", - "type": null, - "category": null, - "website": null, - "status": null, - "goal": null, - "impact": null, - "proportionality": null, - "decision_making_process": "Het model combineert veel verschillende soorten data (bijv demografie, economie) tot informatie over de woningmarkt in de nabije toekomst in een bepaald gebied\nHet model vindt zijn neerslag in de Woonvisie 'Utrecht beter in balans' en de monitor Wonen.", - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": null, - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": null, - "human_intervention": "We verzamelen cijfers (zoals prognoses, woningbehoefte, voorraadsamenstelling) en houden de voortgang (productie, meer menging) bij. Het model geeft informatie over de woningvoorraaad en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het model heeft dus niet het laatste woord, maar een medewerker", - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.221590+00:00", - "lars": "54946936", - "owner": "gemeente-utrecht" - }, - { - "name": "Dynamisch inzamelen afval", - "organization": "Gemeente Utrecht", - "department": "Stadsbedrijven", - "description_short": "Het voorspellen van het juiste moment waarop afvalcontainers geleegd kunnen worden en daar de route en het schema van de vuilniswagen op inrichten. Meer specifieke informatie mbt dit algoritme volgt.", - "type": null, - "category": null, - "website": null, - "status": null, - "goal": null, - "impact": null, - "proportionality": null, - "decision_making_process": "Het algoritme combineert informatie van de sensoren mbt de vulgraad in de ondergrondse afvalcontainers tot informatie voor de meest effectieve rijroute en schema van de vuilniswagens", - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": null, - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": null, - "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker.", - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.237349+00:00", - "lars": "98945854", - "owner": "gemeente-utrecht" - }, - { - "name": "Slim vegen", - "organization": "Gemeente Utrecht", - "department": "Stadsbedrijven", - "description_short": "Het voorspellen van de meest nuttige rijroutes van veegwagens. Meer specifieke informatie mbt dit algoritme volgt.", - "type": null, - "category": null, - "website": null, - "status": null, - "goal": null, - "impact": null, - "proportionality": null, - "decision_making_process": "Het algoritme combineert historische data mbt rijroutes van veegwagens tot informatie voor de meest effectieve rijroute en schema van de veegwagens", - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": null, - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": null, - "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker.", - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.243302+00:00", - "lars": "64572345", - "owner": "gemeente-utrecht" - }, - { - "name": "Vervanging lichtmasten", - "organization": "Gemeente Utrecht", - "department": "Stadsbedrijven", - "description_short": "Het voorspellen van het juiste moment waarop lichtmasten aan vervanging toe zijn. Meer specifieke informatie mbt dit algoritme volgt.", - "type": null, - "category": null, - "website": null, - "status": null, - "goal": null, - "impact": null, - "proportionality": null, - "decision_making_process": "Het algoritme combineert criteria aan een bestand van lichtmasten tot informatie over welke lichtmasten in aanmerking komen voor vervanging", - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": null, - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": null, - "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker.", - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.248145+00:00", - "lars": "74381324", - "owner": "gemeente-utrecht" - }, - { - "name": "Stedelijk water", - "organization": "Gemeente Utrecht", - "department": "Stadsbedrijven", - "description_short": "Het voorspellen van de hoogte van het stedelijk water en de riolering. Meer specifieke informatie mbt dit algoritme volgt.", - "type": null, - "category": null, - "website": null, - "status": null, - "goal": null, - "impact": null, - "proportionality": null, - "decision_making_process": "Het algoritme combineert historische data van de sensoren mbt waterstanden van het stedelijk water tot informatie over de waterstanden in de nabije toekomst", - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": null, - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": null, - "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker.", - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.254805+00:00", - "lars": "61965951", - "owner": "gemeente-utrecht" - }, - { - "name": "Onderhoud wagenpark", - "organization": "Gemeente Utrecht", - "department": "Stadsbedrijven", - "description_short": "Het voorspellen van het juiste moment waarop onderhoud nodig is bij het wagenpark. Meer specifieke informatie mbt dit algoritme volgt.", - "type": null, - "category": null, - "website": null, - "status": null, - "goal": null, - "impact": null, - "proportionality": null, - "decision_making_process": "Het algoritme combineert criteria aan een bestand van wagenparken en geeft informatie over welke wagenparken wanneer in aanmerking komen voor onderhoud", - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": null, - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": null, - "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker.", - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.261379+00:00", - "lars": "79588339", - "owner": "gemeente-utrecht" - }, - { - "name": "Objectherkenning straatafval", - "organization": "Gemeente Utrecht", - "department": "Stadsbedrijven", - "description_short": "Het geautomatiseerd herkennen van verschillende typen straatafval. Meer specifieke informatie mbt dit algoritme volgt.", - "type": null, - "category": null, - "website": null, - "status": null, - "goal": null, - "impact": null, - "proportionality": null, - "decision_making_process": "Het algoritme combineert historische data mbt kenmerken van verschillende typen straatafval tot informatie over welke type straatafval het betreft", - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": null, - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": null, - "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker.", - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.267260+00:00", - "lars": "49489486", - "owner": "gemeente-utrecht" - }, - { - "name": "Parkeerhandhaving; Inzet scanauto's", - "organization": "Gemeente Utrecht", - "department": "Vergunningen, Toezicht en Handhaving (VTH)", - "description_short": "Het controleren met scanauto's of het parkeergeld is betaald. Meer specifieke informatie mbt dit algoritme volgt.", - "type": null, - "category": null, - "website": null, - "status": null, - "goal": null, - "impact": null, - "proportionality": null, - "decision_making_process": "De scanauto maakt een scan van het kenteken en foto's van de situatie. Daarna volgt een automatische controle via het Nationaal Parkeer Register of parkeergeld betaald is. Indien het parkeergeld niet is betaald wordt de constatering automatisch aangeboden aan de handhaver die een extra controle uitvoert. ", - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": null, - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": null, - "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker", - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.272033+00:00", - "lars": "59432597", - "owner": "gemeente-utrecht" - }, - { - "name": "Parkeerhandhaving; Betalingsbereidheid", - "organization": "Gemeente Utrecht", - "department": "Vergunningen, Toezicht en Handhaving (VTH)", - "description_short": "Het monitoren van de bereidheid om parkeergeld te betalen. Meer specifieke informatie mbt dit algoritme volgt.", - "type": null, - "category": null, - "website": null, - "status": null, - "goal": null, - "impact": null, - "proportionality": null, - "decision_making_process": "Het algoritme berekent de betalingsbereidheid van parkeerders uit historische scandata van de scanauto.", - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": null, - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": null, - "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker", - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.276342+00:00", - "lars": "51939364", - "owner": "gemeente-utrecht" - }, - { - "name": "Parkeerhandhaving; Werkverdeling scanteam", - "organization": "Gemeente Utrecht", - "department": "Vergunningen, Toezicht en Handhaving (VTH)", - "description_short": "Het gericht inzetten van parkeerhandhaving met de scanauto. Meer specifieke informatie mbt dit algoritme volgt.", - "type": null, - "category": null, - "website": null, - "status": null, - "goal": null, - "impact": null, - "proportionality": null, - "decision_making_process": "Het algoritme voorspelt de bereidheid om parkeergeld te betalen per locatie en tijd uit historische scan- en transactiedata.", - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": null, - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": null, - "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker", - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.280524+00:00", - "lars": "62692755", - "owner": "gemeente-utrecht" - }, - { - "name": "Parkeren; Opbrengsten straatparkeren", - "organization": "Gemeente Utrecht", - "department": "Vergunningen, Toezicht en Handhaving (VTH)", - "description_short": "Het monitoren en begroten van de opbrengsten van straatparkeeren. Meer specifieke informatie mbt dit algoritme volgt.", - "type": null, - "category": null, - "website": null, - "status": null, - "goal": null, - "impact": null, - "proportionality": null, - "decision_making_process": "Het algoritme voorspelt de maandelijkse opbrengsten van straatparkeren uit historische betalingen van parkeergeld.", - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": null, - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": null, - "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker", - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.284601+00:00", - "lars": "54916672", - "owner": "gemeente-utrecht" - }, - { - "name": "Parkeren; Parkeerdruk", - "organization": "Gemeente Utrecht", - "department": "Vergunningen, Toezicht en Handhaving (VTH)", - "description_short": "Het monitoren van de parkeerdruk in het gebied van betaald parkeren. Meer specifieke informatie mbt dit algoritme volgt.", - "type": null, - "category": null, - "website": null, - "status": null, - "goal": null, - "impact": null, - "proportionality": null, - "decision_making_process": "Het algoritme berekent per straat en tijd de bezettinggraad van de parkeerruimte uit historische scandata van de scanauto.", - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": null, - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": null, - "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker", - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.288651+00:00", - "lars": "62248440", - "owner": "gemeente-utrecht" - }, - { - "name": "Vergunningverlening; Wonen", - "organization": "Gemeente Utrecht", - "department": "Vergunningen, Toezicht en Handhaving (VTH)", - "description_short": "Het uitvoeren van de algemene leefbaarheidstoets. Meer specifieke informatie mbt dit algoritme volgt.", - "type": null, - "category": null, - "website": null, - "status": null, - "goal": null, - "impact": null, - "proportionality": null, - "decision_making_process": "Het algoritme combineert en presentreert vastgoedgegevens, gebruikskenmerken en vergunningsgegevens van woningen.", - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": null, - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": null, - "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker", - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.292855+00:00", - "lars": "18113668", - "owner": "gemeente-utrecht" - }, - { - "name": "Handhaving drank- en horecawet", - "organization": "Gemeente Utrecht", - "department": "Vergunningen, Toezicht en Handhaving (VTH)", - "description_short": "Het gericht controleren de horeca-inrichtingen op het naleven van de drank en horecawet. Meer specifieke informatie mbt dit algoritme volgt.", - "type": null, - "category": null, - "website": null, - "status": null, - "goal": null, - "impact": null, - "proportionality": null, - "decision_making_process": "Het algoritme combineert en weegt het type horeca-inrichting met historische meldingen en maatregelen van de horeca ondernemingen.", - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": null, - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": null, - "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker", - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.297146+00:00", - "lars": "34723728", - "owner": "gemeente-utrecht" - }, - { - "name": "Toezicht en Handhaving Vastgoedmisbruik (Huisjesmelkers)", - "organization": "Gemeente Utrecht", - "department": "Vergunningen, Toezicht en Handhaving (VTH)", - "description_short": "Het gericht controleren de o.a. goed verhuurderschap op het naleven van de woningwet. Meer specifieke informatie mbt dit algoritme volgt.", - "type": null, - "category": null, - "website": null, - "status": null, - "goal": null, - "impact": null, - "proportionality": null, - "decision_making_process": "Het algoritme combineert en presentreert vastgoedgegevens middels indicatoren ter ondersteuning van de inspecteurs en toezichthouders", - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": null, - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": null, - "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een bevoegde toezichthouder of inspecteur.", - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.301337+00:00", - "lars": "38628535", - "owner": "gemeente-utrecht" - }, - { - "name": "Toezicht en Handhaving Weesfietsen", - "organization": "Gemeente Utrecht", - "department": "Vergunningen, Toezicht en Handhaving (VTH)", - "description_short": "Het gerichter inzetten van handhavers voor de leefbaarheid in de openbare ruimte ten aanzien van weesfietsen en fietswrakken als naleving van de Algemene Plaatselijke Verordening (APV). Meer specifieke informatie mbt dit algoritme volgt.", - "type": null, - "category": null, - "website": null, - "status": null, - "goal": null, - "impact": null, - "proportionality": null, - "decision_making_process": "Het algoritme combineert en presentreert handhavingsdata en meldingen middels een kaart ter ondersteuning van de handhavers en planners zodat weesfietsacties doelmatiger kunnen worden ingezet.", - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": null, - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": null, - "human_intervention": "Het algoritme geeft informatie en dit stelt een planner in staat om, mede op basis hiervan, efficienter te plannen. Het algoritme heeft dus niet het laatste woord, maar medewerker zelf.", - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.305571+00:00", - "lars": "34295566", - "owner": "gemeente-utrecht" - }, - { - "name": "Toezicht en Handhaving Vuurwerk", - "organization": "Gemeente Utrecht", - "department": "Vergunningen, Toezicht en Handhaving (VTH)", - "description_short": "Het gerichter inzetten van handhavers voor de leefbaarheid in de openbare ruimte ten aanzien van vuurwerkoverlast als naleving van de Algemene Plaatselijke Verordening (APV). Meer specifieke informatie mbt dit algoritme volgt.", - "type": null, - "category": null, - "website": null, - "status": null, - "goal": null, - "impact": null, - "proportionality": null, - "decision_making_process": "Het algoritme combineert en presentreert handhavingsdata en meldingen middels een kaart ter ondersteuning van de handhavers en planners zodat toezicht doelmatiger kunnen worden ingezet.", - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": null, - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": null, - "human_intervention": "Het algoritme geeft informatie en dit stelt een planner in staat om, mede op basis hiervan, efficienter te plannen. Het algoritme heeft dus niet het laatste woord, maar medewerker zelf.", - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.309977+00:00", - "lars": "65378449", - "owner": "gemeente-utrecht" - }, - { - "name": "Toezicht en Handhaving Corona maatregelingen", - "organization": "Gemeente Utrecht", - "department": "Vergunningen, Toezicht en Handhaving (VTH)", - "description_short": "Het gerichter inzetten van handhavers voor de leefbaarheid in de openbare ruimte ten aanzien van het naleven van Corona maatregelingen als naleving van de Algemene Plaatselijke Verordening (APV). Meer specifieke informatie mbt dit algoritme volgt.", - "type": null, - "category": null, - "website": null, - "status": null, - "goal": null, - "impact": null, - "proportionality": null, - "decision_making_process": "Het algoritme combineert en presentreert meldingen middels een kaart ter ondersteuning van de handhavers en planners zodat toezicht doelmatiger kunnen worden ingezet.", - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": null, - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": null, - "human_intervention": "Het algoritme geeft informatie en dit stelt een planner in staat om, mede op basis hiervan, efficienter te plannen. Het algoritme heeft dus niet het laatste woord, maar medewerker zelf.", - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.314253+00:00", - "lars": "23213786", - "owner": "gemeente-utrecht" - }, - { - "name": "Toezicht en Handhaving Milieu", - "organization": "Gemeente Utrecht", - "department": "Vergunningen, Toezicht en Handhaving (VTH)", - "description_short": "Het gerichter inzetten van inspecteurs op naleven van Milieuwetten door ondernemingen. Meer specifieke informatie mbt dit algoritme volgt.", - "type": null, - "category": null, - "website": null, - "status": null, - "goal": null, - "impact": null, - "proportionality": null, - "decision_making_process": "Het algoritme gebruikt mutaties in de kamer van koophandel ter ondersteuning van de inspecteurs en zodat toezicht doelmatiger kunnen worden ingezet en milieuschade kan worden voorkomen.", - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": null, - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": null, - "human_intervention": "Het algoritme geeft informatie en dit stelt een inspecteur in staat om, mede op basis hiervan, efficienter toezicht te houden. Het algoritme heeft dus niet het laatste woord, maar toezichthouder zelf.", - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.318496+00:00", - "lars": "64219439", - "owner": "gemeente-utrecht" - }, - { - "name": "Veranderingen in het aantal aanmeldingen jeugdhulp en WMO-ondersteuning als gevolg van het Coronavirus", - "organization": "Gemeente Utrecht", - "department": "Maatschappelijke Ondersteuning (MO)", - "description_short": "Het voorspellen van veranderingen in het aantal aanmeldingen jeugdhulp en Wmo-ondersteuning als gevolg van het Coronavirus. Meer specifieke informatie mbt dit algoritme volgt.", - "type": null, - "category": null, - "website": null, - "status": null, - "goal": null, - "impact": null, - "proportionality": null, - "decision_making_process": "Het algoritme combineert historische data (voorgaande jaren) en huidige data (Corona tijd) mbt aantallen aanmeldingen jeugdhulp en Wmo-ondersteuning tot informatie over het aantal aanmeldingen in de nabije toekomst. Het wordt verrijkt met praktijkervaringen van de professionals van de betrokken partners zodat scenario's kunnen worden geschetst", - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": null, - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": null, - "human_intervention": "Het algoritme geeft informatie en deze wordt besproken door medewerkers van de gemeente en partners zodat zij het goede gesprek kunnen voeren over de mogelijke ontwikkelingen in het domein van de Jeugdwet en Wmo. Op basis van de bespreking wordt het algoritme aangepast", - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.322849+00:00", - "lars": "31453237", - "owner": "gemeente-utrecht" - }, - { - "name": "Jeugdgezondheidszorg", - "organization": "Gemeente Utrecht", - "department": "Volksgezondheid (VG)", - "description_short": "Het monitoren van de ontwikkeling van kinderen van 0-4 jaar. Meer specifieke informatie mbt dit algoritme volgt.", - "type": null, - "category": null, - "website": null, - "status": null, - "goal": null, - "impact": null, - "proportionality": null, - "decision_making_process": "Het algoritme combineert informatie van het betreffende kind met historische data van andere kinderen en geeft informatie over de ontwikkeling van het kind. Bijvoorbeeld: Meetgegevens, zoals lengte en gewicht, worden vergeleken met data van grote groepen kinderen (groeicurve) en geeft informatie over de ontwikkeling van het kind.", - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": null, - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": null, - "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker.", - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.327202+00:00", - "lars": "99648448", - "owner": "gemeente-utrecht" - }, - { - "name": "Voor- en Vroegschoolse Educatie (VVE)", - "organization": "Gemeente Utrecht", - "department": "Volksgezondheid (VG)", - "description_short": "Het bepalen welke kinderen in aanmerking komen voor Voor- en Vroegschoolse Educatie (VVE). Meer specifieke informatie mbt dit algoritme volgt.", - "type": null, - "category": null, - "website": null, - "status": null, - "goal": null, - "impact": null, - "proportionality": null, - "decision_making_process": "Het algoritme combineert criteria aan een bestand van kinderen en geeft informatie over welke kinderen in aanmerking komen voor VVE in de nabije toekomst.", - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": null, - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": null, - "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker.", - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.332689+00:00", - "lars": "96289873", - "owner": "gemeente-utrecht" - }, - { - "name": "Psychosociale gezondheid", - "organization": "Gemeente Utrecht", - "department": "Volksgezondheid (VG)", - "description_short": "Het in beeld brengen van psychosociale gezondheid bij kinderen met behulp van de SDQ vragenlijst. Meer specifieke informatie mbt dit algoritme volgt.", - "type": null, - "category": null, - "website": null, - "status": null, - "goal": null, - "impact": null, - "proportionality": null, - "decision_making_process": "Het algoritme combineert criteria aan informatie uit de vragenlijst van het betreffende kind en geeft informatie bij welke kinderen er aanleiding is om in gesprek te gaan over de psychosociale gezondheid.", - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": null, - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": null, - "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker.", - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.337194+00:00", - "lars": "34715521", - "owner": "gemeente-utrecht" - }, - { - "name": "Digitale afhandeling levensonderhoud", - "organization": "Gemeente Utrecht", - "department": "Werk & Inkomen (W&I)", - "description_short": "Het toekennen van een uitkering aan bewoners die daar recht op hebben. Meer specifieke informatie mbt dit algoritme volgt.", - "type": null, - "category": null, - "website": null, - "status": null, - "goal": null, - "impact": null, - "proportionality": null, - "decision_making_process": "Het algoritme controleert op basis van ingevulde velden in het aanvraagformulier van bewoners of bewoners in aanmerking komen voor een uitkering", - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": null, - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": null, - "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker.", - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.341321+00:00", - "lars": "46325235", - "owner": "gemeente-utrecht" - }, - { - "name": "Fraude bestrijding", - "organization": "Gemeente Utrecht", - "department": "Werk & Inkomen (W&I)", - "description_short": "Het bestrijden van fraude door bewoners bij dienstverlening bij Werk en Inkomen producten. Meer specifieke informatie mbt dit algoritme volgt.", - "type": null, - "category": null, - "website": null, - "status": null, - "goal": null, - "impact": null, - "proportionality": null, - "decision_making_process": "Het algoritme filtert op onregelmatigheden in de logische samenhang van objectieve data. Het geeft daarmee een voorzet (informatie) over op welke adressen er mogelijk sprake kan zijn van fraude. Deze data wordt opgesteld uit de gegevens van WenI, het inlichtingenbureau en publieksdienstverlening. ", - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": null, - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": null, - "human_intervention": "Het algoritme neemt geen zelfstandig besluit. Wanneer een uitdraai wordt gemaakt van deze gegevens, wordt handmatig bekeken of er inderdaad sprake is van een onregelmatigheid. Vervolgens worden gegevens van het betreffende adres verrijkt met gegevens van andere organisaties (mits dit aan de orde is) en wordt als laatste in gezamenlijkheid aan de casustafel bekeken of het adres gecontroleerd gaat worden.", - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.346076+00:00", - "lars": "18714832", - "owner": "gemeente-utrecht" - }, - { - "name": "Re-integratie naar werk - Matchen op werk", - "organization": "Gemeente Utrecht", - "department": "Werk & Inkomen (W&I)", - "description_short": "Het begeleiden van bewoners naar werk door het beter kunnen matchen van werkloze bewoners aan vacatures. Mooi matchen is een onderzoek naar kansrijke beroepsprofielen waarbij bijvoorbeeld bepaald wordt dat er in periode X relatief meer behoefte is aan kappers en relatief minder behoefte is aan verkeersregelaars. Meer specifieke informatie mbt dit algoritme volgt.", - "type": null, - "category": null, - "website": null, - "status": null, - "goal": null, - "impact": null, - "proportionality": null, - "decision_making_process": "Het algoritme combineert criteria aan een bestand van bewoners en geeft een voorzet (informatie) welke bewoners op basis van de kansrijke beroepsprofielen voldoen aan de criteria die de markt stelt aan deze vacatures. ", - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": null, - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": null, - "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker.", - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.350558+00:00", - "lars": "21277971", - "owner": "gemeente-utrecht" - }, - { - "name": "Toekennen uitkering participatiewet", - "organization": "Gemeente Utrecht", - "department": "Werk & Inkomen (W&I)", - "description_short": "Op basis van rekenregels wordt bepaald welke norm moet worden toegepast voor deze inwoner. Meer specifieke informatie mbt dit algoritme volgt.", - "type": null, - "category": null, - "website": null, - "status": null, - "goal": null, - "impact": null, - "proportionality": null, - "decision_making_process": "Het algoritme combineert criteria aan een bestand van bewoners en geeft een voorzet (informatie) welke norm moet worden toegepast. ", - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": null, - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": null, - "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker.", - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.355182+00:00", - "lars": "92734630", - "owner": "gemeente-utrecht" - }, - { - "name": "Re-integratie naar werk - Bepalen arrangement", - "organization": "Gemeente Utrecht", - "department": "Werk & Inkomen (W&I)", - "description_short": "Op basis van kenmerken van de klant wordt een indeling in de arrangementen gedaan. Meer specifieke informatie mbt dit algoritme volgt.", - "type": null, - "category": null, - "website": null, - "status": null, - "goal": null, - "impact": null, - "proportionality": null, - "decision_making_process": "Het algoritme geeft op basis van geprogrammeerde beslisregels een suggestie van een arrangement dat iets zegt over de afstand tot de arbeidsmarkt. Op basis van deze arrangementsindeling wordt specifieke dienstverlening ingezet. ", - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": null, - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": null, - "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme geeft een suggestie voor een arrangement, dat kan worden overschreven door een medewerker als die een andere inschatting maakt. ", - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.359701+00:00", - "lars": "26932183", - "owner": "gemeente-utrecht" - }, - { - "name": "Woninginbraakvoorspeller", - "organization": "Gemeente Utrecht", - "department": "Veiligheid", - "description_short": "Het voorspellen van het risico op woninginbraak per gebied voor de komende twee weken. Meer specifieke informatie mbt dit algoritme volgt.", - "type": null, - "category": null, - "website": null, - "status": null, - "goal": null, - "impact": null, - "proportionality": null, - "decision_making_process": "Het algoritme combineert historische data mbt woninginbraak met kenmerken van woningen, buurtkenmerken en de omstandigheden ten tijde van de inbraak en geeft een voorzet (informatie) over een verhoogde kans op woninginbraak in een bepaald gebied in een bepaalde periode", - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": null, - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": null, - "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker.", - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.364380+00:00", - "lars": "22789541", - "owner": "gemeente-utrecht" - }, - { - "name": "Hotspot aanpak", - "organization": "Gemeente Utrecht", - "department": "Veiligheid", - "description_short": "Het beschrijven waar en wanneer delicten hebben plaats gevonden in de openbare ruimte. Meer specifieke informatie mbt dit algoritme volgt.", - "type": null, - "category": null, - "website": null, - "status": null, - "goal": null, - "impact": null, - "proportionality": null, - "decision_making_process": "Het algoritme plot beschrijvende data over delicten op de kaart en geeft een beeld (informatie) van hotspot locaties in het recente verleden", - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": null, - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": null, - "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker.", - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.369089+00:00", - "lars": "78136377", - "owner": "gemeente-utrecht" - }, - { - "name": "Risico-indicatoren drugspanden", - "organization": "Gemeente Utrecht", - "department": "Veiligheid", - "description_short": "Het verklaren welke kenmerken van panden vaak samenhangen met het vervaardigen van drugs. Meer specifieke informatie mbt dit algoritme volgt.", - "type": null, - "category": null, - "website": null, - "status": null, - "goal": null, - "impact": null, - "proportionality": null, - "decision_making_process": "Het algoritme combineert historische data mbt frauduleuze activiteiten met een bestand van pandkenmerken en geeft een voorzet (informatie) over de omvang en kenmerken van de groep panden met een hoog risico op het plaatsvinden van vervaardigen van drugs in elke buurt.", - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": null, - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": null, - "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker.", - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.373288+00:00", - "lars": "59969756", - "owner": "gemeente-utrecht" - }, - { - "name": "Risico-indicatoren witwassen panden", - "organization": "Gemeente Utrecht", - "department": "Veiligheid", - "description_short": "Het verklaren welke kenmerken van panden vaak samenhangen met witwassen. Deze toepassing vindt plaats binnen de City Deal \"Zicht op Ondermijning\". Meer specifieke informatie mbt dit algoritme volgt.", - "type": null, - "category": null, - "website": null, - "status": null, - "goal": null, - "impact": null, - "proportionality": null, - "decision_making_process": "Het algoritme combineert historische data mbt frauduleuze activiteiten met een bestand van pandkenmerken en geeft een voorzet (informatie) over de omvang en kenmerken van de groep panden met een hoog risico op het plaatsvinden van witwassen in elke buurt.", - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": null, - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": null, - "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker.", - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.378036+00:00", - "lars": "17643694", - "owner": "gemeente-utrecht" - }, - { - "name": "Risico-indicatoren & voorspelmodel jonge aanwas in de drugscriminaliteit", - "organization": "Gemeente Utrecht", - "department": "Veiligheid", - "description_short": "Het verklaren welke indicatoren jongeren kwetsbaar maken om betrokken te raken in de drugscriminaliteit en het voorspellen in welke buurten veel kwetsbare jongeren wonen. Deze toepassing vindt plaats binnen de City Deal \"Zicht op Ondermijning\". Meer specifieke informatie mbt dit algoritme volgt.", - "type": null, - "category": null, - "website": null, - "status": null, - "goal": null, - "impact": null, - "proportionality": null, - "decision_making_process": "Het algoritme combineert historische data mbt jeugd en criminaliteit met een bestand van jongeren en geeft een voorzet (informatie) over de omvang en kenmerken van de groep kwetsbare jongeren in elke buurt.", - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": null, - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": null, - "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker.", - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.382276+00:00", - "lars": "67377536", - "owner": "gemeente-utrecht" - }, - { - "name": "Stemgerechtigden", - "organization": "Gemeente Utrecht", - "department": "Burgerzaken (PBZ)", - "description_short": "Het bepalen welke bewoners stemgerechtigd zijn voor verkiezingen. Meer specifieke informatie mbt dit algoritme volgt.", - "type": null, - "category": null, - "website": null, - "status": null, - "goal": null, - "impact": null, - "proportionality": null, - "decision_making_process": "Het algoritme combineert criteria aan een bestand van bewoners en geeft een informatie over bij welke bewoners wel en niet stemgerechtigd zijn voor verkiezingen", - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": null, - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": null, - "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker", - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.386906+00:00", - "lars": "54713329", - "owner": "gemeente-utrecht" - }, - { - "name": "Herkennen en anonimiseren van privacygevoelige informatie in documenten", - "organization": "Gemeente Utrecht", - "department": "Burgerservicenummers (BSN)", - "description_short": "Het geautomiseerd herkennen en anonimiseren van privacygevoelige informatie in documenten dmv software. Meer specifieke informatie mbt dit algoritme volgt.", - "type": null, - "category": null, - "website": null, - "status": null, - "goal": null, - "impact": null, - "proportionality": null, - "decision_making_process": "Het algoritme combineert criteria mbt privacygevoelige informatie met informatie in documenten en geeft een voorzet over welke informatie privacygevoelig is", - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": null, - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": null, - "human_intervention": "Het algoritme geeft informatie en dit stelt een medewerker in staat om, mede op basis hiervan, het juiste besluit te nemen. Het algoritme heeft dus niet het laatste woord, maar een medewerker", - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.391411+00:00", - "lars": "81878651", - "owner": "gemeente-utrecht" - }, - { - "name": "Parkeercontrole", - "organization": "Gemeente Rotterdam", - "department": "Stadsbeheer Parkeervoorzieningen", - "description_short": "De gemeente Rotterdam wil de stad graag leefbaar, bereikbaar en veilig houden. Het aantal auto\u2019s in de stad beperken draagt daaraan bij. Dat doet de gemeente onder andere door gratis parkeren op P+R terreinen aan te moedigen en gebruik van het openbaar vervoer te stimuleren. Binnenin de stad is parkeren betaald en voert de gemeente parkeercontroles uit. Zo zorgen we ervoor dat de schaarse parkeerruimte vooral beschikbaar blijft voor bewoners en ondernemers.", - "type": "Zelflerend", - "category": "Veiligheid en handhaving", - "website": "https://algoritmeregister.rotterdam.nl/p/Onzealgoritmes/53761720551735697", - "status": "In gebruik", - "goal": "De gemeente Rotterdam wil de stad graag leefbaar, bereikbaar en veilig houden. Het aantal auto\u2019s in de stad beperken draagt daaraan bij. Dat doet de gemeente onder andere door gratis parkeren op P+R terreinen aan te moedigen en gebruik van het openbaar vervoer te stimuleren.", - "impact": "Als er geen vergunning is of niet betaald is voor het parkeren, dan wordt het kenteken doorgestuurd naar een parkeerhandhaver van de gemeente Rotterdam. Deze controleert of er echt niet is betaald en bekijkt de gemaakte scanfoto\u2019s. Als er geen sprake is van een bijzondere situatie, dan volgt een parkeerboete en wordt een \u2018naheffingsaanslag parkeerbelasting\u2019 uitgeschreven.", - "proportionality": "Er wordt gekeken naar parkeervergunning, bezoekersregeling, invalidenplek en pechgevallen. Er wordt altijd gecontroleerd door een mens voordat er een boete uitgeschreven wordt.", - "decision_making_process": "Parkeerbeheer", - "documentation": null, - "competent_authority": "Gemeente Rotterdam", - "lawful_basis": "Algemeen belang", - "iama": null, - "iama_description": null, - "dpia": "Ja", - "dpia_description": null, - "objection_procedure": "https://www.rotterdam.nl/loket/bezwaar-belastingaanslag/", - "standard_version": "0.1.0", - "uuid": null, - "url": "https://algoritmeregister.rotterdam.nl/p/Onzealgoritmes/53761720551735697", - "contact_email": "algoritmetoezichtbco@rotterdam.nl", - "area": "Rotterdam", - "lang": "Nederlands", - "revision_date": null, - "description": "De gemeente Rotterdam wil de stad graag leefbaar, bereikbaar en veilig houden. Het aantal auto\u2019s in de stad beperken draagt daaraan bij. Dat doet de gemeente onder andere door gratis parkeren op P+R terreinen aan te moedigen en gebruik van het openbaar vervoer te stimuleren. Binnenin de stad is parkeren betaald en voert de gemeente parkeercontroles uit. Zo zorgen we ervoor dat de schaarse parkeerruimte vooral beschikbaar blijft voor bewoners en ondernemers. De gemeente Rotterdam zet scanauto\u2019s met camera\u2019s in om parkeercontroles uit te voeren. Deze camera\u2019s scannen kentekens om te zien of de geparkeerde auto\u2019s een parkeervergunning hebben, zijn aangemeld via 'bezoekersparkeren' of dat er betaald is om te parkeren. De camera\u2019s op de scanauto gebruiken een beeldherkenningsalgoritme om kentekens te identificeren. Het kentekennummer komt binnen bij het Nationaal Parkeerregister en de vergunningendatabase van de gemeente Rotterdam. Hier wordt gecontroleerd of de auto het recht heeft om geparkeerd te staan. Als er geen vergunning is of niet betaald is voor het parkeren, dan wordt het kenteken doorgestuurd naar een parkeerhandhaver van de gemeente Rotterdam. Deze controleert of er echt niet is betaald en bekijkt de gemaakte scanfoto\u2019s. Als er geen sprake is van een bijzondere situatie, dan volgt een parkeerboete en wordt een \u2018naheffingsaanslag parkeerbelasting\u2019 uitgeschreven.", - "application_url": null, - "publiccode": null, - "mprd": "Nee", - "source_data": "Het kentekennummer komt binnen bij het Nationaal Parkeerregister en de vergunningendatabase van de gemeente Rotterdam. Hier wordt gecontroleerd of de auto het recht heeft om geparkeerd te staan.", - "methods_and_models": "De camera\u2019s op de scanauto gebruiken een beeldherkenningsalgoritme om kentekens te identificeren.", - "monitoring": "Als er geen vergunning is of niet betaald is voor het parkeren, dan wordt het kenteken doorgestuurd naar een parkeerhandhaver van de gemeente Rotterdam. Deze controleert of er echt niet is betaald en bekijkt de gemaakte scanfoto\u2019s. Als er geen sprake is van een bijzondere situatie, dan volgt een parkeerboete en wordt een \u2018naheffingsaanslag parkeerbelasting\u2019 uitgeschreven.", - "human_intervention": "Ja, bij twijfel wordt er niet gehandhaafd.", - "risks": "Het belangrijkste risico is dat het systeem een kenteken verkeerd herkent en dat iemand die het niet verdient een boete krijgt. Dit kan gebeuren als een karakter op het kenteken foutief wordt herkend.", - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.395982+00:00", - "lars": "33947772", - "owner": "gemeente-rotterdam" - }, - { - "name": "Aardgasvrij", - "organization": "Gemeente Rotterdam", - "department": "Duurzaam", - "description_short": "In Rotterdam willen we overstappen op duurzame energie. Dat betekent nogal wat. Op dit moment gebruiken we nog volop aardgas. Dit gebruiken we nu vooral voor verwarmen en koken. Hoe gaan we dat straks doen met die andere warmtebronnen? Hoe zorgen we voor een goed en betaalbaar alternatief voor de hele stad? En als we een oplossing vinden, hoe voeren we die dan het beste uit?", - "type": "Rule based", - "category": "Infrastructuur", - "website": "https://algoritmeregister.rotterdam.nl/p/Onzealgoritmes/53761720551735605", - "status": "In gebruik", - "goal": "Op dit moment gebruiken we nog volop aardgas, vooral voor verwarmen en koken. Hoe gaan we dat straks doen met die andere warmtebronnen? Hoe zorgen we voor een goed en betaalbaar alternatief voor de hele stad?", - "impact": null, - "proportionality": null, - "decision_making_process": "Rotterdamse Transitievisie Warmte", - "documentation": "https://duurzaam010.nl/nieuws/rotterdamse-transitievisie-warmte/", - "competent_authority": "Gemeente Rotterdam", - "lawful_basis": "Paris Climate Agreement 2050 aardgasvrij", - "iama": null, - "iama_description": null, - "dpia": "Ja", - "dpia_description": "PRA DPIA uitgevoerd in December 2021. Risicoprofiel Laag.", - "objection_procedure": "Niet van toepassing", - "standard_version": "0.1.0", - "uuid": null, - "url": "https://algoritmeregister.rotterdam.nl/p/Onzealgoritmes/53761720551735605", - "contact_email": "https://duurzaam010.nl/contact/", - "area": "Rotterdam", - "lang": "Nederlands", - "revision_date": null, - "description": "In Rotterdam willen we overstappen op duurzame energie. Dat betekent nogal wat. Op dit moment gebruiken we nog volop aardgas. Dit gebruiken we nu vooral voor verwarmen en koken. Hoe gaan we dat straks doen met die andere warmtebronnen? Hoe zorgen we voor een goed en betaalbaar alternatief voor de hele stad? En als we een oplossing vinden, hoe voeren we die dan het beste uit? Als gemeente hebben we uitgebreid onderzoek gedaan naar deze vragen. Dit leverde genoeg antwoorden op om een plan te schrijven. In de Rotterdamse Transitievisie Warmte staat: - waarom Rotterdam overstapt op een alternatief voor aardgas; - wat de beste manier is om duurzaam te verwarmen, koelen en koken; - wanneer verschillende wijken zouden kunnen overstappen op duurzame bronnen; - hoe we de overstap als gemeente willen uitvoeren en begeleiden. De Rotterdamse Transitievisie Warmte is door de gemeenteraad vastgesteld in 2021. Het is een advies aan het college van burgemeester en wethouders vanaf 2022. Of de plannen precies zo worden uitgevoerd, staat dus niet vast. Zeker de planning kan nog veranderen. Ons algoritme heeft gekeken naar alle Rotterdamse wijken en daarvan een overzichtskaart gemaakt. Hierop staat per wijk informatie over een makkelijke toevoer van alternatieve energie.", - "application_url": null, - "publiccode": null, - "mprd": "Ja", - "source_data": "Voorletters, tussenvoegsel, achternaam, adres, email, telefoonnummer, status", - "methods_and_models": "Het RAM (Rotterdam aardgasvrij model) is onderdeel van de WAT-kaart berekening, waarbij de inpandige berekeningen van Nieman zijn vertaald naar rekenregels, naast de aanvullende rekenregels COMSOF)", - "monitoring": "Uitkomsten van het model worden gevalideerd door afdeling Duurzaam door bezoek aan woning voor overleg.", - "human_intervention": "Uitkomsten van het model worden gevalideerd door afdeling Duurzaam door bezoek aan woning voor overleg.", - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.401171+00:00", - "lars": "81267141", - "owner": "gemeente-rotterdam" - }, - { - "name": "SpotRotterdam", - "organization": "Gemeente Rotterdam", - "department": "Stadsontwikkeling - Economie, Team Economische Ontwikkeling Stad", - "description_short": "In Rotterdam kan het op veel plaatsen erg druk zijn. Veel mensen vinden het fijn om afstand te houden tot anderen om een coronabesmetting te vermijden. Daarom biedt de gemeente Rotterdam SpotRotterdam aan. Dat is een online druktemeter waarmee bewoners en bezoekers live kunnen zien hoe rustig of druk het is in winkelcentra, parken, markten en op stations.", - "type": "Zelflerend", - "category": "Veiligheid en handhaving", - "website": "https://algoritmeregister.rotterdam.nl/p/Onzealgoritmes/53761720551735397", - "status": "Buiten gebruik", - "goal": "De gemeente gebruikt algoritmen om:\n\n* aan de hand van de anonieme locatiegegevens in een gebied te voorspellen hoeveel personen zich daar bevinden\n* op basis van de voorspelde hoeveelheid personen in een gebied een schatting te maken van de actuele drukte in dit gebied.\n\nDe gegevens uit de BAG en de OpenStreetMap vormen de basis voor de kaart van de stad. De stad is ingedeeld in 500 verschillende gebieden: buurten, parken, winkelstraten en zo meer. Voor al deze locaties haalt SpotRotterdam elke 15 minuten real-time data op bij Resono. Deze data verzamelt Resono van gebruikers die daar toestemming voor hebben gegeven. Als een persoon in een bepaald gebied binnen Rotterdam komt, telt Resono deze persoon. Op de data van Resono past SpotRotterdam een berekening toe om een schatting te maken van de actuele drukte in de gebieden. Deze schatting wordt omgezet in relatieve drukte door de gegevens te relateren aan de drukste en de rustigste momenten in de afgelopen dagen. De informatie over relatieve drukte laat SpotRotterdam zien met behulp van een patroon in de app dat weergeeft of het druk is of rustig. Daarnaast laat SpotRotterdam de drukte zien in vijf categorie\u00ebn van 'veel rustiger dan normaal' tot 'veel drukker dan normaal'.", - "impact": null, - "proportionality": "Het algoritme verwerkt geen informatie die kan leiden tot discriminatie. SpotRotterdam verwerkt geen persoonsgegevens als leeftijd, geslacht en zo meer. Het systeem houdt allen tellingen bij waardoor de informatie op geen enkele wijze herleidbaar is tot een natuurlijk persoon. Om deze reden kunnen personen bijvoorbeeld dus ook niet gevolgd worden. Ook past de gemeente SpotRotterdam niet toe in andere uitvoeringsprocessen, waarbij er wel sprake kan zijn van gevolgen voor individuele personen.", - "decision_making_process": null, - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": "info@spotrotterdam.nl", - "area": "Rotterdam", - "lang": "Nederlands", - "revision_date": null, - "description": "In Rotterdam kan het op veel plaatsen erg druk zijn. Veel mensen vinden het fijn om afstand te houden tot anderen om een coronabesmetting te vermijden. Daarom biedt de gemeente Rotterdam SpotRotterdam aan. Dat is een online druktemeter waarmee bewoners en bezoekers live kunnen zien hoe rustig of druk het is in winkelcentra, parken, markten en op stations.\n\nDoor het gebruik van SpotRotterdam kunnen bewoners en bezoekers zelf kiezen voor een rustige locatie of een geschikt moment om op een veilige manier te winkelen, een terrasje te pakken of boodschappen te doen. Hierbij zijn ook de Rotterdamse ondernemers gebaat. SpotRotterdam is zo een hulpmiddel om het gewone leven en de Rotterdamse economie draaiende te houden.", - "application_url": "www.spotrotterdam.nl", - "publiccode": null, - "mprd": "Ja", - "source_data": "Bij de ontwikkeling van SpotRotterdam heeft gemeente gebruikgemaakt van algoritmen. Hieronder volgt een verantwoording van dit gebruik. Deze verantwoording bevat een overzicht van de belangrijkste digitale gegevensbronnen die gebruikt zijn bij de ontwikkeling en in de toepassing van het algoritme.\n\nSpotRotterdam gebruikt drie databronnen:\n\n1. BAG-data: Basisregistratie Adressen en Gebouwen: De BAG bevat gegevens over adressen en gebouwen. Meer informatie over deze data vindt u op de website van het Kadaster .\n2. Anonieme locatiegegevens: Om de drukte in gebieden te kunnen bepalen heeft de gemeente het bedrijf Resono ingeschakeld. Dit bedrijf benut anonieme locatiegegevens van appgebruikers die toestemming hebben gegeven om hun locatiegegevens te delen.\n3. OpenStreetMap: SpotRotterdam haalt informatie uit de OpenStreetMap. Het gaat onder meer om adressen van musea en bedrijven en afbeeldingen van gebieden en plaatsen. Deze informatie gebruikt SpotRotterdam om bijvoorbeeld de contactgegevens van winkels weer te geven in de app. Deze gegevens hebben de winkels zelf verstrekt. ", - "methods_and_models": null, - "monitoring": null, - "human_intervention": "Resono controleert de databron met de tellingen. Resono houdt bijvoorbeeld in de gaten of er beschadigde data tussen zitten. Als dat het geval is, informeert Resono de gemeente tijdig om dit op te lossen. Verder controleert Resono het model dat voorspelt hoeveel personen zich in een gebied bevinden.Omdat veranderingen in straatnamen zelden zijn, komen er zelden veranderingen voor in de data uit de BAG en OpenStreetMap. Dat betekent dat er geen menselijk toezicht nodig is om vanuit SpotRotterdam deze databronnen in de gaten te houden. Als er iets verkeerd gaat met de techniek van SpotRotterdam, dan is het enige gevolg dat er verkeerde tellingen in de applicatie komen te staan. Er is gekozen om geen permanent toezicht in te richten op SpotRotterdam gezien de geringe consequenties.", - "risks": "Het kan voorkomen dat de drukte die SpotRotterdam weergeeft niet overeenkomt met de drukte in het gebied. Daarom informeert de gemeente de gebruikers van SpotRotterdam dat het hun eigen verantwoordelijkheid blijft om voldoende afstand te houden en drukke plekken te vermijden. Daarnaast kunnen gebruikers van de app hun eigen mening over de drukte invoeren. Deze gegevens kunnen helpen om na te gaan of de drukte die de app opgeeft klopt met het druktebeeld dat app-gebruikers op dat moment hebben. Ook zorgt de gemeente ervoor dat bedrijven en andere partijen de gemeente kunnen benaderen om vragen te stellen over het gebied waarin zij gevestigd zijn.", - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.405911+00:00", - "lars": "22734277", - "owner": "gemeente-rotterdam" - }, - { - "name": "Heronderzoeken Uitkeringsgerechtigden", - "organization": "Gemeente Rotterdam", - "department": "Cluster Werk & Inkomen", - "description_short": "In Rotterdam doet iedereen mee. Ook inwoners die zelf niet over voldoende inkomen of vermogen beschikken. Zij ontvangen dan meestal van de gemeente een uitkering. Het cluster Werk & Inkomen (W&I) van de gemeente Rotterdam onderzoekt en beoordeelt regelmatig of de uitkering die inwoners ontvangen rechtmatig is en nog aansluit bij de situatie waarin zij zitten.", - "type": "Supervised learning", - "category": "Sociale zekerheid", - "website": "https://algoritmeregister.rotterdam.nl/p/Onzealgoritmes/53761720551735604", - "status": "Buiten gebruik", - "goal": "Het model doet een voorspelling voor de kans op onrechtmatigheid of juist rechtmatigheid, door te kijken naar de in de administratie bekende gegevens van burgers bij wie in eerdere jaren een onderzoek naar de rechtmatigheid heeft plaatsgevonden. Die conclusie kan zijn geweest dat de uitkering rechtmatig is verstrekt; of dat de eerder verstrekte uitkering niet aansloot op de feitelijke situatie (onrechtmatigheid).\n\nOp basis van deze historische gegevens, kan er een voorspelling worden gedaan over de kans op rechtmatigheid of onrechtmatigheid bij de huidige uitkeringsgerechtigden. Die voorspelling wordt dus gedaan op basis van de in onze administratie bekende gegevens van huidige uitkeringsgerechtigden. De uitkomst van het model is een \u2018risico-inschattingsgetal\u2019 dat varieert tussen 0 (grote kans op rechtmatigheid) en 1 (grote kans op onrechtmatigheid). De uitkeringsgerechtigden met het hoogste risico-inschattingsgetal worden uitgenodigd voor een onderzoeksgesprek, tenzij er bijvoorbeeld onlangs al een onderzoek naar de rechtmatigheid heeft plaatsgevonden. Jaarlijks wordt opnieuw bepaald hoeveel uitkeringsgerechtigden worden uitgenodigd op basis van het risico-inschattingsmodel.\n\nHet model wordt ieder jaar opnieuw ontwikkeld, omdat er elk jaar nieuwe onderzoeksdata beschikbaar komen. De informatie uit recente onderzoeken naar de rechtmatigheid worden dus steeds meegenomen bij de ontwikkeling van een nieuw model. Het model voor 2022 is op dit moment nog in ontwikkeling.", - "impact": null, - "proportionality": "Het algoritme verwerkt geen informatie die kan leiden tot discriminatie, zoals nationaliteit, leeftijd of gezondheidstoestand. Daarnaast onderzoekt de gemeente of er informatie in het model wordt gebruikt die kan samenhangen met nationaliteit of afkomst, zoals taalkennis. Zo wordt de kans op discriminatie of vooringenomenheid voorkomen. Bovendien doet het model geen uitspraak over rechtmatigheid of onrechtmatigheid: het onderzoek dat voor die uitspraak vereist is, wordt altijd uitgevoerd door een medewerker. Dat onderzoek gebeurt altijd op dezelfde wijze, of de uitkeringsgerechtigde nu is uitgenodigd op basis van het risico-inschattingsmodel of op basis van \u00e9\u00e9n van de andere selectiemethoden.", - "decision_making_process": null, - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": "14 010", - "area": "Rotterdam", - "lang": "Nederlands", - "revision_date": null, - "description": "In Rotterdam doet iedereen mee. Ook inwoners die zelf niet over voldoende inkomen of vermogen beschikken. Zij ontvangen dan meestal van de gemeente een uitkering. Het cluster Werk & Inkomen (W&I) van de gemeente Rotterdam onderzoekt en beoordeelt regelmatig of de uitkering die inwoners ontvangen rechtmatig is en nog aansluit bij de situatie waarin zij zitten.\n\nUitkeringsgerechtigden kunnen daarom worden uitgenodigd voor een onderzoeksgesprek. Om te bepalen wie een uitnodiging krijgt gebruikt de gemeente verschillende selectie- methoden, waaronder een risico-inschattingsmodel. Dit model helpt de gemeente om in te schatten bij welke uitkeringsgerechtigden de kans groot is dat de uitkering niet (meer) aansluit op de situatie van de uitkeringsgerechtigde (onrechtmatigheid). Dat heeft twee voordelen. Dit helpt de gemeente om omvangrijke terugvorderingen te voorkomen. Bovendien worden uitkeringsgerechtigden waarbij de kans op onrechtmatigheid klein wordt geacht, minder snel voor een onderzoeksgesprek uitgenodigd.\n\nHet risico-inschattingsmodel maakt gebruik van een voorspellend algoritme. Dit algoritme gebruikt gegevens die het cluster W&I nodig heeft om haar wettelijke taken uit te voeren en de uitkering te kunnen verstrekken. Het gaat om gegevens als de hoogte van de uitkering, de gezinssituatie, maar ook om competenties en kwaliteiten van de werkzoekende, die van belang zijn voor diens kansen op de arbeidsmarkt. De gemeente gebruikt alleen gegevens uit de eigen administratie.\n\nHet risico-inschattingsmodel wordt alleen gebruikt voor de selectie van uitkeringsgerechtigden voor een onderzoeksgesprek. Op basis van het model worden geen uitspraken gedaan over de rechtmatige of onrechtmatige verstrekking van uitkering. Een medewerker van de gemeente Rotterdam beoordeelt het recht op een uitkering, want dat is afhankelijk van veel factoren en is bovendien maatwerk. Het algoritme neemt dus geen besluiten en schrijft ook geen besluiten voor.\n\nHet model wordt ieder jaar opnieuw ontwikkeld, omdat er elk jaar nieuwe onderzoeksdata beschikbaar komen. De informatie uit recente onderzoeken naar de rechtmatigheid worden dus steeds meegenomen bij de ontwikkeling van een nieuw model. Het model voor 2022 is op dit moment nog in ontwikkeling.", - "application_url": null, - "publiccode": null, - "mprd": "Ja", - "source_data": "Gemeente Rotterdam onderzoekt en beoordeelt regelmatig of mensen die een uitkering krijgen daar nog recht op hebben. Uitkeringsgerechtigden kunnen daarom worden uitgenodigd voor een onderzoeksgesprek. Om te bepalen wie een uitnodiging krijgt, maakt de gemeente gebruik van verschillende selectiemethoden. E\u00e9n daarvan is een risico-inschattingsmodel met een voorspellend algoritme. Deze verantwoording bevat een overzicht van de belangrijkste digitale gegevensbronnen die gebruikt zijn bij de ontwikkeling en in de toepassing van het algoritme.\n\nHet risico-inschattingsmodel gebruikt 2 databronnen:\n\n1. Socrates: Socrates is het uitkeringsadministratie-systeem. Hierin wordt de hoogte van de verstrekte uitkering vastgesteld en vastgelegd. In dit systeem zijn gegevens opgenomen over bijvoorbeeld de woon-/leefsituatie van de uitkeringsgerechtigde.\n2. RWM/Raak: RWM/Raak is het systeem waarin gegevens over de re-integratie van werkzoekenden worden vastgelegd. Het gaat om gegevens over de competenties en kwaliteiten van de werkzoekende die van belang zijn voor diens kansen op de arbeidsmarkt, \u00e9n de trajecten die worden uitgezet om de kans op werk te vergroten.\n\nHet gaat om informatie die binnen de gemeente is vastgelegd in het kader van de uitvoering van de Participatiewet. Er vindt g\u00e9\u00e9n koppeling plaats met andere databestanden.", - "methods_and_models": null, - "monitoring": null, - "human_intervention": "Het risico-inschattingsmodel bepaalt niet of iemand rechtmatig of onrechtmatig een uitkering ontvangt. Met het model wordt wel bepaald welke uitkeringsgerechtigden worden uitgenodigd voor een onderzoeksgesprek. Een deskundige inkomensconsulent van de afdeling Werk & Inkomen van de gemeente Rotterdam voert dit onderzoek uit. Na uitvoering van het onderzoek bepaalt de inkomensconsulent of de uitkering van de werkzoekende rechtmatig of onrechtmatig is verstrekt en of deze nog past bij de situatie waarin de uitkeringsgerechtigde zich bevindt.", - "risks": "Voor het bepalen van het risico van een algoritme gebruikt de gemeente Rotterdam een vastgesteld model. Het risico-inschattingsmodel is aangemerkt als een hoog-risico algoritme. De gemeente neemt daarom extra veiligheidsmaatregelen. Denk hierbij aan maatregelen die ervoor zorgen dat er goed toezicht is op de ontwikkeling en het gebruik van het model. Zo wordt er specifiek gekeken naar de ethische risico\u2019s en kijkt een externe toezichtscommissie mee met het ontwerp en het gebruik van het model. Deze commissie is er naar verwachting begin 2022. Als er sprake is van een algoritme in de categorie hoog-risico, dan is een menselijke toets onderdeel van het werkproces waarin het desbetreffende algoritme wordt gebruikt.\n\nDe kans op vooringenomenheid wordt beperkt doordat het risico-inschattingsmodel slechts wordt gebruikt om te bepalen wie een uitnodiging voor een onderzoeksgesprek ontvangt. Het algoritme bepaalt niet of iemand rechtmatig of onrechtmatig een uitkering ontvangt. Dit doen inkomensconsulenten van de afdeling W&I. Zij doen uitvoerig onderzoek naar de situatie, samen met de uitkeringsgerechtigde. Een uitkering verstrekken is immers maatwerk en gebeurt op individueel niveau. ", - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.410821+00:00", - "lars": "36585638", - "owner": "gemeente-rotterdam" - }, - { - "name": "Kwaliteitsbepaling van de foto", - "organization": "Rijksdienst Voor Identiteitsgegevens", - "department": "Directie Informatievoorziening en Systemen, afdeling Reisdocumentensystemen", - "description_short": "Technische ondersteuning voor het verifi\u00ebren van de kwaliteit van de foto.", - "type": "Regelgebaseerd", - "category": "Basisregistratie, identiteitsgegevens", - "website": null, - "status": "In gebruik", - "goal": "Technische ondersteuning voor het verifi\u00ebren van de kwaliteit van de foto.", - "impact": "Als de foto niet voldoet aan de vastgestelde kwaliteitscriteria, moet er een nieuwe foto aangeleverd worden door de burger.", - "proportionality": "De inzet van het algoritme bespaart tijd en geld. Het algoritme kijkt alleen naar de kwaliteit van de foto, zodat de hoogste kwaliteit foto's in het identiteitsdocument worden opgenomen. Het algoritme is niet bedoeld om personen te herkennen. \n\nDe kwaliteit van de foto speelt een belangrijke rol bij het gebruik van een reisdocument, aangezien de identiteitscontrole afhankelijk is van de kwaliteit van de foto. Hogere kwaliteit zorgt voor betere prestaties en daarmee bijvoorbeeld voor een kleinere kans op onterechte afwijzing in het vervolgproces van identiteitsverificatie (bijvoorbeeld bij grenspassage bij e-gates).\n\nOmdat zowel menselijke als automatische systeembeslissingen kunnen leiden tot fouten bij kwaliteitsmetingscontroles, verkleint de samenvoeging van de menselijke en automatische systeembeslissing het risico van deze fouten.", - "decision_making_process": null, - "documentation": null, - "competent_authority": null, - "lawful_basis": "\u2022\tPaspoortwet artikel 3 lid 2 geeft aan dat een reisdocument is voorzien van de gezichtsopname.\n\u2022\tPaspoortuitvoeringsregeling (artikel 28 PUN, artikel 42 PUB, artikel 40 PUCAR, artikel 17 PUKMAR) geeft aan:\n- Als je een reisdocument aanvraagt, lever je een pasfoto in die een goedgelijkend beeld van jou als aanvrager geeft.\n- De pasfoto die je inlevert voldoet aan de acceptatiecriteria van de in bijlage L bij deze regeling opgenomen fotomatrix.\n- In afwijking van het punt hierboven kan een pasfoto worden geaccepteerd als je hebt aangetoond dat godsdienstige of levensbeschouwelijke redenen zich verzetten tegen het niet bedekken van het hoofd.\n- In afwijking van het tweede punt kan een pasfoto worden geaccepteerd als op grond van objectief vast te stellen lichamelijke of medische redenen, door de aanvrager niet kan worden voldaan aan alle in de fotomatrix opgenomen acceptatiecriteria. Bij twijfel aan de medische redenen kan van jou als aanvrager worden verlangd, dat je een door een bevoegde arts of medische instelling ondertekende verklaring inlevert.\n- In afwijking van het tweede punt kan een pasfoto van een aanvrager die de leeftijd van zes jaar nog niet heeft bereikt worden geaccepteerd, als de foto voldoet aan de in de fotomatrix voor die leeftijdscategorie opgenomen minimumeisen.\n\u2022\tDe fotomatrix is gebaseerd op de door de internationale standaarden van DOC9303 en ISO 19794:5 vastgestelde criteria.\n\u2022\tDe verwerking van foto\u2019s valt niet onder bijzondere categorie\u00ebn van persoonsgegevens, zoals gedefinieerd in de AVG. Foto\u2019s vallen alleen onder de definitie van biometrische gegevens als zij worden verwerkt met behulp van bepaalde technische middelen die de unieke identificatie of authenticatie van een natuurlijke persoon mogelijk maken. Foto's moeten voor herkenningsdoeleinden technisch worden omgezet om als biometrische gegevens te kunnen worden aangemerkt. Dit algoritme wordt niet ingezet voor herkenningsdoeleinden maar alleen voor het meten van de kwaliteit van de foto.\n", - "iama": null, - "iama_description": null, - "dpia": "Ja", - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.3.1", - "uuid": null, - "url": null, - "contact_email": "info@rvig.nl", - "area": "Nederland", - "lang": "nld", - "revision_date": null, - "description": "Het algoritme ondersteunt de ambtenaar aan de balie van de uitgevende instantie bij de besluitvorming of de kwaliteit van de foto voldoet aan de internationale standaarden. Het algoritme wordt ingezet om te verifi\u00ebren of de foto voldoet aan de volgende parameters:\n\u2022 staan de ogen op de foto op een horizontale lijn;\n\u2022 is het hoofd gecentreerd afgebeeld op de foto (zowel verticaal als horizontaal in het midden);\n\u2022 is het hoofd niet te klein of te groot weergegeven;\n\u2022 is het hoofd volledig afgebeeld.\nDe technische detaillering van de parameters is te vinden in de volgende internationale standaarden:\n\nInternational Aviation Organization (ICAO) DOC 9303 en\nInternational Standard Organization (ISO) 19794 Deel 5: Biometric data interchange formats \u2013 Part 5: Face image data\nOm te voldoen aan deze parameters worden door het algoritme zogeheten feature points opgezocht zoals gespecificeerd in de ISO 19794-5 standaard voor een full frontal image. Er wordt onderscheid gemaakt tussen personen onder en boven 11 jaar.", - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": "Fotomatrix: Fotomatrix model 2020 | Brochure | Rijksoverheid.nl\n\nDoc 9303:Doc 9303 Machine Readable Travel Documents (Unedited 8th Edition).pdf (icao.int)\n\nPaspoortuitvoeringsregeling Buitenland 2001: https://wetten.overheid.nl/BWBR0012810/2022-02-05\n\nPaspoortuitvoeringsregeling Caribische landen: https://wetten.overheid.nl/BWBR0012809/2021-08-02\n\nPaspoortuitvoeringsregeling Koninklijke Marechaussee 2001: https://wetten.overheid.nl/BWBR0012812/2021-08-02\n\nPaspoortuitvoeringsregeling Nederland 2001: https://wetten.overheid.nl/BWBR0012811/2021-09-01\n\nPaspoortwet: https://wetten.overheid.nl/BWBR0005212/2021-08-02\n\nUitvoeringswet Algemene verordening gegevensbescherming: wetten.nl - Regeling - Uitvoeringswet Algemene verordening gegevensbescherming - BWBR0040940 (overheid.nl)", - "methods_and_models": "De methode is machinaal leren en het model voor machinaal leren is gebaseerd op support vector machine (SVM).", - "monitoring": "RvIG voert na elke grote wijziging in het aanvraagstation acceptatietesten uit op het algoritme, zoals bijvoorbeeld hardware vervanging of wijzigingen op het onderdeel van het scannen van de foto.", - "human_intervention": "De ambtenaar heeft de keuze om een foto alsnog te accepteren, als deze door het algoritme is afgekeurd. De ambtenaar kan hierbij een of meerdere keuzes selecteren en heeft de volgende opties:\n\nFysiek;\nMedisch met verklaring;\nMedisch zonder verklaring;\nJonger dan zes jaar;\nGodsdienstig;\nLevensbeschouwelijk;\nOnjuiste beoordeling aanvraagstation.", - "risks": "Er is een basisbeveiligingsniveau toets afgenomen op juni 2022. Er zijn geen grote risico\u2019s voor beschikbaarheid, veiligheid of integriteit op dienstverlening gevonden, door gebruik van het foto-algoritme.", - "performance_standard": "De nauwkeurigheidsmetriek is bepaald volgens ICAO-criteria. Er wordt gebruik gemaakt van Detection Error Trade-off (DET) en Area Under the Curve (AUC). De belangrijkste beoordelingscriteria worden beheerd met False Rejection Rate en False Acceptance Rate op operationele drempels.", - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-05-16 09:49:43.743629+00:00", - "lars": "86646664", - "owner": "rijksdienst-voor-identiteitsgegevens" - }, - { - "name": "Kwaliteitsbepaling van de vingerafdruk", - "organization": "Rijksdienst Voor Identiteitsgegevens", - "department": "Directie Informatievoorziening en Systemen, afdeling Reisdocumentensystemen", - "description_short": "Algoritme dat ondersteunt bij het aanvragen van een reisdocument en Nederlandse identiteitskaart. Het beoordeelt of een afgenomen vingerafdruk van voldoende kwaliteit is.", - "type": "Regelgebaseerd", - "category": "Basisregistratie", - "website": "\u00a0", - "status": "In gebruik", - "goal": "Wordt ingezet als technische ondersteuning om te beoordelen of een afgenomen vingerafdruk van voldoende kwaliteit is", - "impact": "Er wordt naar gestreefd om vingerafdrukken van de hoogst mogelijke kwaliteit af te nemen. Soms is het eenvoudigweg niet mogelijk om de minimale drempelwaarde te bereiken. Dit betekent dat het afnameproces van de vingerafdrukken tijdens de aanvraag langer kan duren wegens meerdere afnamepogingen.", - "proportionality": "Kwaliteitsmeting van een vingerafdruk zorgt ervoor dat de opgenomen vingerafdruk geschikt is voor herkenning in het vervolgproces van identiteitsverificatie met het doel om de betrouwbaarheid en nauwkeurigheid te verhogen en de samenwerking tussen verschillende vingerafdrukherkenningssystemen te vergemakkelijken. Dit helpt het terugdringen van mislukte herkenning bij een verificatie tussen de opgenomen vingerafdruk in het document met een live opname.", - "decision_making_process": null, - "documentation": null, - "competent_authority": null, - "lawful_basis": "Op grond van artikel 3, tweede lid, van de Paspoortwet geldt een verplichting tot opname van de vingerafdruk in het reisdocument. Dit betreft een eis die is gesteld door de Europese Unie (Verordening 2252/2005). Artikel 28a van de Paspoortuitvoeringsregeling Nederland 2001 beschrijft op welke manier de vingerafdrukken van de aanvrager van een reisdocument worden opgenomen en in welke gevallen daarvan kan worden afgezien. De kwaliteit van de opgenomen vingerafdruk(ken) is daarin bepalend (lid 2-3)*.\nDe genoemde bepalingen voorzien in de rechtsgrond en daarmee rechtmatige verwerking van de vingerafdrukken als bedoeld in artikel 6, derde lid, van de AVG in samenhang met artikel 9 tweede lid, onder g, van de AVG.\n*Zie ook artikel 40a van de Paspoortuitvoeringsregeling Caribische landen en artikel 42a van de Paspoortuitvoeringsregeling Buitenland 2001.", - "iama": "Nee", - "iama_description": null, - "dpia": "Nee", - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.3.1", - "uuid": null, - "url": null, - "contact_email": "info@rvig.nl", - "area": "Nederland", - "lang": "nld", - "revision_date": null, - "description": "Bij het indienen van een aanvraag voor een paspoort en Nederlandse identiteitskaart (hierna: reisdocument) worden de afdrukken van twee vingers van de aanvrager opgenomen voor opslag in het reisdocument. Hiervoor moet de aanvrager op het moment van het indienen van de aanvraag twaalf jaar of ouder zijn. Het betreft t de platte afdrukken van de linker- en rechterwijsvinger van de aanvrager. Tijdens het afname proces worden de afgenomen vingerafdrukken gecontroleerd op de kwaliteit met behulp van het NFIQ2-algoritme. Indien de kwaliteit van de vingerafdrukken van de wijsvingers onvoldoende is, worden platte afdrukken van de middelvingers, ringvingers of duimen opgenomen. Indien van slechts \u00e9\u00e9n vinger de afdruk van voldoende kwaliteit kan worden opgenomen, wordt uitsluitend de afdruk van die vinger opgenomen.", - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": "NFIQ2 software leest een onbewerkt of WSQ-gecomprimeerd vingerafdrukbeeld, berekent een reeks kwaliteitskenmerken van het beeld en gebruikt deze kenmerken om de bruikbaarheid van de beelden te voorspellen. De voorspelling wordt uitgevoerd met behulp van een random forest classifier die is getraind met behulp van vergelijkingsscores van verschillende commerci\u00eble vergelijkingsalgoritmen voor vingerafdrukken uit verschillende operationele vingerafdrukdatabanken. NFIQ 2 software produceert een kwaliteitsscore die in overeenstemming is met de internationale kwaliteitsnorm voor vingerafdrukken ISO/IEC 29794-1:2016 is in (0-100), waarbij 0 geen gebruikswaarde betekent en 100 de hoogste gebruikswaarde is.\nNFIQ 2 gebruikt een random forest model om de gegevens te classificeren. NFIQ 2 is een binaire classificator. Scores worden afgeleid van de random forest beslissing. Elke beslisboom gebruikt een willekeurige deelverzameling van de kenmerkvector. Bij gebruik van 100 beslisbomen is elke stem \u00e9\u00e9n scorepunt. De verdeling van stemmen/ scorepunten is niet lineair, en niet noodzakelijk ongecorreleerd. NFIQ 2 gebruikt 69 kenmerken die handmatig zijn geselecteerd en gevalideerd.", - "monitoring": "Afdeling Reisdocumentensystemen van de Rijksdienst voor Identiteitsgegevens voert na elke grote wijziging in het aanvraagstation (zoals bijvoorbeeld hardware en software vervanging) acceptatie testen op het algoritme uit . De laatste acceptatie testen van het algoritme zijn uitgevoerd in juli 2021.", - "human_intervention": "Indien de daartoe aangewezen medewerker van oordeel is dat het fysiek dan wel als gevolg van een tijdelijke verhindering onmogelijk is om van de aanvrager te verlangen dat bij hem op het moment van het indienen van de aanvraag twee vingerafdrukken worden opgenomen, wordt in ieder geval de afdruk opgenomen van de vinger waarbij dit volgens de daartoe aangewezen medewerker wel mogelijk is. Bij twijfel of het fysiek dan wel als gevolg van een tijdelijke verhindering onmogelijk is om twee vingerafdrukken op te nemen, kan van de aanvrager worden verlangd, dat deze daartoe een door een bevoegde arts of medische instelling ondertekende verklaring overlegt. Indien van de aanvrager geen vingerafdrukken worden opgenomen, wordt in de aanvraag vermeld of dit permanent of tijdelijk is.", - "risks": "Er is geen basisbeveiligingstoets afgenomen", - "performance_standard": "De absolute foutenpercentages werden gemeten over een zeer groot vast corpus van operationele vingerbeelden (zie voor meer gedetailleerde informatie in NIST Interagency Report 8382).", - "provider": null, - "process_index_url": null, - "tags": "Rijksdienst voor Identiteitsgegevens, RvIG, reisdocument, identiteit, vingerafdruk", - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-05-16 11:26:53.688800+00:00", - "lars": "67311486", - "owner": "rijksdienst-voor-identiteitsgegevens" - }, - { - "name": "Identiteitsverificatie op basis van vingerafdruk", - "organization": "Rijksdienst Voor Identiteitsgegevens", - "department": "Directie Informatievoorziening en Systemen, afdeling Reisdocumentensystemen", - "description_short": "Algoritme dat ingezet wordt om te verifi\u00ebren of twee vingerafdrukken van \u00e9\u00e9n en dezelfde vinger van \u00e9\u00e9n en dezelfde persoon zijn", - "type": "Zelflerend", - "category": "Basisregistratie", - "website": null, - "status": "In gebruik", - "goal": "Wordt ingezet als technische ondersteuning voor het verifi\u00ebren of twee vingerafdrukken van \u00e9\u00e9n en dezelfde vinger van \u00e9\u00e9n en dezelfde persoon zijn", - "impact": "Het ministerie van Binnenlandse Zaken en Koninkrijkrelaties doet momenteel een onderzoek naar de prestatie van vingerafdrukvergelijking op basis van de vingerafdrukken zoals afgenomen en opgeslagen in een reisdocument. Het onderzoek moet uitwijzen of de vingerafdrukkwaliteit en de hard- en software voldoen om de identiteit van burgers op betrouwbare wijze te kunnen verifi\u00ebren.", - "proportionality": "Vingerafdrukken worden ingezet voor identiteitsverificatie alleen als er na de verificatie van de authenticiteit van het reisdocument en de identiteit van de houder na inzetten van gezichtsopnameverificatie twijfel bestaat om de authenticiteit van het document en de identiteit van de houder te bevestigen (zie overweging 19 van verordening 2019/1157). Het inzetten van vingerafdrukken voor identiteitsverificatie samen met gezicht vergelijking, vormt een passende combinatie van betrouwbare identificatie en authenticatie met een lagere fraudegevoeligheid, waarmee reisdocumenten beter kunnen worden beveiligd.", - "decision_making_process": null, - "documentation": null, - "competent_authority": null, - "lawful_basis": "De juridische basis voor zowel het eerste als het tweede geval liggen in de Verordening (EG) 2252/2004* en de Verordening (EU) 2019/1157** . Deze verordeningen bepalen onder andere dat de op te nemen vingerafdrukken in paspoorten, reisdocumenten en identiteitskaarten alleen gebruikt kunnen worden ter verificatie van: a) de authenticiteit van het document en b) de identiteit van de houder. De bepalingen zijn verankerd in nationale wetgeving, namelijk in artikel 3 van de Paspoortwet in samenhang met de daaronder liggende regelgeving:\n1. Ten aanzien van het eerste geval waarin het algoritme wordt ingezet (kwaliteitsvergelijking) beschrijft artikel 28a van de Paspoortuitvoeringsregeling Nederland 2001 op welke wijze de vingerafdrukken van de aanvrager van een reisdocument worden opgenomen en in welke gevallen daarvan kan worden afgezien. De kwaliteit van de opgenomen vingerafdruk(ken) is daarin cruciaal (lid 2-3)***.\n2. Dat het algoritme kan worden ingezet voor identiteitsverificatie bij uitreiking is verwoord in artikel 4.6 van het Paspoortbesluit.\nMet de inzet van het algoritme worden biometrische gegevens en daarmee bijzondere persoonsgegevens verwerkt in de zin van de Algemene Verordening Gegevensbescherming (AVG). De AVG stelt in principe een verbod op het verwerken van bijzondere persoonsgegevens. De nationale wetgever heeft echter gebruik gemaakt van de ruimte voor lidstaten om uitzonderingen te cre\u00ebren voor de verwerking van bijzondere persoonsgegevens om redenen van algemeen belang (artikel 9 lid 2 AVG). Op grond van artikel 29 van de Uitvoeringswet AVG is verwerking van biometrische gegevens met oog op de unieke identificatie toegestaan indien de verwerking noodzakelijk is voor authenticatie en beveiligingsdoeleinden.\n\n* Artikel 4 lid 3 van de Verordening (EG) 2252/2004 van de Raad van 13 december 2004 betreffende normen voor de veiligheidskenmerken van en biometrische gegevens in door de lidstaten afgegeven paspoorten en reisdocumenten.\n ** Artikel 11 lid 6 van de Verordening (EU) 2019/1157 van het Europees Parlement en de Raad van 20 juni 2019 betreffende de versterking van de beveiliging van identiteitskaarten van burgers van de Unie en van verblijfsdocumenten afgegeven aan burgers van de Unie en hun familieleden die hun recht van vrij verkeer uitoefenen.\n *** Zie ook artikel 40a van de Paspoortuitvoeringsregeling Caribische landen en artikel 42a van de Paspoortuitvoeringsregeling Buitenland 2001.", - "iama": "Nee", - "iama_description": null, - "dpia": "Nee", - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.3.1", - "uuid": null, - "url": null, - "contact_email": "info@rvig.nl", - "area": "Nederland", - "lang": "nld", - "revision_date": null, - "description": "Vergelijkingsalgoritme wordt ingezet in de volgende gevallen:\n\n1. Kwaliteitsvergelijking tijdens het afnameproces van vingerafdrukken voor opname in een reisdocument. In dit proces worden maximaal drie vingerafdrukkenopnames van \u00e9\u00e9n en dezelfde vinger van \u00e9\u00e9n en dezelfde persoon gedaan om zorg te dragen dat er vingerafdrukken met een zo hoog mogelijk kwaliteit in de chip van het reisdocument worden opgenomen. De tweede en de derde opname van de vinger wordt tegen de eerste opname geverifieerd om zorg te dragen dat er \u00e9\u00e9n en dezelfde vinger van \u00e9\u00e9n en dezelfde persoon wordt afgenomen.\n\n2. Vergelijking van ter plekke afgenomen vingerafdruk(ken) tegen de vingerafdruk(ken) die zijn opgenomen in de chip van de houder van het reisdocument. Dit is mogelijk tijdens het uitlezen van een reisdocument wanneer een houder van een reisdocument verzoekt om inzage van de gegevens in de chip van zijn of haar reisdocument, bij controle van een mogelijk defecte chip of indien er wordt getwijfeld aan de identiteit van de persoon bij uitreiking.", - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": "Een algoritme voor het matchen van vingerafdrukken vergelijkt twee vingerafdrukbeelden en geeft een beslissing van overeenkomst of geen overeenkomst.", - "monitoring": "RvIG voert na elke grote wijziging in het aanvraagstation (zoals bijvoorbeeld hardware en software vervanging) acceptatietesten op het algoritme uit.", - "human_intervention": "Het verificatieproces wordt gemonitord en uitgevoerd onder begeleiding van de daartoe aangewezen medewerker. Deze medewerker controleert onder andere: 1) visueel de vingertoppen van de aanvrager op tekenen van prothesen, valse vingerafdrukken of schade die opzettelijk kan zijn en 2) of de aanvrager geen vingers onjuist, noch opzettelijk, noch onopzettelijk presenteert of vingers of handen verwisselt", - "risks": "Er is geen basisbeveiligingstoets afgenomen", - "performance_standard": "Er wordt gebruik gemaakt van Detection Error Trade-off (DET) en Area Under the Curve (AUC). De belangrijkste beordeelingscriteria worden beheerd met False Rejection Rate en False Acceptance Rate op operationele drempels.", - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-05-16 11:58:48.177027+00:00", - "lars": "68796525", - "owner": "rijksdienst-voor-identiteitsgegevens" - }, - { - "name": "Bestands Controle Module (BCM)", - "organization": "Rijksdienst Voor Identiteitsgegevens", - "department": "Directie Uitvoering, afdeling Kwaliteit & Ontwikkeling", - "description_short": "Het algoritme controleert o.a. of de opgenomen gegevens in een persoonslijst voldoen aan de vereisten in het Logisch Ontwerp BRP voor de structuur en inhoud van deze opgenomen gegevens (Structuur en Domeincontroles). ", - "type": "Regelgebaseerd", - "category": "Basisregistratie", - "website": "Kwaliteitsmonitor, alleen toegankelijk voor gemeenten via beveiligde verbinding (gemnet en diginetwerk).", - "status": "In gebruik", - "goal": "Signaleren van (mogelijke) afwijkingen in opgenomen gegevens aan gemeenten. Gemeenten zijn zelf verantwoordelijk voor de kwaliteit en inhoud van de opgenomen gegevens en alleen zij kunnen gegevens wijzigen (van de eigen ingezetenen). Resultaten van de BCM-run van eind november van een jaar worden gebruikt voor de (wettelijk verplichte) zelfevaluatie BRP door gemeenten.", - "impact": "Afwijkingen/fouten in opgenomen gegevens kunnen van invloed zijn op de burger. Geautoriseerde afnemers van BRP-gegevens kunnen aan de hand van onjuiste gegevens op een persoonslijst de verkeerde conclusies verbinden aan deze gegevens.", - "proportionality": "De inzet van het algoritme bespaart tijd en geld en bewaakt de kwaliteit van de BRP. Handmatige controle op ruim 3.000 regels zou een zeer arbeidsintensief proces voor gemeenten zijn. Doordat een pre-run uitgevoerd wordt is de kans dat onterechte bevindingen worden gegenereerd, die een negatieve impact hebben op de burger, zeer klein. Doordat gemeenten op de hoogte gebracht worden van afwijkingen en zij onjuiste gegevens corrigeren, is de positieve impact op de burger groot.", - "decision_making_process": null, - "documentation": null, - "competent_authority": null, - "lawful_basis": "Artikel 4.3 Wet BRP en Artikel 47 Besluit BRP: \u201cDe uitvoering van deze onderzoeken geschiedt met behulp van een door Onze Minister beschikbaar gesteld evaluatie-instrument\u201d. Dat evaluatie-instrument is de KWM en de BCM maakt daar onderdeel van uit. ", - "iama": "Nee", - "iama_description": null, - "dpia": "Nee", - "dpia_description": null, - "objection_procedure": "Output gaat alleen naar gemeenten en heeft een signalerende functie. Gemeente bepaalt zelf of zij al dan niet wijzigingen/correcties willen/kunnen aanbrengen in de gegevens rekening houdend met de voorschriften uit de van toepassing zijnde wet- en regelgeving. ", - "standard_version": "0.3.1", - "uuid": null, - "url": null, - "contact_email": "info@rvig.nl", - "area": "Nederland", - "lang": "nld", - "revision_date": null, - "description": "De controleregels van de BCM maken deel uit van de jaarlijkse zelfevaluatie BRP die door gemeente uitgevoerd moet worden. Voor het onderzoek maken de gemeenten gebruik van het door RvIG beschikbaar gestelde evaluatie-instrument: de kwaliteitsmonitor (KWM). Deze bevat de digitale vragenlijst Basisregistratie Personen (BRP), de bestandscontrolemodule (BCM) en de inhoudelijke controle persoonslijsten aan de hand van brondocumenten (IHC). De resultaten van de BCM-run van eind november van een jaar worden opgenomen in het uittreksel en de managementrapportage zelfevaluatie van de betreffende gemeente (art 21 Regeling BRP).\nOm gemeenten in de gelegenheid te stellen de kwaliteit van de opgenomen gegevens te bewaken en mogelijke afwijkingen zo snel mogelijk te herstellen wordt ook maandelijks een BCM-run gedraaid en gepubliceerd in de KWM. Gemeenten houden hierdoor zicht op de kwaliteit van de gegevens van de eigen ingezetenen.\nVoor de zelfevaluatie BRP is een normenkader aanwezig waarin de afwijkingen opgedeeld zijn in 3 groepen zoals bedoeld in artikel 2.7 Wet BRP:\n\n\u2022 Groep 1: De afwijkingen betreffend de algemene gegevens over burgerlijke staat en adres, onderverdeeld in klasse A (Persoon en Overlijden), klasse B (Adres), klasse C (Relaties)\n\u2022 Groep 2: De afwijkingen in de overige algemene gegevens, onderverdeeld in klasse D (Identificatienummers en Nationaliteit), klasse E (Overige Algemeen)\n\u2022 Groep 3: De afwijkingen betreffende de administratieve gegevens, klasse F (Administratief)\n\nPer klasse is de norm vastgesteld op:\n\u2022 Klasse A: 99,70%\n\u2022 Klasse B: 99,70%\n\u2022 Klasse C: 99,60%\n\u2022 Klasse D: 99,50%\n\u2022 Klasse E: 99,50%\n\u2022 Klasse F: 99,40%", - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": "BRP-V", - "methods_and_models": "De controles (ruim 3000) zijn opgenomen in een Excelsheet die door de BCM gebruikt wordt bij de uitvoer van de controle. De controles zijn gedefinieerd conform paragraaf 3.1.1 Syntax van de voorwaarderegels in het Logisch Ontwerp BRP. De output van een controle wordt beoordeeld op juistheid door een medewerker van K&O en, indien goedgekeurd, gepubliceerd in de KWM. Maandelijks wordt een controle uitgevoerd voor alle gemeenten in Nederland en jaarlijks wordt voor de zelfevaluatie BRP en RNI een aparte controle uitgevoerd. ", - "monitoring": "Door de afdeling Monitoring bij specifieke afwijkingen, bijvoorbeeld doordat ten onrechte geen koppeling is gelegd met het Basisregister Adressen en Gebouwen (BAG).", - "human_intervention": "Voorafgaand aan iedere controlerun wordt eerst een pre-run uitgevoerd die beoordeeld wordt op juistheid. Indien een controleregel (ook) onterechte bevindingen genereert zal deze regel aangepast worden of (tijdelijk) uit productie gehaald worden. Ook de definitieve run wordt, voorafgaand aan publicatie, eerst beoordeeld. In uitzonderlijke gevallen, als een bepaalde controleregel toch nog onterechte bevindingen genereert, kunnen de gegevens van deze controle voorafgaand aan publicatie uitgefilterd worden. ", - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": "Rijksdienst voor Identiteitsgegevens, RvIG, BRP, BCM", - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-05-16 14:23:28.628143+00:00", - "lars": "31747325", - "owner": "rijksdienst-voor-identiteitsgegevens" - }, - { - "name": "Profiel Bewoningsgraad Landelijke Aanpak Adreskwaliteit (LAA)", - "organization": "Rijksdienst Voor Identiteitsgegevens", - "department": "Directie Uitvoering, afdeling Onderzoek & Analyse", - "description_short": "Met het profiel Bewoningsgraad wordt het aantal inschrijvingen in de BRP op \u00e9\u00e9n woonadres vergeleken met het woonoppervlakte van dat adres. ", - "type": "Regelgebaseerd", - "category": "Basisregistratie", - "website": "https://www.rvig.nl/brp/landelijke-aanpak-adreskwaliteit-laa", - "status": "In gebruik", - "goal": "Het doel van dit algoritme is om potenti\u00eble risicoadressen te selecteren op basis van gerede twijfel en deze aan gemeenten te leveren voor nader adresonderzoek. Op basis van deze adresonderzoeken worden onjuiste adresgegevens gecorrigeerd, zodat overheidsorganen op basis van juiste informatie hun publieke taken kunnen uitvoeren.", - "impact": "Als een onderzoek naar inschrijving van personen op het adres plaats gaat vinden, wordt er huisbezoek op het adres gedaan.", - "proportionality": "Het effici\u00ebnt en zo effectief mogelijk vinden van adressen waar de kans van incorrecte inschrijvingen op adressen zo groot mogelijk is (de trefkans is minimaal 50%) en deze inschrijvingen corrigeren. Met behulp van het algoritme kun je prioriteit geven aan adressen waarbij de kans groter dan 50% is dat er iets niet klopt in de registratie en zorg je er tegelijkertijd voor dat je niet onnodig bij burgers aan de deur komt. Er is bij dit algoritme geen sprake van automatische besluitvorming; er is altijd menselijke tussenkomst door de ambtenaar van de gemeente.", - "decision_making_process": null, - "documentation": null, - "competent_authority": null, - "lawful_basis": "In de wet BRP is vastgelegd dat de Minister van Binnenlandse Zaken en Koninkrijkrelaties de gemeente ondersteunt bij het onderzoek of de adresregistratie in de BRP van personen klopt.\n\nDe Minister van Binnenlandse Zaken en Koninkrijkrelaties mag hiervoor persoonsgegevens verwerken. Deze persoonsgegevens mag de Minister van Binnenlandse Zaken en Koninkrijkrelaties analyseren aan de hand van een profiel.\n\nIn regelgeving is uitgewerkt welke gegevens mogen worden gebruikt en welke waarborgen moeten worden nageleefd bij de ontwikkeling van het profiel (waaronder de menselijke tussenkomst).\n\nVoordat het profiel landelijk in gebruik wordt genomen wordt de werking ervan eerst getest met een klein aantal gemeenten. Bekeken wordt of het profiel doet wat het doen moet en of de trefkans voldoende is.\n\nAls het profiel in gebruik is, wordt hij regelmatig ge\u00ebvalueerd en wordt bekeken of het profiel nog altijd voldoet aan de verwachtingen. Als dat niet meer het geval is, wordt het profiel aangepast of niet meer gebruikt. ", - "iama": "Ja", - "iama_description": null, - "dpia": "Nee", - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.3.1", - "uuid": null, - "url": null, - "contact_email": "info@rvig.nl", - "area": "Nederland", - "lang": "nld", - "revision_date": null, - "description": "Met het profiel Bewoningsgraad wordt het aantal inschrijvingen in de BRP op \u00e9\u00e9n woonadres vergeleken met het woonoppervlakte van dat adres. Om dit vast te stellen wordt de oppervlakte van de woonruimte, zoals vastgelegd in de Basisregistratie Adressen en Gebouwen (BAG), gedeeld door het aantal bewoners dat staat ingeschreven op het adres. Woonadressen waar het oppervlakte per ingeschrevene op het woonadres kleiner is dan een bepaald aantal vierkante meter, worden geselecteerd voor nader adresonderzoek. Bij dit aantal is er twijfel over de juistheid van de registratie in de BRP op dit adres.\n\nDe adressen moeten voor het profiel Bewoningsgraad voldoen aan onderstaande criteria:\n\nAdressen waarbij de gemiddelde woonoppervlakte per BRP- inschrijving een bepaald aantal vierkante meter of minder is.\nAdressen die in de BAG (Basisregistratie Adressen en Gebouwen) geregistreerd staan als verblijfsobject met de status \u2018in gebruik\u2019 of \u2018in gebruik \u2013 niet ingemeten\u2019. Standplaatsen en ligplaatsen worden hiervan uitgesloten.\nAdressen waarbij minimaal 3 personen, die geen familierelatie met elkaar hebben, staan ingeschreven in de BRP.\nAdressen die van selectie worden uitgesloten:\n\nAdressen die volgens de BAG zowel de gebruiksfunctie \u2018Gezondheidsfunctie\u2019, \u2018Logiesfunctie\u2019 en \u2018\u00c7elfunctie\u2019 hebben.\nAdressen waarbij alle personen een familierelatie met elkaar hebben: dezelfde achternaam, of inschrijvingsdatum en adressen waarbij alle personen op het adres dezelfde geslachtsnaam hebben, behalve een volwassen vrouw die 18 jaar of ouder is.\nAdressen waar meer dan een bepaald aantal personen in de BRP staan ingeschreven.\nAdressen waarbij de oppervlakte van de woonruimte volgens de BAG 1m2 is.\nAdressen waar meer dan een bepaald aantal personen staat ingeschreven (ongeacht of het gaat om een woonadres of een briefadres) en die volgens de BAG de gebruiksfunctie \u2018Bijeenkomstfunctie\u2019 of \u2018Logiesfunctie\u2019 hebben.", - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": "Input gegevens vanuit de BRP:\n\nGemeentecode;\nAdres (postcode, huisnummer, huisletter en huisnummertoevoeging (laatste 3 zijn gepseudonimiseerd));\nFunctie adres (woonadres of briefadres);\nA-nummer (gepseudonimiseerd);\nGeslachtsnaam (gepseudonimiseerd);\nGeslacht;\nAantal gezinnen (op basis van de definitie van een entiteit: echtgenoten, geregistreerde partners dan wel bloed- of aanverwanten in de eerste graad, behoren tot dezelfde entiteit);\nInschrijvingsdatum van een persoon op het adres;\nGeboortedatum;\nDatum overlijden (wordt gebruik om personen die zijn overleden uit te sluiten);\nAangifte adreshouding.\nInput gegevens vanuit de BAG:\n\nGebruiksdoel(-en) van het verblijfsobject;\nOppervlakte.\nDaarna worden aanvullende gegevens verwerkt om de selectie te verfijnen:\n\nVan alle personen die volgens de BRP op het adres staan ingeschreven:\n\nActueel:\n\nA-nummer\nBurgerservicenummer (BSN)\nGeslachtsnaam\nGeboortedatum\nGeslachtsaanduiding\nAfnemersindicatie\nIndien van toepassing:\n\nVoornamen\nLandcode\nDatum ingang blokkering persoonslijst\nDatum opschorting bijhouding persoonslijst\nOmschrijving reden opschorting bijhouding (bijvoorbeeld of iemand is overleden of ge\u00ebmigreerd)\nAanduiding gegevens in onderzoek\nDatum ingang onderzoek en/of datum einde onderzoek\nDatum verificatie (de datum waarop de verificatie van gegevens op de persoonslijst in de Registratie Niet-ingezetene (RNI) heeft plaatsgevonden)\nOmschrijving verificatie (omschrijving op welke wijze de verificatie van gegevens op de persoonslijst in de RNI, heeft plaatsgevonden)\nRNI-deelnemer\nOmschrijving verdrag\nOf de status van de persoon in de BRP momenteel \u2018Vertrokken Onbekend Waarheen\u2019 (VOW) is, en zo ja de datum waarop de persoon VOW is gegaan\nOf de persoon eerder VOW is geweest\nActueel en voorlaatste BRP-registratie:\n\nGemeente van inschrijving\nInschrijvingsdatum van een persoon in de gemeente\nFunctie adres (om te bepalen of het gaat om een briefadres of een woonadres)\nInschrijvingsdatum van een persoon op het adres\nStraatnaam, huisnummer, huisletter en huisnummertoevoeging\nAanduiding bij huisnummer)\nPostcode en woonplaats\nIdentificatiecode verblijfplaats\nIdentificatiecode nummeraanduiding\nOmschrijving van de aangifte adreshouding\nIngangsdatum geldigheid van de gegevens\nDatum van opneming\nAanduiding gegevens in onderzoek\nIndicatie onjuist, dan wel strijdigheid met de openbare orde\nVan alle personen die volgens de BRP op het adres staan ingeschreven worden de volgende gegevens verwerkt van hun ouders, als deze informatie beschikbaar is in de BRP:\n\nA-nummer\nGeslachtsnaam\nGeboortedatum\nIndien van toepassing:\n\nVoornamen\nBurgerservicenummer\nAanduiding gegevens in onderzoek\nVan alle personen die volgens de BRP op het adres staan ingeschreven worden de volgende gegevens verwerkt van hun huidige en ex-partner(s), als deze informatie beschikbaar is in de BRP:\n\nA-nummer\nGeslachtsnaam\nGeboortedatum\nDatum huwelijkssluiting / aangaan geregistreerd partnerschap\nDatum ontbinding huwelijk / geregistreerd partnerschap\nIndien van toepassing:\n\nVoornamen\nBurgerservicenummer (BSN)\nAanduiding gegevens in onderzoek\nVerder worden binnen dit profiel de volgende gegevens verwerkt vanuit de BAG:\n\nPostcode\nHuisnummer\nHuisnummertoevoeging\nIndicatie hoofd/nevenadres\nOppervlakte\nGebruiksdoel\nStatus\nBouwjaar\nHistorie gebruiksdoel", - "methods_and_models": "Beslisboom algoritme", - "monitoring": "Het algoritme wordt maandelijks ge\u00ebvalueerd door het meten van trefkans na de adresonderzoeken die door gemeenten zijn uitgevoerd. Alle LAA-profielen worden regelmatig ge\u00ebvalueerd met het oog op de vraag of zij nog werken, aangepast moeten worden of hun effectiviteit hebben verloren en niet meer gebruikt moeten worden. Op die manier wordt geprobeerd de privacy impact op de Nederlandse burger zo klein mogelijk te houden. Een dergelijke evaluatie wordt minimaal drie keer per jaar gedaan in samenwerking met de samenwerkingspartners (gemeenten en afnemers).", - "human_intervention": "Er is geen sprake van automatische besluitvorming. De beoordeling en beslissingen worden altijd door mensen gedaan. Algoritmes zijn een middel en zijn niet leidend. Tijdens het ontwikkelen van alle LAA-algoritmen is advies gevraagd aan een representatieve vertegenwoordiging van gemeenten.", - "risks": "De persoonlijke levenssfeer komt mogelijk in het gedrang, door het verwerken van persoonsgegevens en het afleggen van een huisbezoek door gemeenten.", - "performance_standard": "De trefkans is minimaal 50%", - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-05-16 12:20:11.476085+00:00", - "lars": "38773626", - "owner": "rijksdienst-voor-identiteitsgegevens" - }, - { - "name": "Profiel Doorgangsadres Landelijke Aanpak Adreskwaliteit (LAA)", - "organization": "Rijksdienst Voor Identiteitsgegevens", - "department": "Directie Uitvoering, afdeling Onderzoek & Analyse", - "description_short": "Het algoritme selecteert woonadressen waarop de afgelopen periode veel inschrijvingen plaatsvonden: er kan twijfel bestaan of er wel daadwerkelijk verhuizingen hebben plaatsgevonden.", - "type": "Regelgebaseerd", - "category": "Basisregistratie", - "website": null, - "status": "In gebruik", - "goal": "Het doel van dit algoritme is om potenti\u00eble risicoadressen te selecteren op basis van gerede twijfel aan de juistheid van de inschrijvingen op het adres en deze aan gemeenten te leveren voor nader adresonderzoek. Op basis van deze adresonderzoeken worden onjuiste adresgegevens gecorrigeerd, zodat overheidsorganen die gebruik maken van gegevens uit de BRP op basis van juiste informatie hun publieke taken kunnen uitvoeren.", - "impact": "Als een onderzoek naar inschrijving van personen op het adres plaats gaat vinden, wordt er een huisbezoek op het adres gedaan. De persoonlijke levenssfeer komt mogelijk in het gedrang tijdens een adresbezoek door gemeenten. Gegevens als bijvoorbeeld het gebruik van een naam zijn noodzakelijk voor het adresonderzoek om gezinsverbanden vast te kunnen stellen en om burgers aan te schrijven om hen te informeren over het adresonderzoek. ", - "proportionality": "De juistheid van (adres)gegevens in de BRP is essentieel voor het functioneren van de Nederlandse overheid. Een overheid die haar burgers niet kent of niet weet te vinden, is niet in staat om de taken te verrichten die door de burgers aan haar zijn toevertrouwd. Het is in veel gevallen een randvoorwaarde voor het correct uitvoeren van wettelijke regelingen en voor de effectiviteit van overheidsbeleid. Voor de burger is een juiste registratie van belang voor zijn correspondentie met de overheid en om aanspraak te kunnen maken op adres-gerelateerde overheidsvoorzieningen.\nIn regelgeving is uitdrukkelijk opgenomen welke gegevens mogen worden gebruikt bij het algoritme. Gegevens die niet worden genoemd mogen dus niet worden gebruikt. Ook worden er geen (persoons)gegevens gebruikt die tot discriminatie kunnen leiden. Er wordt niet geselecteerd op nationaliteit, geboorteplaats of afgeleiden daarvan.\nDe inzet van het algoritme is een kosteneffectieve manier om de kwaliteit van de BRP te borgen. Met behulp van het algoritme kun je prioriteit geven aan adressen waarbij de kans groter dan 50% is dat er iets niet klopt in de registratie en zorg je er tegelijkertijd voor dat je niet onnodig bij burgers aan de deur komt. Er is bij dit algoritme geen sprake van automatische besluitvorming; er is altijd menselijke tussenkomst door de ambtenaar van de gemeente", - "decision_making_process": null, - "documentation": null, - "competent_authority": null, - "lawful_basis": "In de wet BRP is vastgelegd dat de Minister van Binnenlandse Zaken en Koninkrijkrelaties de gemeente ondersteunt bij het onderzoek of de adresregistratie in de BRP van personen klopt.\n\nDe Minister van Binnenlandse Zaken en Koninkrijkrelaties mag hiervoor persoonsgegevens verwerken. Deze persoonsgegevens mag de Minister van Binnenlandse Zaken en Koninkrijkrelaties analyseren aan de hand van een profiel.\n\nIn regelgeving is uitgewerkt welke gegevens mogen worden gebruikt en welke waarborgen moeten worden nageleefd bij de ontwikkeling van het profiel (waaronder de menselijke tussenkomst).\n\nVoordat het profiel landelijk in gebruik wordt genomen wordt de werking ervan eerst getest met een klein aantal gemeenten. Bekeken wordt of het profiel doet wat het doen moet en of de trefkans voldoende is.\n\nAls het profiel in gebruik is, wordt hij regelmatig ge\u00ebvalueerd en wordt bekeken of het profiel nog altijd voldoet aan de verwachtingen. Als dat niet meer het geval is, wordt het profiel aangepast of niet meer gebruikt. ", - "iama": "Nee", - "iama_description": null, - "dpia": "Nee", - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.3.1", - "uuid": null, - "url": null, - "contact_email": "info@rvig.nl", - "area": "Nederland", - "lang": "nld", - "revision_date": null, - "description": "De adressen moeten voor het profiel Doorgangsadres voldoen aan onderstaande criteria:\n\u2022 Op de adressen hebben de afgelopen jaar op minimaal 3 verschillende dagen inschrijvingen in de BRP plaatsgevonden als woonadres.\n\u2022 Op de adressen hebben de afgelopen 3 jaar op meer verschillende dagen inschrijvingen in de BRP plaatsgevonden.\nVan de adressen die overblijven worden de volgende adressen uitgesloten:\n\u2022 Adressen die volgens de Basisregistratie Adressen en Gebouwen (BAG) zowel de gebruiksfunctie \u2018Gezondheidsfunctie\u2019 als \u2018Logiesfunctie\u2019 hebben.\n\u2022 Adressen waar op dit moment 1 of 2 entiteiten staan ingeschreven (echtgenoten, geregistreerde partners dan wel bloed- of aanverwanten in de eerste graad, behoren tot dezelfde entiteit).\n\u2022 Adressen waar minimaal 20 personen in de BRP staan ingeschreven.\n\u2022 Adressen waar minimaal 10 personen staan ingeschreven (ongeacht of het gaat om een woonadres of een briefadres) en die volgens de basisregistratie adressen en gebouwen (BAG) de gebruiksfunctie \u2018Bijeenkomstfunctie\u2019 of \u2018Logiesfunctie\u2019 hebben.\n\u2022 Adressen die volgens de BAG alleen de gebruiksfunctie \u2018Celfunctie\u2019 of \u2018Gezondheidsfunctie\u2019 hebben.", - "application_url": null, - "publiccode": "\u00a0", - "mprd": null, - "source_data": "\u2022 Gegevens over de burgerlijke staat:\n- Naam \u2013 Geslachtsnaam, Voornamen;\n- Geboorte - Geboortedatum\n- Geslacht\n- Ouders \u2013 Geslachtsnaam, Voornamen, Geboortedatum;\n- Huwelijk dan wel geregistreerd partnerschap en eerdere huwelijken of eerdere geregistreerde partnerschappen - Aanduiding huwelijk of geregistreerd partnerschap; Datum huwelijkssluiting of datum aangaan geregistreerd partnerschap; Huwelijksontbinding of ontbinding geregistreerd partnerschap en reden daarvan, dan wel nietigverklaring huwelijk of geregistreerd partnerschap; Datum ontbinding, dan wel nietigverklaring huwelijk of geregistreerd partnerschap\n- Echtgenoot dan wel geregistreerd partner en eerdere echtgenoten of geregistreerde partners \u2013 Geslachtsnaam, Voornamen, Geboortedatum;\n- Kinderen \u2013 Geslachtsnaam, Voornamen, Geboortedatum\n- Overlijden \u2013 Overlijdensdatum\n- Data ingang en be\u00ebindiging rechtsgeldigheid gegevens - Datum ingang rechtsgeldigheid; Datum be\u00ebindiging rechtsgeldigheid\n\u2022 Gegevens over de bijhoudingsgemeente en het adres in die gemeente alsmede over het verblijf in Nederland en het vertrek uit Nederland\n- Bijhoudingsgemeente \u2013 Gemeente; Datum aanvang adreshouding in de gemeente\n- Adres - Functie van het adres; Gemeente; Woonplaats; Straatnaam en zo nodig deel van een gemeente; Huisnummer; Locatie ten opzichte van adres; Huisletter; Huisnummertoevoeging; Locatiebeschrijving en zo nodig deel van een gemeente; Postcode; Datum aanvang adreshouding; Datum ingang rechtsgeldigheid\n- Vertrek uit Nederland - Datum vertrek; Volgend land of gebied van verblijf;\n\u2022 Gegevens over het woonadres van de niet-ingezetene - Datum ingang rechtsgeldigheid; Datum be\u00ebindiging rechtsgeldigheid;\n\u2022 Gegevens over het burgerservicenummer van de ingeschrevene - Burgerservicenummer ingeschrevene; Datum van kracht worden van het burgerservicenummer; Datum be\u00ebindiging van het burgerservicenummer;\n\u2022 Gegevens over de burgerservicenummers van de ouders, de echtgenoot dan wel de geregistreerde partner, de eerdere echtgenoten of eerdere geregistreerde partners en de kinderen - Burgerservicenummer ouder; Burgerservicenummer echtgenoot dan wel geregistreerde partner; Burgerservicenummer eerdere echtgenoot; Burgerservicenummer eerdere geregistreerde partner; Burgerservicenummer kind; Data van kracht worden burgerservicenummers; Data be\u00ebindiging burgerservicenummers\n\u2022 Gegevens over het gebruik door de ingeschrevene van de geslachtsnaam van de echtgenoot, de geregistreerde partner, de eerdere echtgenoot of de eerdere geregistreerde partner \u2013 Naamgebruik; Datum ingang van het gegeven over het naamgebruik; Datum be\u00ebindiging van het gegeven over het naamgebruik\n\u2022 Gegevens over het tijdelijk verblijfsadres\n- Tijdelijk verblijfsadres \u2013 Gemeente; Woonplaats; Straatnaam en zo nodig deel van een gemeente; Huisnummer; Huisletter; Huisnummertoevoeging; Postcode; Datum ingang rechtsgeldigheid; Datum be\u00ebindiging rechtsgeldigheid\n\u2022 Gegevens in verband met de inschrijving en de wijziging van de bijhoudingsgemeente betreffende de ingezetene, gegevens in verband met de inschrijving betreffende de niet-ingezetene en gegevens betreffende de wijziging van de bijhoudings-verantwoordelijke betreffende de niet-ingezetene die ingezetene wordt - De hoedanigheid van de persoon die aangifte van verblijf en adres, van adreswijziging, of van vertrek heeft gedaan, dan wel de aantekening dat de gegevens ambtshalve zijn opgenomen; Datum inschrijving in de basisregistratie; Datum blokkering persoonslijst in verband met wijziging van de bijhoudingsverantwoordelijke; Gemeentecode van de gemeente waar de persoonskaart zich bevindt; Aantekening dat alle gegevens over kinderen, die aan de persoonskaart ontleend kunnen worden, op de persoonslijst zijn opgenomen\n\u2022 Gegevens ter aanduiding van akten en andere geschriften waaruit algemene gegevens zijn verkregen\n- Aanduiding van akten van de Nederlandse burgerlijke stand - Nummer van de akte waaraan een algemeen gegeven over de burgerlijke staat is ontleend; Gemeentecode van de gemeente waar de akte in de registers is opgenomen\n- Aanduiding van andere akten en geschriften - Omschrijving van het geschrift waaraan een algemeen gegeven is ontleend; Code van de bijhoudingsverantwoordelijke die het gegeven heeft ontleend; Datum van ontlening\n- Gegevens ter aanduiding van de onjuistheid van een opgenomen algemeen gegeven of van strijd met de Nederlandse openbare orde van een opgenomen gegeven over de burgerlijke staat - Aanduiding van het opgenomen algemeen gegeven dat onjuist is;\n- Gegevens over een onderzoek naar de onjuistheid van een opgenomen algemeen gegeven of de strijdigheid van een opgenomen gegeven over de burgerlijke staat - Aanduiding van de verzameling van gegevens, waarbinnen algemene gegevens zijn opgenomen die onderzocht worden op onjuistheid; Datum aanvang onderzoek; Datum be\u00ebindiging onderzoek; Andere gegevens noodzakelijk in verband met de verwerking van gegevens in de basisregistratie;\n- Gegevens ter aanduiding van de bron waaraan het administrat", - "methods_and_models": "Beslisboom algoritme", - "monitoring": "Het algoritme wordt maandelijks ge\u00ebvalueerd door het meten van de trefkans na de adresonderzoeken die door gemeenten zijn uitgevoerd. Alle LAA-profielen worden regelmatig ge\u00ebvalueerd met het oog op de vraag of zij nog werken, aangepast moeten worden of hun effectiviteit hebben verloren en niet meer gebruikt moeten worden. Op die manier wordt geprobeerd de privacy impact op de Nederlandse burger zo klein mogelijk te houden. Een dergelijke evaluatie wordt minimaal drie keer per jaar gedaan in samenwerking met de samenwerkingspartners (gemeenten en afnemers van de BRP). Tegen een besluit van de gemeente dat leidt tot een aanpassing of wijziging van het adres of tot een uitschrijving, kan bezwaar worden gemaakt bij de gemeente. Een verzoek tot inzage kan worden gedaan in de bij de RvIG aanwezige persoonsgegevens.", - "human_intervention": "Op grond van de Wet BRP zijn nadere regels gesteld over de maatregelen om menselijke tussenkomst te waarborgen bij de ontwikkeling van profielen. Tijdens het ontwikkelen van het algoritme is advies gevraagd aan een representatieve vertegenwoordiging van de gemeenten en aangewezen bestuursorganen. Er worden om die reden geen persoonsgegevens verwerkt (geanalyseerd) voordat dit is besproken met de betrokken partijen. In de meeste gevallen wordt daarnaast ook de Autoriteit Persoonsgegevens (AP) om advies gevraagd.\nEr is geen sprake van automatische besluitvorming. Algoritmes zijn een middel en zijn niet leidend. De beoordeling en beslissingen worden uiteindelijk altijd door mensen gedaan. De gemeente doet, voordat zij een huisbezoek aflegt, altijd nog een eigen adresonderzoek.", - "risks": "De persoonlijke levenssfeer komt mogelijk in het gedrang, door het verwerken van persoonsgegevens en het afleggen van een huisbezoek door gemeenten.", - "performance_standard": "Trefkans is minimaal 50%", - "provider": null, - "process_index_url": null, - "tags": "Rijksdienst voor Identiteitsgegevens, RvIG, BRP, LAA", - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-05-16 13:53:52.976160+00:00", - "lars": "14116126", - "owner": "rijksdienst-voor-identiteitsgegevens" - }, - { - "name": "Profiel Herinschrijvingen A Landelijke Aanpak Adreskwaliteit (LAA)", - "organization": "Rijksdienst Voor Identiteitsgegevens", - "department": "Directie Uitvoering, afdeling Onderzoek & Analyse", - "description_short": "Van personen van wie de vorige verblijfplaats tijdelijk onbekend was, is gebleken dat de registratie in de BRP vaak niet overeenkomt met de feitelijke situatie. Het algoritme selecteert potenti\u00eble risicoadressen voor nader adresonderzoek.", - "type": "Regelgebaseerd", - "category": "Basisregistratie", - "website": null, - "status": "In gebruik", - "goal": "Het doel van dit algoritme is om potenti\u00eble risicoadressen te selecteren op basis van gerede twijfel en deze aan gemeenten te leveren voor nader adresonderzoek. Op basis van deze adresonderzoeken worden onjuiste adresgegevens gecorrigeerd, zodat overheidsorganen op basis van juiste informatie hun publieke taken kunnen uitvoeren.", - "impact": "Als een onderzoek naar inschrijving van personen op het adres gaat plaatsvinden, volgt een huisbezoek op het adres. De persoonlijke levenssfeer komt mogelijk in het gedrang tijdens een adresbezoek door gemeenten. Er wordt niet geselecteerd op nationaliteit, geboorteplaats of afgeleiden daarvan. Gegevens als bijvoorbeeld het gebruik van een naam zijn noodzakelijk voor het adresonderzoek om gezinsverbanden vast te kunnen stellen en om burgers aan te schrijven om hen te informeren over het adresonderzoek. Dit gebruik van iemands naam in de verwerking van data is niet discriminatoir.", - "proportionality": "De juistheid van (adres)gegevens in de BRP is essentieel voor het functioneren van de Nederlandse overheid. Een overheid die haar burgers niet kent of niet weet te vinden, is niet in staat om de taken te verrichten die door de burgers aan haar zijn toevertrouwd. Het is in veel gevallen een randvoorwaarde voor het correct uitvoeren van wettelijke regelingen en voor de effectiviteit van overheidsbeleid. Voor de burger is een juiste registratie van belang voor zijn correspondentie met de overheid en om aanspraak te kunnen maken op adres-gerelateerde overheidsvoorzieningen.\n\nIn regelgeving is uitdrukkelijk opgenomen welke gegevens mogen worden gebruikt bij het algoritme. Gegevens die niet worden genoemd mogen dus niet worden gebruikt. Ook worden er geen (persoons)gegevens gebruikt die tot discriminatie kunnen leiden. Er wordt niet geselecteerd op nationaliteit, geboorteplaats of afgeleiden daarvan.\n\nHet effici\u00ebnt en zo effectief mogelijk vinden van adressen waar de kans van incorrecte inschrijvingen op adressen zo groot mogelijk is (de trefkans is minimaal 50%) en deze inschrijvingen corrigeren. Met behulp van het algoritme kun je prioriteit geven aan adressen waarbij de kans groter dan 50% is dat er iets niet klopt in de registratie en zorg je er tegelijkertijd voor dat je niet onnodig bij burgers aan de deur komt. Er is bij dit algoritme geen sprake van automatische besluitvorming; er is altijd menselijke tussenkomst door de ambtenaar van de gemeente.", - "decision_making_process": null, - "documentation": null, - "competent_authority": null, - "lawful_basis": "Het profiel Herinschrijving A selecteert adressen op basis van het aantal beslissingen dat op grond van artikel 2.22, eerste lid, van de Wet BRP is genomen ten aanzien van een ingeschrevene op het adres. Artikel 2.22, eerste lid, betreft de ambtshalve bevoegdheid van het college van B&W van de gemeente tot opschorting van de bijhouding van de persoonslijst van een ingezetene die spoorloos is verdwenen, ook wel bekend als vertrokken onbekend waarheen (VOW\u2019er). Van personen van wie de vorige verblijfplaats tijdelijk onbekend was, is gebleken dat de huidige BRP-registratie vaak niet overeenkomt met de feitelijke situatie. Voor dit profiel komen adressen in aanmerking waar zich in de afgelopen zes maanden \u00e9\u00e9n of meer personen van 18 jaar of ouder hebben ingeschreven die voorheen in de BRP de status VOW hadden. Daarnaast is in ieder geval \u00e9\u00e9n van de personen die op het adres staat ingeschreven ten minste twee keer VOW\u2019er geweest. Verder moet \u00e9\u00e9n van de personen die voorheen VOW\u2019er was zich in het afgelopen jaar op het adres hebben ingeschreven en er nog ingeschreven staan. Deze inschrijvingen mogen zowel op een woonadres als op een briefadres zijn. \nIn de wet BRP is vastgelegd dat de minister van Binnenlandse Zaken en Koninkrijkrelaties de gemeente ondersteunt bij het onderzoek of de adresregistratie in de BRP van personen klopt.\n\nDe minister van Binnenlandse Zaken en Koninkrijkrelaties mag hiervoor persoonsgegevens verwerken. Deze persoonsgegevens mag de Minister van Binnenlandse Zaken en Koninkrijkrelaties analyseren aan de hand van een profiel.\n\nIn regelgeving is uitgewerkt welke gegevens mogen worden gebruikt en welke waarborgen moeten worden nageleefd bij de ontwikkeling van het profiel (waaronder de menselijke tussenkomst).\n\nVoordat het profiel landelijk in gebruik wordt genomen wordt de werking ervan eerst getest met een klein aantal gemeenten. Bekeken wordt of het profiel doet wat het doen moet en of de trefkans voldoende is.\n\nAls het profiel in gebruik is, wordt hij regelmatig ge\u00ebvalueerd en wordt bekeken of het profiel nog altijd voldoet aan de verwachtingen. Als dat niet meer het geval is, wordt het profiel aangepast of niet meer gebruikt.", - "iama": "Nee", - "iama_description": null, - "dpia": "Nee", - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.3.1", - "uuid": null, - "url": null, - "contact_email": "info@rvig.nl", - "area": "Nederland", - "lang": "nld", - "revision_date": null, - "description": "De adressen moeten voor het profiel Herinschrijvingen A voldoen aan onderstaande criteria: \nDe leeftijd van de VOW\u2019 ers is 18 jaar of ouder.\nEen van de VOW\u2019 ers die er nog staat ingeschreven woont er korter dan 6 maanden.\nOp het adres staat in ieder geval 1 persoon ingeschreven met een woonadres die voor de inschrijving VOW was en in het verleden meerder keer VOW is geweest. Op het moment van inschrijven van deze persoon stond er nog iemand anders ingeschreven op het adres (ongeacht of deze persoon een woon- of briefadres heeft).\nOp het adres wonen momenteel 2 of meer entiteiten. Personen die eerste graad familie zijn, zoals geregistreerd in de BRP, behoren tot dezelfde entiteit.\nVan de adressen die overblijven worden de volgende adressen uitgesloten:\nAdressen die volgens de Basisregistratie Adressen en Gebouwen (BAG) zowel de gebruiksfunctie \u2018Gezondheidsfunctie\u2019 als \u2018Logiesfunctie\u2019 hebben.\nAdressen die volgens de BAG alleen de gebruiksfunctie \u2018Celfunctie\u2019 of \u2018Gezondheidsfunctie\u2019 hebben.\nAdressen waar meer dan 20 personen in de BRP staan ingeschreven, ongeacht of het gaat om een woonadres of een briefadres.\nAdressen waar meer dan 10 personen staan ingeschreven (ongeacht of het gaat om een woonadres of een briefadres) en die volgens de basisregistratie adressen en gebouwen (BAG) de gebruiksfunctie \u2018Bijeenkomstfunctie\u2019 of \u2018Logiesfunctie\u2019 hebben.", - "application_url": "\u00a0", - "publiccode": null, - "mprd": null, - "source_data": "\u2022 Gegevens over de burgerlijke staat:\n- Naam \u2013 Geslachtsnaam, Voornamen;\n- Geboorte - Geboortedatum\n- Geslacht\n- Ouders \u2013 Geslachtsnaam, Voornamen, Geboortedatum;\n- Huwelijk dan wel geregistreerd partnerschap en eerdere huwelijken of eerdere geregistreerde partnerschappen - Aanduiding huwelijk of geregistreerd partnerschap; Datum huwelijkssluiting of datum aangaan geregistreerd partnerschap; Huwelijksontbinding of ontbinding geregistreerd partnerschap en reden daarvan, dan wel nietigverklaring huwelijk of geregistreerd partnerschap; Datum ontbinding, dan wel nietigverklaring huwelijk of geregistreerd partnerschap\n- Echtgenoot dan wel geregistreerd partner en eerdere echtgenoten of geregistreerde partners \u2013 Geslachtsnaam, Voornamen, Geboortedatum;\n- Kinderen \u2013 Geslachtsnaam, Voornamen, Geboortedatum\n- Overlijden \u2013 Overlijdensdatum\n- Data ingang en be\u00ebindiging rechtsgeldigheid gegevens - Datum ingang rechtsgeldigheid; Datum be\u00ebindiging rechtsgeldigheid\n\u2022 Gegevens over de bijhoudingsgemeente en het adres in die gemeente alsmede over het verblijf in Nederland en het vertrek uit Nederland\n- Bijhoudingsgemeente \u2013 Gemeente; Datum aanvang adreshouding in de gemeente\n- Adres - Functie van het adres; Gemeente; Woonplaats; Straatnaam en zo nodig deel van een gemeente; Huisnummer; Locatie ten opzichte van adres; Huisletter; Huisnummertoevoeging; Locatiebeschrijving en zo nodig deel van een gemeente; Postcode; Datum aanvang adreshouding; Datum ingang rechtsgeldigheid\n- Vertrek uit Nederland - Datum vertrek; Volgend land of gebied van verblijf;\n\u2022 Gegevens over het woonadres van de niet-ingezetene - Datum ingang rechtsgeldigheid; Datum be\u00ebindiging rechtsgeldigheid;\n\u2022 Gegevens over het burgerservicenummer van de ingeschrevene - Burgerservicenummer ingeschrevene; Datum van kracht worden van het burgerservicenummer; Datum be\u00ebindiging van het burgerservicenummer;\n\u2022 Gegevens over de burgerservicenummers van de ouders, de echtgenoot dan wel de geregistreerde partner, de eerdere echtgenoten of eerdere geregistreerde partners en de kinderen - Burgerservicenummer ouder; Burgerservicenummer echtgenoot dan wel geregistreerde partner; Burgerservicenummer eerdere echtgenoot; Burgerservicenummer eerdere geregistreerde partner; Burgerservicenummer kind; Data van kracht worden burgerservicenummers; Data be\u00ebindiging burgerservicenummers\n\u2022 Gegevens over het gebruik door de ingeschrevene van de geslachtsnaam van de echtgenoot, de geregistreerde partner, de eerdere echtgenoot of de eerdere geregistreerde partner \u2013 Naamgebruik; Datum ingang van het gegeven over het naamgebruik; Datum be\u00ebindiging van het gegeven over het naamgebruik\n\u2022 Gegevens over het tijdelijk verblijfsadres\n- Tijdelijk verblijfsadres \u2013 Gemeente; Woonplaats; Straatnaam en zo nodig deel van een gemeente; Huisnummer; Huisletter; Huisnummertoevoeging; Postcode; Datum ingang rechtsgeldigheid; Datum be\u00ebindiging rechtsgeldigheid\n\u2022 Gegevens in verband met de inschrijving en de wijziging van de bijhoudingsgemeente betreffende de ingezetene, gegevens in verband met de inschrijving betreffende de niet-ingezetene en gegevens betreffende de wijziging van de bijhoudings-verantwoordelijke betreffende de niet-ingezetene die ingezetene wordt - De hoedanigheid van de persoon die aangifte van verblijf en adres, van adreswijziging, of van vertrek heeft gedaan, dan wel de aantekening dat de gegevens ambtshalve zijn opgenomen; Datum inschrijving in de basisregistratie; Datum blokkering persoonslijst in verband met wijziging van de bijhoudingsverantwoordelijke; Gemeentecode van de gemeente waar de persoonskaart zich bevindt; Aantekening dat alle gegevens over kinderen, die aan de persoonskaart ontleend kunnen worden, op de persoonslijst zijn opgenomen\n\u2022 Gegevens ter aanduiding van akten en andere geschriften waaruit algemene gegevens zijn verkregen\n- Aanduiding van akten van de Nederlandse burgerlijke stand - Nummer van de akte waaraan een algemeen gegeven over de burgerlijke staat is ontleend; Gemeentecode van de gemeente waar de akte in de registers is opgenomen\n- Aanduiding van andere akten en geschriften - Omschrijving van het geschrift waaraan een algemeen gegeven is ontleend; Code van de bijhoudingsverantwoordelijke die het gegeven heeft ontleend; Datum van ontlening\n- Gegevens ter aanduiding van de onjuistheid van een opgenomen algemeen gegeven of van strijd met de Nederlandse openbare orde van een opgenomen gegeven over de burgerlijke staat - Aanduiding van het opgenomen algemeen gegeven dat onjuist is;\n- Gegevens over een onderzoek naar de onjuistheid van een opgenomen algemeen gegeven of de strijdigheid van een opgenomen gegeven over de burgerlijke staat - Aanduiding van de verzameling van gegevens, waarbinnen algeme", - "methods_and_models": "Beslisboom algoritme", - "monitoring": "Het algoritme wordt maandelijks ge\u00ebvalueerd door het meten van trefkans na de adresonderzoeken die door gemeenten zijn uitgevoerd. Alle LAA-profielen worden regelmatig ge\u00ebvalueerd met het oog op de vraag of zij nog werken, aangepast moeten worden of hun effectiviteit hebben verloren en niet meer gebruikt moeten worden. Op die manier wordt geprobeerd de privacy impact op de Nederlandse burger zo klein mogelijk te houden. Een dergelijke evaluatie wordt minimaal drie keer per jaar gedaan in samenwerking met de samenwerkingspartners (gemeenten en afnemers). Tegen een besluit van de gemeente die leidt tot een aanpassing of wijziging van het adres of een uitschrijving, kan bezwaar worden gemaakt bij de gemeente. Een verzoek tot inzage kan worden gedaan in de bij de RvIG aanwezige persoonsgegevens.", - "human_intervention": "Op grond van de Wet BRP zijn nadere regels gesteld over de maatregelen om menselijke tussenkomst te waarborgen bij de ontwikkeling van profielen. Tijdens het ontwikkelen van het algoritme is advies gevraagd aan een representatieve vertegenwoordiging van de gemeenten en aangewezen bestuursorganen. Er worden om die reden geen persoonsgegevens verwerkt (geanalyseerd) voordat dit is besproken met de betrokken partijen. In de meeste gevallen wordt daarnaast ook de Autoriteit Persoonsgegevens (AP) om advies gevraagd.\n\nEr is geen sprake van automatische besluitvorming. Algoritmes zijn een middel en zijn niet leidend. De beoordeling en beslissingen worden uiteindelijk altijd door mensen gedaan. De gemeente doet, voordat zij een huisbezoek aflegt, altijd nog een eigen adresonderzoek.", - "risks": "De persoonlijke levenssfeer komt mogelijk in het gedrang, door het verwerken van persoonsgegevens en het afleggen van een huisbezoek door gemeenten", - "performance_standard": "Trefkans is minimaal 50%", - "provider": null, - "process_index_url": null, - "tags": "Rijksdienst voor Identiteitsgegevens, RvIG, BRP, LAA", - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-05-16 13:41:18.783231+00:00", - "lars": "79125837", - "owner": "rijksdienst-voor-identiteitsgegevens" - }, - { - "name": "Profiel Herinschrijvingen B Landelijke Aanpak Adreskwaliteit (LAA)", - "organization": "Rijksdienst Voor Identiteitsgegevens", - "department": "Directie Uitvoering, afdeling Onderzoek & Analyse", - "description_short": "Het algoritme selecteert potenti\u00eble risicoadressen voor nader adresonderzoek: adressen waarop in de afgelopen twee jaar minstens drie keer de BRP-status \u2018Vertrokken onbekend waarheen\u2019 (VOW) is gegeven. ", - "type": "Regelgebaseerd", - "category": "Basisregistratie", - "website": null, - "status": "In gebruik", - "goal": "Het doel van dit algoritme is om potenti\u00eble risicoadressen te selecteren op basis van gerede twijfel en deze aan gemeenten te leveren voor nader adresonderzoek. Op basis van deze adresonderzoeken worden onjuiste adresgegevens gecorrigeerd, zodat overheidsorganen op basis van juiste informatie hun publieke taken kunnen uitvoeren.", - "impact": "Als een onderzoek naar inschrijving van personen op het adres gaat plaatsvinden, volgt een huisbezoek op het adres. De persoonlijke levenssfeer komt mogelijk in het gedrang tijdens een adresbezoek door gemeenten. Er wordt niet geselecteerd op nationaliteit, geboorteplaats of afgeleiden daarvan. Gegevens als bijvoorbeeld het gebruik van een naam zijn noodzakelijk voor het adresonderzoek om gezinsverbanden vast te kunnen stellen en om burgers aan te schrijven om hen te informeren over het adresonderzoek. Dit gebruik van iemands naam in de verwerking van data is niet discriminatoir.", - "proportionality": "De juistheid van (adres)gegevens in de BRP is essentieel voor het functioneren van de Nederlandse overheid. Een overheid die haar burgers niet kent of niet weet te vinden, is niet in staat om de taken te verrichten die door de burgers aan haar zijn toevertrouwd. Het is in veel gevallen een randvoorwaarde voor het correct uitvoeren van wettelijke regelingen en voor de effectiviteit van overheidsbeleid. Voor de burger is een juiste registratie van belang voor zijn correspondentie met de overheid en om aanspraak te kunnen maken op adres-gerelateerde overheidsvoorzieningen.\n\nIn regelgeving is uitdrukkelijk opgenomen welke gegevens mogen worden gebruikt bij het algoritme. Gegevens die niet worden genoemd mogen dus niet worden gebruikt. Ook worden er geen (persoons)gegevens gebruikt die tot discriminatie kunnen leiden. Er wordt niet geselecteerd op nationaliteit, geboorteplaats of afgeleiden daarvan.\n\nHet effici\u00ebnt en zo effectief mogelijk vinden van adressen waar de kans van incorrecte inschrijvingen op adressen zo groot mogelijk is (de trefkans is minimaal 50%) en deze inschrijvingen corrigeren. Met behulp van het algoritme kun je prioriteit geven aan adressen waarbij de kans groter dan 50% is dat er iets niet klopt in de registratie en zorg je er tegelijkertijd voor dat je niet onnodig bij burgers aan de deur komt. Er is bij dit algoritme geen sprake van automatische besluitvorming; er is altijd menselijke tussenkomst door de ambtenaar van de gemeente.", - "decision_making_process": null, - "documentation": null, - "competent_authority": null, - "lawful_basis": "In de wet BRP is vastgelegd dat de Minister van Binnenlandse Zaken en Koninkrijkrelaties de gemeente ondersteunt bij het onderzoek of de adresregistratie in de BRP van personen klopt.\n\nDe Minister van Binnenlandse Zaken en Koninkrijkrelaties mag hiervoor persoonsgegevens verwerken. Deze persoonsgegevens mag de Minister van Binnenlandse Zaken en Koninkrijkrelaties analyseren aan de hand van een profiel.\n\nIn regelgeving is uitgewerkt welke gegevens mogen worden gebruikt en welke waarborgen moeten worden nageleefd bij de ontwikkeling van het profiel (waaronder de menselijke tussenkomst).\n\nVoordat het profiel landelijk in gebruik wordt genomen wordt de werking ervan eerst getest met een klein aantal gemeenten. Bekeken wordt of het profiel doet wat het doen moet en of de trefkans voldoende is.\n\nAls het profiel in gebruik is, wordt hij regelmatig ge\u00ebvalueerd en wordt bekeken of het profiel nog altijd voldoet aan de verwachtingen. Als dat niet meer het geval is, wordt het profiel aangepast of niet meer gebruikt.", - "iama": null, - "iama_description": null, - "dpia": "Nee", - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.3.1", - "uuid": null, - "url": null, - "contact_email": "info@rvig.nl", - "area": "Nederland", - "lang": "nld", - "revision_date": null, - "description": "Het profiel Herinschrijving B betreft adressen waar in de afgelopen twee jaar in ieder geval drie mutaties hebben plaatsgevonden van of naar de BRP-status \u2018Vertrokken onbekend waarheen\u2019 (VOW). Een VOW-mutatie houdt in dat er een persoon was ingeschreven op een bepaald adres en vanaf dat adres de BRP-status VOW heeft gekregen. Een andere mogelijkheid is dat een persoon in de BRP de status VOW had en vervolgens op dit adres wordt ingeschreven. De ervaring leert dat er een verhoogd risico is dat de inschrijvingen op deze adressen onjuist zijn. Deze inschrijvingen betreffen alleen inschrijvingen op een woonadres.\n\nDe adressen moeten voor het profiel Herinschrijvingen B voldoen aan onderstaande criteria:\n\nAdressen waar de afgelopen 2 jaar in ieder geval een aantal mutaties hebben plaatsgevonden van of naar de BRP- status VOW. Hierbij moet het gaan om personen die 18 jaar of ouder waren ten tijde van die mutatie.\nAdressen waar zich in de afgelopen jaar een VOW-mutatie heeft voorgedaan.\nVan de adressen die overblijven worden de volgende adressen uitgesloten:\n\nAdressen die volgens de Basisregistratie Adressen en Gebouwen (BAG) zowel de gebruiksfunctie \u2018Gezondheidsfunctie\u2019 als \u2018Logiesfunctie\u2019 hebben.\nAdressen waarbij alle personen op het adres dezelfde geslachtsnaam hebben en er minimaal 3 personen op het adres staan ingeschreven.\nAdressen waarbij alle personen op het adres hebben dezelfde inschrijvingsdatum en de inschrijving geen technische of infrastructurele wijziging betreft.\nAlle adressen waarbij er minimaal 3 personen op het adres wonen en alle personen op het adres dezelfde geslachtsnaam hebben, behalve een volwassen vrouw die 18 jaar of ouder is.\nAls er meerdere volwassen vrouwen op het adres wonen dan wordt het adres niet uitgesloten.\nAdressen die volgens de BAG alleen de gebruiksfunctie \u2018Celfunctie\u2019 of \u2018Gezondheidsfunctie\u2019 hebben.\nAdressen waar meer dan 20 personen in de BRP staan ingeschreven, ongeacht of het gaat om een woonadres of een briefadres.\nAdressen waar op dit moment 1 entiteit staat ingeschreven. Echtgenoten, geregistreerde partners dan wel bloed- of aanverwanten in de eerste graad, behoren tot dezelfde entiteit.\nAdressen waar meer dan 10 personen staan ingeschreven (ongeacht of het gaat om een woonadres of een briefadres) en die volgens de basisregistratie adressen en gebouwen, de BAG, de gebruiksfunctie \u2018Bijeenkomstfunctie\u2019 of \u2018Logiesfunctie\u2019 hebben.", - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": "\u2022 Gegevens over de burgerlijke staat:\n- Naam \u2013 Geslachtsnaam, Voornamen;\n- Geboorte - Geboortedatum\n- Geslacht\n- Ouders \u2013 Geslachtsnaam, Voornamen, Geboortedatum;\n- Huwelijk dan wel geregistreerd partnerschap en eerdere huwelijken of eerdere geregistreerde partnerschappen - Aanduiding huwelijk of geregistreerd partnerschap; Datum huwelijkssluiting of datum aangaan geregistreerd partnerschap; Huwelijksontbinding of ontbinding geregistreerd partnerschap en reden daarvan, dan wel nietigverklaring huwelijk of geregistreerd partnerschap; Datum ontbinding, dan wel nietigverklaring huwelijk of geregistreerd partnerschap\n- Echtgenoot dan wel geregistreerd partner en eerdere echtgenoten of geregistreerde partners \u2013 Geslachtsnaam, Voornamen, Geboortedatum;\n- Kinderen \u2013 Geslachtsnaam, Voornamen, Geboortedatum\n- Overlijden \u2013 Overlijdensdatum\n- Data ingang en be\u00ebindiging rechtsgeldigheid gegevens - Datum ingang rechtsgeldigheid; Datum be\u00ebindiging rechtsgeldigheid\n\u2022 Gegevens over de bijhoudingsgemeente en het adres in die gemeente alsmede over het verblijf in Nederland en het vertrek uit Nederland\n- Bijhoudingsgemeente \u2013 Gemeente; Datum aanvang adreshouding in de gemeente\n- Adres - Functie van het adres; Gemeente; Woonplaats; Straatnaam en zo nodig deel van een gemeente; Huisnummer; Locatie ten opzichte van adres; Huisletter; Huisnummertoevoeging; Locatiebeschrijving en zo nodig deel van een gemeente; Postcode; Datum aanvang adreshouding; Datum ingang rechtsgeldigheid\n- Vertrek uit Nederland - Datum vertrek; Volgend land of gebied van verblijf;\n\u2022 Gegevens over het woonadres van de niet-ingezetene - Datum ingang rechtsgeldigheid; Datum be\u00ebindiging rechtsgeldigheid;\n\u2022 Gegevens over het burgerservicenummer van de ingeschrevene - Burgerservicenummer ingeschrevene; Datum van kracht worden van het burgerservicenummer; Datum be\u00ebindiging van het burgerservicenummer;\n\u2022 Gegevens over de burgerservicenummers van de ouders, de echtgenoot dan wel de geregistreerde partner, de eerdere echtgenoten of eerdere geregistreerde partners en de kinderen - Burgerservicenummer ouder; Burgerservicenummer echtgenoot dan wel geregistreerde partner; Burgerservicenummer eerdere echtgenoot; Burgerservicenummer eerdere geregistreerde partner; Burgerservicenummer kind; Data van kracht worden burgerservicenummers; Data be\u00ebindiging burgerservicenummers\n\u2022 Gegevens over het gebruik door de ingeschrevene van de geslachtsnaam van de echtgenoot, de geregistreerde partner, de eerdere echtgenoot of de eerdere geregistreerde partner \u2013 Naamgebruik; Datum ingang van het gegeven over het naamgebruik; Datum be\u00ebindiging van het gegeven over het naamgebruik\n\u2022 Gegevens over het tijdelijk verblijfsadres\n- Tijdelijk verblijfsadres \u2013 Gemeente; Woonplaats; Straatnaam en zo nodig deel van een gemeente; Huisnummer; Huisletter; Huisnummertoevoeging; Postcode; Datum ingang rechtsgeldigheid; Datum be\u00ebindiging rechtsgeldigheid\n\u2022 Gegevens in verband met de inschrijving en de wijziging van de bijhoudingsgemeente betreffende de ingezetene, gegevens in verband met de inschrijving betreffende de niet-ingezetene en gegevens betreffende de wijziging van de bijhoudings-verantwoordelijke betreffende de niet-ingezetene die ingezetene wordt - De hoedanigheid van de persoon die aangifte van verblijf en adres, van adreswijziging, of van vertrek heeft gedaan, dan wel de aantekening dat de gegevens ambtshalve zijn opgenomen; Datum inschrijving in de basisregistratie; Datum blokkering persoonslijst in verband met wijziging van de bijhoudingsverantwoordelijke; Gemeentecode van de gemeente waar de persoonskaart zich bevindt; Aantekening dat alle gegevens over kinderen, die aan de persoonskaart ontleend kunnen worden, op de persoonslijst zijn opgenomen\n\u2022 Gegevens ter aanduiding van akten en andere geschriften waaruit algemene gegevens zijn verkregen\n- Aanduiding van akten van de Nederlandse burgerlijke stand - Nummer van de akte waaraan een algemeen gegeven over de burgerlijke staat is ontleend; Gemeentecode van de gemeente waar de akte in de registers is opgenomen\n- Aanduiding van andere akten en geschriften - Omschrijving van het geschrift waaraan een algemeen gegeven is ontleend; Code van de bijhoudingsverantwoordelijke die het gegeven heeft ontleend; Datum van ontlening\n- Gegevens ter aanduiding van de onjuistheid van een opgenomen algemeen gegeven of van strijd met de Nederlandse openbare orde van een opgenomen gegeven over de burgerlijke staat - Aanduiding van het opgenomen algemeen gegeven dat onjuist is;\n- Gegevens over een onderzoek naar de onjuistheid van een opgenomen algemeen gegeven of de strijdigheid van een opgenomen gegeven over de burgerlijke staat - Aanduiding van de verzameling van gegevens, waarbinnen algeme", - "methods_and_models": "Beslisboom algoritme", - "monitoring": "Het algoritme wordt maandelijks ge\u00ebvalueerd door het meten van trefkans na de adresonderzoeken die door gemeenten zijn uitgevoerd. Alle LAA-profielen worden regelmatig ge\u00ebvalueerd met het oog op de vraag of zij nog werken, aangepast moeten worden of hun effectiviteit hebben verloren en niet meer gebruikt moeten worden. Op die manier wordt geprobeerd de privacy impact op de Nederlandse burger zo klein mogelijk te houden. Een dergelijke evaluatie wordt minimaal drie keer per jaar gedaan in samenwerking met de samenwerkingspartners (gemeenten en afnemers). Tegen een besluit van de gemeente die leidt tot een aanpassing of wijziging van het adres of een uitschrijving, kan bezwaar worden gemaakt bij de gemeente. Een verzoek tot inzage kan worden gedaan in de bij de RvIG aanwezige persoonsgegevens.", - "human_intervention": "Op grond van de Wet BRP zijn nadere regels gesteld over de maatregelen om menselijke tussenkomst te waarborgen bij de ontwikkeling van profielen. Tijdens het ontwikkelen van het algoritme is advies gevraagd aan een representatieve vertegenwoordiging van de gemeenten en aangewezen bestuursorganen. Er worden om die reden geen persoonsgegevens verwerkt (geanalyseerd) voordat dit is besproken met de betrokken partijen. In de meeste gevallen wordt daarnaast ook de Autoriteit Persoonsgegevens (AP) om advies gevraagd.\n\nEr is geen sprake van automatische besluitvorming. Algoritmes zijn een middel en zijn niet leidend. De beoordeling en beslissingen worden uiteindelijk altijd door mensen gedaan. De gemeente doet, voordat zij een huisbezoek aflegt, altijd nog een eigen adresonderzoek.", - "risks": "De persoonlijke levenssfeer komt mogelijk in het gedrang, door het verwerken van persoonsgegevens en het afleggen van een huisbezoek door gemeenten.", - "performance_standard": "Trefkans is minimaal 50%", - "provider": null, - "process_index_url": null, - "tags": "Rijksdienst voor Identiteitsgegevens, RvIG, BRP, LAA", - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-05-16 13:27:34.158890+00:00", - "lars": "54524835", - "owner": "rijksdienst-voor-identiteitsgegevens" - }, - { - "name": "Profiel Samenwoners Landelijke Aanpak Adreskwaliteit (LAA)", - "organization": "Rijksdienst Voor Identiteitsgegevens", - "department": "Directie Uitvoering, afdeling Onderzoek & Analyse", - "description_short": "Met het algoritme worden potenti\u00eble risicoadressen geselecteerd voor nader adresonderzoek: woonadressen waarbij vier of meer personen in de Basisregistratie Personen (BRP) staan ingeschreven die geen eerstegraads familie van elkaar zijn.", - "type": "Regelgebaseerd", - "category": "Basisregistratie", - "website": null, - "status": "In gebruik", - "goal": "Het doel van dit algoritme is om potenti\u00eble risicoadressen te selecteren op basis van gerede twijfel en deze aan gemeenten te leveren voor nader adresonderzoek. Op basis van deze adresonderzoeken worden onjuiste adresgegevens gecorrigeerd, zodat overheidsorganen die gebruik maken van gegevens uit de BRP op basis van juiste informatie hun publieke taken kunnen uitvoeren.", - "impact": "Als een onderzoek naar inschrijving van personen op het adres plaats gaat vinden, wordt er huisbezoek op het adres gedaan. De persoonlijke levenssfeer komt mogelijk in het gedrang tijdens een adresbezoek door gemeenten. Gegevens als het gebruik van een naam zijn noodzakelijk voor het adresonderzoek om gezinsverbanden vast te kunnen stellen en om burgers aan te schrijven om hen te informeren over het adresonderzoek.", - "proportionality": "De juistheid van (adres)gegevens in de BRP is essentieel voor het functioneren van de Nederlandse overheid. Een overheid die haar burgers niet kent of niet weet te vinden, is niet in staat om de taken te verrichten die door de burgers aan haar zijn toevertrouwd. Het is in veel gevallen een randvoorwaarde voor het correct uitvoeren van wettelijke regelingen en voor de effectiviteit van overheidsbeleid. Voor de burger is een juiste registratie van belang voor zijn correspondentie met de overheid en om aanspraak te kunnen maken op adres-gerelateerde overheidsvoorzieningen.\n\nIn regelgeving is uitdrukkelijk opgenomen welke gegevens mogen worden gebruikt bij het algoritme. Gegevens die niet worden genoemd mogen dus niet worden gebruikt. Ook worden er geen (persoons)gegevens gebruikt die tot discriminatie kunnen leiden. Er wordt niet geselecteerd op nationaliteit, geboorteplaats of afgeleiden daarvan.\n\nDe inzet van het algoritme is een kosteneffectieve manier om de kwaliteit van de BRP te borgen. Met behulp van het algoritme kun je prioriteit geven aan adressen waarbij de kans groter dan 50% is dat er iets niet klopt in de registratie en zorg je er tegelijkertijd voor dat je niet onnodig bij burgers aan de deur komt. Er is bij dit algoritme geen sprake van automatische besluitvorming; er is altijd menselijke tussenkomst door de ambtenaar van de gemeente.", - "decision_making_process": null, - "documentation": null, - "competent_authority": null, - "lawful_basis": "De minister van Binnenlandse Zaken en Koninkrijkrelaties mag hiervoor persoonsgegevens verwerken. Deze persoonsgegevens mag de minister van Binnenlandse Zaken en Koninkrijkrelaties analyseren aan de hand van een profiel.\n\nIn regelgeving is uitgewerkt welke gegevens mogen worden gebruikt en welke waarborgen moeten worden nageleefd bij de ontwikkeling van het profiel (waaronder de menselijke tussenkomst).\n\nVoordat het profiel landelijk in gebruik wordt genomen wordt de werking ervan eerst getest met een klein aantal gemeenten. Bekeken wordt of het profiel doet wat het doen moet en of de trefkans voldoende is.\n\nAls het profiel in gebruik is, wordt hij regelmatig ge\u00ebvalueerd en wordt bekeken of het profiel nog altijd voldoet aan de verwachtingen. Als dat niet meer het geval is, wordt het profiel aangepast of niet meer gebruikt.", - "iama": "Nee", - "iama_description": null, - "dpia": "Nee", - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.3.1", - "uuid": null, - "url": null, - "contact_email": "info@rvig.nl", - "area": "Nederland", - "lang": "nld", - "revision_date": null, - "description": "De adressen moeten voor het profiel Samenwoners voldoen aan onderstaande criteria:\n\nAdressen waarbij het aantal ingeschreven entiteiten 4 of meer entiteiten bevatten, afhankelijk van de grootte van de gemeente (gemeenten met minder of meer inwoners dan 25.000).\nVan de adressen die overblijven worden de volgende adressen uitgesloten:\n\nAdressen die volgens de Basisregistratie Adressen en Gebouwen (BAG) zowel de gebruiksfunctie \u2018Gezondheidsfunctie\u2019 als \u2018Logiesfunctie\u2019 hebben.\nAdressen waarbij alle personen op het adres dezelfde geslachtsnaam hebben en er minimaal 3 personen op het adres staan ingeschreven.\nAlle adressen waarbij er minimaal 3 personen op het adres wonen en alle personen op het adres dezelfde geslachtsnaam hebben, behalve een volwassen vrouw die 18 jaar of ouder is.Als er meerdere volwassen vrouwen op het adres wonen dan wordt het adres niet uitgesloten\nAdressen die volgens de BAG alleen de gebruiksfunctie \u2018Celfunctie\u2019 of \u2018Gezondheidsfunctie\u2019 hebben.\nAdressen waarbij alle personen op het adres dezelfde inschrijvingsdatum hebben en de inschrijving geen technische of infrastructurele wijziging betreft.\nAdressen waar meer dan 10 personen staan ingeschreven (ongeacht of het gaat om een woonadres of een briefadres) en die volgens de basisregistratie adressen en gebouwen, de BAG, de gebruiksfunctie \u2018Bijeenkomstfunctie\u2019 of \u2018Logiesfunctie\u2019 hebben.", - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": "\u2022 Gegevens over de burgerlijke staat:\n\n- Naam \u2013 Geslachtsnaam, Voornamen;\n\n- Geboorte - Geboortedatum\n\n- Geslacht\n\n- Ouders \u2013 Geslachtsnaam, Voornamen, Geboortedatum;\n\n- Huwelijk dan wel geregistreerd partnerschap en eerdere huwelijken of eerdere geregistreerde partnerschappen - Aanduiding huwelijk of geregistreerd partnerschap; Datum huwelijkssluiting of datum aangaan geregistreerd partnerschap; Huwelijksontbinding of ontbinding geregistreerd partnerschap en reden daarvan, dan wel nietigverklaring huwelijk of geregistreerd partnerschap; Datum ontbinding, dan wel nietigverklaring huwelijk of geregistreerd partnerschap\n\n- Echtgenoot dan wel geregistreerd partner en eerdere echtgenoten of geregistreerde partners \u2013 Geslachtsnaam, Voornamen, Geboortedatum;\n\n- Kinderen \u2013 Geslachtsnaam, Voornamen, Geboortedatum\n\n- Overlijden \u2013 Overlijdensdatum\n\n- Data ingang en be\u00ebindiging rechtsgeldigheid gegevens - Datum ingang rechtsgeldigheid; Datum be\u00ebindiging rechtsgeldigheid\n\n\u2022 Gegevens over de bijhoudingsgemeente en het adres in die gemeente alsmede over het verblijf in Nederland en het vertrek uit Nederland\n\n- Bijhoudingsgemeente \u2013 Gemeente; Datum aanvang adreshouding in de gemeente\n\n- Adres - Functie van het adres; Gemeente; Woonplaats; Straatnaam en zo nodig deel van een gemeente; Huisnummer; Locatie ten opzichte van adres; Huisletter; Huisnummertoevoeging; Locatiebeschrijving en zo nodig deel van een gemeente; Postcode; Datum aanvang adreshouding; Datum ingang rechtsgeldigheid\n\n- Vertrek uit Nederland - Datum vertrek; Volgend land of gebied van verblijf;\n\n\u2022 Gegevens over het woonadres van de niet-ingezetene - Datum ingang rechtsgeldigheid; Datum be\u00ebindiging rechtsgeldigheid;\n\n\u2022 Gegevens over het burgerservicenummer van de ingeschrevene - Burgerservicenummer ingeschrevene; Datum van kracht worden van het burgerservicenummer; Datum be\u00ebindiging van het burgerservicenummer;\n\n\u2022 Gegevens over de burgerservicenummers van de ouders, de echtgenoot dan wel de geregistreerde partner, de eerdere echtgenoten of eerdere geregistreerde partners en de kinderen - Burgerservicenummer ouder; Burgerservicenummer echtgenoot dan wel geregistreerde partner; Burgerservicenummer eerdere echtgenoot; Burgerservicenummer eerdere geregistreerde partner; Burgerservicenummer kind; Data van kracht worden burgerservicenummers; Data be\u00ebindiging burgerservicenummers\n\n\u2022 Gegevens over het gebruik door de ingeschrevene van de geslachtsnaam van de echtgenoot, de geregistreerde partner, de eerdere echtgenoot of de eerdere geregistreerde partner \u2013 Naamgebruik; Datum ingang van het gegeven over het naamgebruik; Datum be\u00ebindiging van het gegeven over het naamgebruik\n\n\u2022 Gegevens over het tijdelijk verblijfsadres\n\n- Tijdelijk verblijfsadres \u2013 Gemeente; Woonplaats; Straatnaam en zo nodig deel van een gemeente; Huisnummer; Huisletter; Huisnummertoevoeging; Postcode; Datum ingang rechtsgeldigheid; Datum be\u00ebindiging rechtsgeldigheid\n\n\u2022 Gegevens in verband met de inschrijving en de wijziging van de bijhoudingsgemeente betreffende de ingezetene, gegevens in verband met de inschrijving betreffende de niet-ingezetene en gegevens betreffende de wijziging van de bijhoudings-verantwoordelijke betreffende de niet-ingezetene die ingezetene wordt - De hoedanigheid van de persoon die aangifte van verblijf en adres, van adreswijziging, of van vertrek heeft gedaan, dan wel de aantekening dat de gegevens ambtshalve zijn opgenomen; Datum inschrijving in de basisregistratie; Datum blokkering persoonslijst in verband met wijziging van de bijhoudingsverantwoordelijke; Gemeentecode van de gemeente waar de persoonskaart zich bevindt; Aantekening dat alle gegevens over kinderen, die aan de persoonskaart ontleend kunnen worden, op de persoonslijst zijn opgenomen\n\n\u2022 Gegevens ter aanduiding van akten en andere geschriften waaruit algemene gegevens zijn verkregen\n\n- Aanduiding van akten van de Nederlandse burgerlijke stand - Nummer van de akte waaraan een algemeen gegeven over de burgerlijke staat is ontleend; Gemeentecode van de gemeente waar de akte in de registers is opgenomen\n\n- Aanduiding van andere akten en geschriften - Omschrijving van het geschrift waaraan een algemeen gegeven is ontleend; Code van de bijhoudingsverantwoordelijke die het gegeven heeft ontleend; Datum van ontlening\n\n- Gegevens ter aanduiding van de onjuistheid van een opgenomen algemeen gegeven of van strijd met de Nederlandse openbare orde van een opgenomen gegeven over de burgerlijke staat - Aanduiding van het opgenomen algemeen gegeven dat onjuist is;\n\n- Gegevens over een onderzoek naar de onjuistheid van een opgenomen algemeen gegeven of de strijdigheid van een opgenomen gegeven over de burgerlijke staat - Aanduiding van de verzameling van gegevens, waarbinnen algem", - "methods_and_models": "Beslisboom algoritme", - "monitoring": "Het algoritme wordt maandelijks ge\u00ebvalueerd door het meten van de trefkans na de adresonderzoeken die door gemeenten zijn uitgevoerd. Alle LAA-profielen worden regelmatig ge\u00ebvalueerd met het oog op de vraag of zij nog werken, aangepast moeten worden of hun effectiviteit hebben verloren en niet meer gebruikt moeten worden. Op die manier wordt geprobeerd de privacy impact op de Nederlandse burger zo klein mogelijk te houden. Een dergelijke evaluatie wordt minimaal drie keer per jaar gedaan in samenwerking met de samenwerkingspartners (gemeenten en afnemers). Tegen een besluit van de gemeente die leidt tot een aanpassing of wijziging van het adres of een uitschrijving, kan bezwaar worden gemaakt bij de gemeente. Een verzoek tot inzage kan worden gedaan in de bij de RvIG aanwezige persoonsgegevens.", - "human_intervention": "Op grond van de Wet BRP zijn nadere regels gesteld over de maatregelen om menselijke tussenkomst te waarborgen bij de ontwikkeling van profielen. Tijdens het ontwikkelen van het algoritme is advies gevraagd aan een representatieve vertegenwoordiging van de gemeenten en aangewezen bestuursorganen. Er worden om die reden geen persoonsgegevens verwerkt (geanalyseerd) voordat dit is besproken met de betrokken partijen. In de meeste gevallen wordt daarnaast ook de Autoriteit Persoonsgegevens (AP) om advies gevraagd.\n\nEr is geen sprake van automatische besluitvorming. Algoritmes zijn een middel en zijn niet leidend. De beoordeling en beslissingen worden door mensen gedaan. De gemeente doet, voordat zij een huisbezoek aflegt, altijd nog een eigen adresonderzoek.", - "risks": "De persoonlijke levenssfeer komt mogelijk in het gedrang, door het verwerken van persoonsgegevens en het afleggen van een huisbezoek door gemeenten.", - "performance_standard": "Trefkans is minimaal 50%", - "provider": null, - "process_index_url": null, - "tags": "Rijksdienst voor Identiteitsgegevens, RvIG, BRP, LAA", - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-05-16 13:04:27.067240+00:00", - "lars": "26135582", - "owner": "rijksdienst-voor-identiteitsgegevens" - }, - { - "name": "Profiel Veelverhuizers Landelijke Aanpak Adreskwaliteit (LAA)", - "organization": "Rijksdienst Voor Identiteitsgegevens", - "department": "Directie Uitvoering, afdeling Onderzoek & Analyse", - "description_short": "Het algoritme selecteert potenti\u00eble risicoadressen in de Basisregistratie Personen (BRP): adressen met een groot aantal adreswijzigingen in relatief korte tijd.", - "type": "Regelgebaseerd", - "category": "Basisregistratie", - "website": null, - "status": "In gebruik", - "goal": "Het doel van dit algoritme is om potenti\u00eble risicoadressen te selecteren op basis van twijfel aan de inschrijvingen op het adres in de BRP en deze aan gemeenten te leveren voor nader adresonderzoek. Op basis van deze adresonderzoeken worden onjuiste adresgegevens gecorrigeerd, zodat overheidsorganen die gebruik maken van de gegevens uit de BRP op basis van juiste informatie hun publieke taken kunnen uitvoeren.", - "impact": "Als een onderzoek naar inschrijving van personen op het adres plaatsvindt, volgt een huisbezoek op het adres. De persoonlijke levenssfeer komt mogelijk in het gedrang tijdens een adresbezoek door gemeenten. Gegevens als het gebruik van een naam zijn noodzakelijk voor het adresonderzoek om gezinsverbanden vast te kunnen stellen en om burgers aan te schrijven om hen te informeren over het adresonderzoek.", - "proportionality": "De juistheid van (adres)gegevens in de BRP is essentieel voor het functioneren van de Nederlandse overheid. Een overheid die haar burgers niet kent of niet weet te vinden, is niet in staat om de taken te verrichten die door de burgers aan haar zijn toevertrouwd. Het is in veel gevallen een randvoorwaarde voor het correct uitvoeren van wettelijke regelingen en voor de effectiviteit van overheidsbeleid. Voor de burger is een juiste registratie van belang voor zijn correspondentie met de overheid en om aanspraak te kunnen maken op adres-gerelateerde overheidsvoorzieningen.\n\nIn regelgeving is uitdrukkelijk opgenomen welke gegevens mogen worden gebruikt bij het algoritme. Gegevens die niet worden genoemd mogen dus niet worden gebruikt. Ook worden er geen (persoons)gegevens gebruikt die tot discriminatie kunnen leiden. Er wordt niet geselecteerd op nationaliteit, geboorteplaats of afgeleiden daarvan.\n\nDe inzet van het algoritme is een kosteneffectieve manier om de kwaliteit van de BRP te borgen.\n\nMet behulp van het algoritme kun je prioriteit geven aan adressen waarbij de kans groter dan 50% is dat er iets niet klopt in de registratie en zorg je er tegelijkertijd voor dat je niet onnodig bij burgers aan de deur komt. Er is bij dit algoritme geen sprake van automatische besluitvorming; er is altijd menselijke tussenkomst door de ambtenaar van de gemeente.", - "decision_making_process": null, - "documentation": null, - "competent_authority": null, - "lawful_basis": "In de wet BRP is vastgelegd dat de minister van Binnenlandse Zaken en Koninkrijkrelaties de gemeente ondersteunt bij het onderzoek of de adresregistratie in de BRP van personen klopt.\n\nDe minister van Binnenlandse Zaken en Koninkrijkrelaties mag hiervoor persoonsgegevens verwerken. Deze persoonsgegevens mag de minister van Binnenlandse Zaken en Koninkrijkrelaties analyseren aan de hand van een profiel.\n\nIn regelgeving is uitgewerkt welke gegevens mogen worden gebruikt en welke waarborgen moeten worden nageleefd bij de ontwikkeling van het profiel (waaronder de menselijke tussenkomst).\n\nVoordat het profiel landelijk in gebruik wordt genomen wordt de werking ervan eerst getest met een klein aantal gemeenten. Bekeken wordt of het profiel doet wat het doen moet en of de trefkans voldoende is.\n\nAls het profiel in gebruik is, wordt het regelmatig ge\u00ebvalueerd en wordt bekeken of het nog altijd voldoet aan de verwachtingen. Als dat niet meer het geval is, wordt het profiel aangepast of niet meer gebruikt.", - "iama": "Nee", - "iama_description": null, - "dpia": "Nee", - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.3.1", - "uuid": null, - "url": null, - "contact_email": "info@rvig.nl", - "area": "Nederland", - "lang": "nld", - "revision_date": null, - "description": "De adressen moeten voor het profiel Veelverhuizers voldoen aan onderstaande criteria:\n\nDe veelverhuizer moet momenteel 16 jaar of ouder zijn.\nOp het adres wonen momenteel 3 of meer entiteiten. Personen die eerste graad familie zijn, zoals geregistreerd in de BRP, behoren tot dezelfde entiteit.\nOp het adres woont in ieder geval 1 persoon die meerdere keer is verhuisd in de afgelopen 2 jaar.\nVan de adressen die overblijven worden de volgende adressen uitgesloten:\n\nAdressen die volgens de BAG zowel de gebruiksfunctie \u2018Gezondheidsfunctie\u2019 als \u2018Logiesfunctie\u2019 hebben.\nAdressen waar minimaal 10 personen staan ingeschreven (ongeacht of het gaat om een woonadres of een briefadres) en die volgens de Basisregistratie Adressen en Gebouwen hierna de BAG de gebruiksfunctie \u2018Bijeenkomstfunctie\u2019 of \u2018Logiesfunctie\u2019 hebben.\nAdressen waarbij alle personen op het adres dezelfde geslachtsnaam hebben en er minimaal 3 personen op het adres staan ingeschreven.\nAdressen waarbij alle personen op het adres dezelfde inschrijvingsdatum hebben en de inschrijving geen technische of infrastructurele wijziging betreft.\nAlle adressen waarbij er minimaal 3 personen op het adres wonen en alle personen op het adres dezelfde geslachtsnaam hebben, behalve een volwassen vrouw die 18 jaar of ouder is.Als er meerdere volwassen vrouwen op het adres wonen dan wordt het adres niet uitgesloten.\nAdressen die volgens de BAG alleen de gebruiksfunctie \u2018Celfunctie\u2019 of \u2018Gezondheidsfunctie\u2019 hebben.", - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": "\u2022 Gegevens over de burgerlijke staat:\n\n- Naam \u2013 Geslachtsnaam, Voornamen;\n\n- Geboorte - Geboortedatum\n\n- Geslacht\n\n- Ouders \u2013 Geslachtsnaam, Voornamen, Geboortedatum;\n\n- Huwelijk dan wel geregistreerd partnerschap en eerdere huwelijken of eerdere geregistreerde partnerschappen - Aanduiding huwelijk of geregistreerd partnerschap; Datum huwelijkssluiting of datum aangaan geregistreerd partnerschap; Huwelijksontbinding of ontbinding geregistreerd partnerschap en reden daarvan, dan wel nietigverklaring huwelijk of geregistreerd partnerschap; Datum ontbinding, dan wel nietigverklaring huwelijk of geregistreerd partnerschap\n\n- Echtgenoot dan wel geregistreerd partner en eerdere echtgenoten of geregistreerde partners \u2013 Geslachtsnaam, Voornamen, Geboortedatum;\n\n- Kinderen \u2013 Geslachtsnaam, Voornamen, Geboortedatum\n\n- Overlijden \u2013 Overlijdensdatum\n\n- Data ingang en be\u00ebindiging rechtsgeldigheid gegevens - Datum ingang rechtsgeldigheid; Datum be\u00ebindiging rechtsgeldigheid\n\n\u2022 Gegevens over de bijhoudingsgemeente en het adres in die gemeente alsmede over het verblijf in Nederland en het vertrek uit Nederland\n\n- Bijhoudingsgemeente \u2013 Gemeente; Datum aanvang adreshouding in de gemeente\n\n- Adres - Functie van het adres; Gemeente; Woonplaats; Straatnaam en zo nodig deel van een gemeente; Huisnummer; Locatie ten opzichte van adres; Huisletter; Huisnummertoevoeging; Locatiebeschrijving en zo nodig deel van een gemeente; Postcode; Datum aanvang adreshouding; Datum ingang rechtsgeldigheid\n\n- Vertrek uit Nederland - Datum vertrek; Volgend land of gebied van verblijf;\n\n\u2022 Gegevens over het woonadres van de niet-ingezetene - Datum ingang rechtsgeldigheid; Datum be\u00ebindiging rechtsgeldigheid;\n\n\u2022 Gegevens over het burgerservicenummer van de ingeschrevene - Burgerservicenummer ingeschrevene; Datum van kracht worden van het burgerservicenummer; Datum be\u00ebindiging van het burgerservicenummer;\n\n\u2022 Gegevens over de burgerservicenummers van de ouders, de echtgenoot dan wel de geregistreerde partner, de eerdere echtgenoten of eerdere geregistreerde partners en de kinderen - Burgerservicenummer ouder; Burgerservicenummer echtgenoot dan wel geregistreerde partner; Burgerservicenummer eerdere echtgenoot; Burgerservicenummer eerdere geregistreerde partner; Burgerservicenummer kind; Data van kracht worden burgerservicenummers; Data be\u00ebindiging burgerservicenummers\n\n\u2022 Gegevens over het gebruik door de ingeschrevene van de geslachtsnaam van de echtgenoot, de geregistreerde partner, de eerdere echtgenoot of de eerdere geregistreerde partner \u2013 Naamgebruik; Datum ingang van het gegeven over het naamgebruik; Datum be\u00ebindiging van het gegeven over het naamgebruik\n\n\u2022 Gegevens over het tijdelijk verblijfsadres\n\n- Tijdelijk verblijfsadres \u2013 Gemeente; Woonplaats; Straatnaam en zo nodig deel van een gemeente; Huisnummer; Huisletter; Huisnummertoevoeging; Postcode; Datum ingang rechtsgeldigheid; Datum be\u00ebindiging rechtsgeldigheid\n\n\u2022 Gegevens in verband met de inschrijving en de wijziging van de bijhoudingsgemeente betreffende de ingezetene, gegevens in verband met de inschrijving betreffende de niet-ingezetene en gegevens betreffende de wijziging van de bijhoudings-verantwoordelijke betreffende de niet-ingezetene die ingezetene wordt - De hoedanigheid van de persoon die aangifte van verblijf en adres, van adreswijziging, of van vertrek heeft gedaan, dan wel de aantekening dat de gegevens ambtshalve zijn opgenomen; Datum inschrijving in de basisregistratie; Datum blokkering persoonslijst in verband met wijziging van de bijhoudingsverantwoordelijke; Gemeentecode van de gemeente waar de persoonskaart zich bevindt; Aantekening dat alle gegevens over kinderen, die aan de persoonskaart ontleend kunnen worden, op de persoonslijst zijn opgenomen\n\n\u2022 Gegevens ter aanduiding van akten en andere geschriften waaruit algemene gegevens zijn verkregen\n\n- Aanduiding van akten van de Nederlandse burgerlijke stand - Nummer van de akte waaraan een algemeen gegeven over de burgerlijke staat is ontleend; Gemeentecode van de gemeente waar de akte in de registers is opgenomen\n\n- Aanduiding van andere akten en geschriften - Omschrijving van het geschrift waaraan een algemeen gegeven is ontleend; Code van de bijhoudingsverantwoordelijke die het gegeven heeft ontleend; Datum van ontlening\n\n- Gegevens ter aanduiding van de onjuistheid van een opgenomen algemeen gegeven of van strijd met de Nederlandse openbare orde van een opgenomen gegeven over de burgerlijke staat - Aanduiding van het opgenomen algemeen gegeven dat onjuist is;\n\n- Gegevens over een onderzoek naar de onjuistheid van een opgenomen algemeen gegeven of de strijdigheid van een opgenomen gegeven over de burgerlijke staat - Aanduiding van de verzameling van gegevens, waarbinnen algem", - "methods_and_models": "Beslisboom algoritme", - "monitoring": "Het algoritme wordt maandelijks ge\u00ebvalueerd door het meten van trefkans na de adresonderzoeken die door gemeenten zijn uitgevoerd. Alle LAA-profielen worden regelmatig ge\u00ebvalueerd met het oog op de vraag of zij nog werken, aangepast moeten worden of hun effectiviteit hebben verloren en niet meer gebruikt moeten worden. Op die manier wordt geprobeerd de privacy impact op de Nederlandse burger zo klein mogelijk te houden. Een dergelijke evaluatie wordt minimaal drie keer per jaar gedaan in samenwerking met de samenwerkingspartners (gemeenten en afnemers). Tegen een besluit van de gemeente die leidt tot een aanpassing of wijziging van het adres of een uitschrijving, bezwaar kan worden gemaakt bij de gemeente. Een verzoek tot inzage kan worden gedaan in de bij de RvIG aanwezige persoonsgegevens.", - "human_intervention": "Op grond van de Wet BRP zijn nadere regels gesteld over de maatregelen om menselijke tussenkomst te waarborgen bij de ontwikkeling van profielen. Tijdens het ontwikkelen van het algoritme is advies gevraagd aan een representatieve vertegenwoordiging van de gemeenten en aangewezen bestuursorganen. Er worden om die reden geen persoonsgegevens verwerkt (geanalyseerd) voordat dit is besproken met de betrokken partijen. In de meeste gevallen wordt daarnaast ook de Autoriteit Persoonsgegevens (AP) om advies gevraagd.\n\nEr is geen sprake van automatische besluitvorming. Algoritmes zijn een middel en zijn niet leidend. De beoordeling en beslissingen worden uiteindelijk altijd door mensen gedaan. De gemeente doet, voordat zij een huisbezoek aflegt, altijd nog een eigen adresonderzoek.", - "risks": "De persoonlijke levenssfeer komt mogelijk in het gedrang, door het verwerken van persoonsgegevens en het afleggen van een huisbezoek door gemeenten.", - "performance_standard": "Trefkans is minimaal 50%", - "provider": null, - "process_index_url": null, - "tags": "Rijksdienst voor Identiteitsgegevens, RvIG, LAA, BRP", - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-05-16 12:53:08.784894+00:00", - "lars": "76222623", - "owner": "rijksdienst-voor-identiteitsgegevens" - }, - { - "name": "Permanente Monitor Dubbelinschrijvingen (PMD)", - "organization": "Rijksdienst Voor Identiteitsgegevens", - "department": "Directie Uitvoering, afdeling Onderzoek & Analyse", - "description_short": "In het inschrijvingsproces in de BRP kunnen fouten optreden. De Permanente Monitor Dubbelinschrijvingen is een set van profielen die wekelijks dubbelinschrijvingen zoekt in de BRP.", - "type": "Regelgebaseerd", - "category": "Basisregistratie", - "website": "https://www.rvig.nl/documenten/publicaties/2017/08/22/voorkom-dubbelinschrijvingen-in-de-brp ", - "status": "In gebruik", - "goal": "Het doel van de algoritmen is dubbelinschrijvingen te vinden zodat ze kunnen worden gecontroleerd en misschien gecorrigeerd. Met als doel de kwaliteit van de BRP te verbeteren.", - "impact": "De inschrijving van de burger in de BRP kan worden be\u00efnvloed. Eerst wordt door een deskundige gecontroleerd of het een dubbelinschrijving betreft. Vervolgens wordt, indien mogelijk, contact gezocht met betreffende persoon en in samenspraak wordt een van de persoonslijsten afgevoerd.", - "proportionality": "Doormiddel van een set aan overeenkomsten tussen persoonslijsten is het mogelijk de BRP te controleren op dubbelinschrijvingen. Hierbij worden op empirische wijze zwakheden in het inschrijvingsproces gecontroleerd waarbij tegelijk ongevoeligheid wordt ingebouwd voor inschrijvingen (bijv. tweelingen) die wel in veel opzichten lijken op dubbelinschrijvingen maar het niet zijn.", - "decision_making_process": null, - "documentation": null, - "competent_authority": null, - "lawful_basis": "De wettelijke grondslag voor een kwaliteitsinstrument als PMD zou moeten voortvloeien uit artikel 1.9 derde lid, artikel 1.11 tweede lid en artikel 4.3 derde lid van de Wet BRP.", - "iama": "Nee", - "iama_description": null, - "dpia": "Nee", - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.3.1", - "uuid": null, - "url": null, - "contact_email": "info@rvig.nl", - "area": "Nederland", - "lang": "nld", - "revision_date": null, - "description": "In het inschrijvingsproces kunnen fouten optreden. Een inschrijving kan op basis van onvolledige gegevens, foutieve interpretatie van gegevens of ontbrekende documenten resulteren in een extra inschrijving van die persoon of persoonsnummers kunnen al zijn gebruikt in een andere persoonslijst. In beide gevallen moet worden nagegaan welke van de inschrijvingen juist is of welk nummer bij de persoonslijst hoort. De Permanente Monitor Dubbelinschrijvingen is een set van profielen die wekelijks dubbelinschrijvingen zoekt in de BRP.", - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": "De BRP", - "methods_and_models": "\\\\datadfs.frd.shsdir.nl\\orgData\\BZK\\RVIG\\Stelsels\\Analyseteam\\PMD\\Rapportages\\Algoritmeregister\\PMD_zoekprofielen.pdf", - "monitoring": "Per profiel wordt bijgehouden hoeveel dubbelen er gevonden worden en hoeveel daarvan door een deskundige worden beoordeeld als dubbelopname. Als veel gevonden dubbelen als niet-dubbel worden beoordeeld, wordt het profiel uitgezet. Tegelijkertijd wordt gelet op dubbelinschrijvingen die niet door de PMD worden gevonden en zo nodig wordt daar een nieuw profiel voor ontwikkeld.", - "human_intervention": "De PMD-algoritmen worden gebruikt om op een reproduceerbare manier persoonslijsten met elkaar te vergelijken. Of er een dubbelopname is gevonden wordt bepaald door een beoordelaar van RvIG. Wanneer deze van oordeel is dat het een dubbelopname betreft worden de persoonslijsten voorgelegd aan de gemeente(n) waarin de personen is/zijn ingeschreven. De gemeente kan alsnog tot het oordeel komen dat het geen dubbelopname betreft en geen wijziging aanbrengen.", - "risks": "Het onterecht afvoeren van een BRP-inschrijving.", - "performance_standard": "Er wordt een globale prestatie norm gebruikt. Als een profiel relatief veel niet-dubbelen oplevert wordt het uit productie gehaald, over het geheel wordt rond de 90% van de gevonden dubbelen als daadwerkelijk dubbel beoordeeld.", - "provider": null, - "process_index_url": null, - "tags": "Rijksdienst voor Identiteitsgegevens, RvIG, BRP", - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-05-16 12:33:39.868925+00:00", - "lars": "76218516", - "owner": "rijksdienst-voor-identiteitsgegevens" - }, - { - "name": "Geautomatiseerde gezichtsvergelijking bij het RNI-inschrijfproces. ", - "organization": "Rijksdienst Voor Identiteitsgegevens", - "department": "Directie Informatievoorziening en Systemen, afdeling Identiteitssystemen", - "description_short": "Algoritme dat de inschrijver kan helpen om \u201clook-alike-fraude\u201d te voorkomen.", - "type": "Zelflerend", - "category": "Basisregistratie", - "website": null, - "status": "In gebruik", - "goal": "Het algoritme is ontwikkeld om het gezicht van de persoon die voor de balie staat te vergelijken met de afbeelding in zijn identiteitsdocument en om aan te kunnen geven met welke zekerheid gesteld kan worden dat de persoon weergegeven op de afbeelding van het gescande identiteitsdocument dezelfde persoon is (of niet).\nDit algoritme ondersteunt de RNI-medewerker aan de balie zodat deze met enige zekerheid kan vaststellen of de persoon aan de balie ook de persoon is van wie het identiteitsdocument gescand is.", - "impact": "Als de applicatie met gebruik van het algoritme aangeeft dat de persoon wiens identiteitsdocument gescand is niet de persoon is die aan de balie staat, dan zal de RNI-medewerker zelf moeten beslissen of dit terecht is of niet. De RNI-medewerker aan de balie is uiteindelijk de eindverantwoordelijke. Als hij de afwijzing door het algoritme terecht vindt, dan wordt de aanvraag tot inschrijving in de BRP door de burger afgewezen. Hierbij kan bij deze afwijzing aangegeven worden of er en vermoeden is van fraude.", - "proportionality": "De inzet van dit algoritme helpt de RNI-medewerker met het vaststellen van de identiteit van de burger aan de balie.", - "decision_making_process": null, - "documentation": null, - "competent_authority": null, - "lawful_basis": "Wettelijke verplichting tot deugdelijke identiteitsvaststelling:\nWet BRP art. 2.67 4de lid, Besluit BRP art.35\nToelaatbaarheid van biometrie:\nUAVG art. 29, in voorliggende situatie is authenticatie noodzakelijk ", - "iama": "Nee", - "iama_description": null, - "dpia": "Ja", - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.3.1", - "uuid": null, - "url": null, - "contact_email": "info@rvig.nl", - "area": "Nederland", - "lang": "nld", - "revision_date": null, - "description": "Bij de inschrijving van een burger in de RNI, wordt gebruik gemaakt van een scanoplossing.\nDeze scanoplossing bestaat uit een ID-scanner, een A4 scanner, een scanserver, een kleine monitor en sinds februari 2021 ook uit een gezichtsscanner.\nDeze scanoplossing ondersteunt de RNI-medewerker bij het inschrijfproces en sinds het gebruik van de gezichtsscanner ook bij het vaststellen van de identiteit. De gegevens van het gescande identiteitsdocument worden op de kleine monitor getoond en als er geen bijzonderheden zijn, dan gaan de gescande gegevens van de scanoplossing naar de RNI applicatie. De gegevens die gebruikt worden voor het vaststellen van de identiteit worden niet doorgegeven aan de RNI applicatie, maar het resultaat wordt op de kleine monitor weergegeven.\nDe gegevens uit het gescande identiteitsdocument worden na akkoord van de RNI-medewerker gebruikt bij de inschrijving in RNI. Van de uitgevoerde gezichtsscan wordt aan de RNI alleen in een logregel doorgegeven dat deze is uitgevoerd en wat het resultaat hiervan is geweest. Dit resultaat kan zijn: \u2018De gezichten zijn hetzelfde\u2019 of \u2018De gezichten zijn niet hetzelfde\u2019.", - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": "Rijksdienst voor Identiteitsgegevens, RvIG, RNI, BRP, Basisregistratie", - "methods_and_models": "Deep learning. Advanced face recognition APIs: C++, Java, Microsoft .NET, BioAPI 2.0 Verification Engine (C API). Gedocumenteerde voorbeelden voor de belangrijkste use cases en specifieke implementaties. Hulpmiddelen voor biometrische evaluaties, waaronder genereren van \u2018identification match\u2019 overzichten en \u2018similarity matrix\u2019 data. ", - "monitoring": "Niet bekend", - "human_intervention": "Uiteindelijk bepaalt de RNI-medewerker of hij de gezichtsscan wil gebruiken en wat hij met het resultaat van de gezichtsscan doet in het proces.", - "risks": "Een risico is een kans op het optreden van een negatief gevolg voor de rechten en vrijheden van de betrokkenen als gevolg van de verwerking van persoonsgegevens. Omdat in de beschreven situatie echter geen opslag nodig is (want gezichtsopname is alleen gedurende het proces van identiteitsvaststelling in het systeem geregistreerd en voor de medewerkers van het RNI-loket zichtbaar), is het risico op lekken of manipuleren van de gezichtsopname klein. ", - "performance_standard": "De NIST tests worden gebruikt ter evaluatie van de performance", - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-05-16 12:13:43.023352+00:00", - "lars": "18814864", - "owner": "rijksdienst-voor-identiteitsgegevens" - }, - { - "name": "Kadastrale kaart next", - "organization": "Kadaster", - "department": "programmateam Kadastrale kaart next", - "description_short": "Met artificial intelligence (kunstmatige intelligentie) bouwen we de kadastrale kaart opnieuw op. Hiervoor gebruiken we scans van originele historische veldwerken.", - "type": "Zelflerend", - "category": "wonen, werken en leefomgeving", - "website": "-", - "status": "in gebruik", - "goal": "De Kadastrale kaart next is een verbeterde kadastrale kaart. Op deze kaart zie je de grenzen zoveel mogelijk zoals ze ook in werkelijkheid zijn. We gebruiken hiervoor de oorspronkelijke meetgegevens, dus oude veldwerken. Ook maken we gebruik van algoritmen en kunstmatige intelligentie. Zo kunnen we het proces automatiseren. Op die manier besparen we kosten en zorgen we voor een nauwkeurigere Kadastrale kaart: de Kadastrale kaart next.", - "impact": "Met deze toepassing kunnen we een Kadastrale kaart next maken. Deze kaart wordt gebruikt door medewerkers van het Kadaster en aanbestedingspartners. Burgers kunnen tegen betaling een Kadastrale kaart opvragen bij het Kadaster. De Kadastrale kaart next komt dus beter overeen met de werkelijkheid.\n", - "proportionality": "-", - "decision_making_process": "-", - "documentation": "-", - "competent_authority": "Kadaster", - "lawful_basis": "In artikel 74 Kadasterwet staat dat het Kadaster mag onderzoeken of gegevens uit de basisregistratie kadaster juist en volledig zijn. In artikel 23 Kadasterbesluit < https://wetten.overheid.nl/BWBR0005259/2019-07-01/#Hoofdstuk3_Titeldeel4_Artikel23 > staat dat er een onderzoek van vernieuwing mag worden gedaan, als blijkt dat gegevens niet voldoende juist en volledig zijn. Er is dus nog geen wettelijke grondslag of basis voor de Kadastrale Kaart Next. Daarom willen we artikel 23 aanpassen. Zo kunnen we een stap verder gaan en de Kadastrale kaart vernieuwen.\n", - "iama": null, - "iama_description": null, - "dpia": "niet aanwezig", - "dpia_description": "We gebruiken veldwerken om het algoritme te \u2018trainen\u2019. Op deze veldwerken staan soms persoonsgegevens, maar die worden niet gebruikt. Deze gegevens worden niet omgezet naar een vectorbestand. Dit is een bepaald formaat, waarin we geometrische gegevens kunnen opslaan. Verder worden de gegevens uit de veldwerken opgeslagen in een database. De opgeslagen data bestaat alleen uit cijfers.\n", - "objection_procedure": "-", - "standard_version": "0.1.0", - "uuid": "volgt", - "url": "volgt", - "contact_email": "https://formulieren.kadaster.nl/contact_kadaster_algoritmeregister", - "area": "Nederland", - "lang": "Nederlands", - "revision_date": "2023-12-01 00:00:00", - "description": "Voor een n\u00f3g nauwkeurigere kaart\nHoe ligt een perceel ten opzichte van andere percelen? Dat is wat u ziet op de Kadastrale kaart. Die is gemaakt op basis van bijna 200 jaar meten. Maar er kunnen kleine onnauwkeurigheden ontstaan:\n1) De kaart is op schaal gemaakt. Daardoor kunnen de co\u00f6rdinaten iets verschuiven: op de kaart liggen ze dan iets anders dan in het terrein.\n2) Bovendien moesten de oorspronkelijk losse kaarten aan elkaar verbonden worden. Ook dat kan voor onnauwkeurigheden zorgen.\n\nAlle kadastrale grenzen opnieuw opbouwen\nBij de Kadastrale Kaart Next bouwen we alle kadastrale grenzen opnieuw op. Dat doen we op basis van historische veldwerken. Dit zijn situatieschetsen met gegevens die een landmeter maakte toen de grens werd vastgesteld.\n\nGeautomatiseerd verwerken met kunstmatige intelligentie\nVoor de verwerking van de veldwerken gebruiken we kunstmatige intelligentie. Bijvoorbeeld bij de interpretatie van de met de hand geschreven meetgegevens. Door dit te automatiseren kunnen we kosten \u00e9n tijd besparen.", - "application_url": "https://git.dev.cloud.kadaster.nl/rec/rec-vector", - "publiccode": null, - "mprd": "Er is een koppeling met de Basisregistratie Kadaster (BRK, IMKAD). De grenzen hebben een relatie met rijks-, provincie en gemeentegrenzen.", - "source_data": "Wij hebben een set veldwerken gebruikt, die kenmerkend is voor ons archief. Die set bestaat uit verschillende regio\u2019s en tijdsperiodes. Dan is er nog een set voor OCR: het omzetten van handgeschreven teksten naar informatie die de computer kan lezen. Deze set bestaat uit ongeveer 200.000 veldwerken. De end-to-end set voor lijn- en objectdetectie bestaat uit 3.000 veldwerken.", - "methods_and_models": "Het algoritme gebruikt aparte neurale netwerken voor de OCR, lijndetectie en objectdetectie:\n* voor de OCR gebruiken we een NN, dat bestaat uit CNN- en RNN-lagen\n* de lijndetectie gebeurt op basis van een aangepast UNET\n* de objectdetectie gebeurt met een MaskRCNN op basis van de SWIN transformer architectuur\n\nDeze modellen zijn getraind op basis van veldwerk (componenten) en annotaties. Annotaties zijn notities met een opmerking of uitleg. De beschikbare dataset splitsen we op in train, validatie en test-sets. De traindata augmenteren we tijdens het trainen om een veelzijdige trainset te maken. Tijdens het trainen bepalen we na elke iteratie de F-score op de validatie-set. Zodra de performance op de validatie-set niet meer verbetert, stoppen we met het trainen. Daarna bepalen we de F-score op de test-set. Is deze F-score beter dan vorige trainingen? Dan gebruiken we de gewichten van het neurale netwerk voor de voorspellingen.", - "monitoring": "De modellen worden gevalideerd op de testset en daarbij wordt een F-score berekend. Gedurende het proces worden deze scores bijgehouden met als doel om het algoritme steeds beter te maken (tussentijdse scores). Aan het einde wordt er gekeken naar de vereffening. Er is een ondergrens waar de vereffening aan moet voldoen (zelfde waarde als het handmatig proces) anders wordt het afgewezen.", - "human_intervention": "Human on the loop. Dit betekent dat AI wordt toegepast in een automatisch proces. Zijn er afwijkingen? Dan controleren mensen het resultaat en passen dit aan als dat nodig is.", - "risks": "minimaal risico", - "performance_standard": "De verwachte prestaties van de modellen verschillen per taak. Wij verwachten dezelfde performance te halen als op onze test-set. De test-set bevat een selectie veldwerken, die kenmerkend zijn voor ons archief. We evalueren de behaalde prestaties opnieuw als we een model trainen. Zo garanderen wij dat de performance voldoende is. Is het model niet correct? Dan passen we dit handmatig aan.", - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.474032+00:00", - "lars": "19331472", - "owner": "kadaster" - }, - { - "name": "Loki", - "organization": "Kadaster", - "department": "data science team, directie Beheer en Ontwikkeling Informatietechnologie (BOI)", - "description_short": "Hoe helpt een chatbot om informatie uit kadastrale databronnen toegankelijk te maken voor burgers? Dat onderzochten we met Loki.", - "type": "Deels op regels gebaseerd, deels zelflerend", - "category": "wonen, werken en leefomgeving", - "website": "https://labs.kadaster.nl/cases/loki", - "status": "pilot", - "goal": "Met Loki willen we laten zien wat de aangetoonde waarde is van een chatbot bij het opvragen van informatieMet Loki willen we laten zien wat de aangetoonde waarde is van een chatbot bij het opvragen van informatie uit onze data.\n", - "impact": "Bij het Kadaster beheren we verschillende (open) databronnen. Iedereen mag onze data gebruiken: van gemeentes en overheden tot notarissen en makelaars. Maar ook burgers, die geen uitBij het Kadaster beheren we verschillende (open) databronnen. Iedereen mag onze data gebruiken: van gemeentes en overheden tot notarissen en makelaars. Maar ook burgers, die geen uitgebreide kennis hebben van API\u2019s en Linked Data. Ook zij willen informatie uit onze data, zoals het bouwjaar van hun huis is of waar hun perceel ligt.\n\nAls Kadaster willen we dat iedereen deze vragen kan stellen: in spraak \u00e9n in natuurlijke taal. We willen geen antwoord geven in cijfers, maar in taal. Daarbij halen we onze informatie vaak niet uit 1 bron, maar uit meerdere bronnen. Dat geeft burgers een juist en volledig antwoord.", - "proportionality": "Virtuele assistenten, zoals Siri, Alexa en de Google Assistent worden steeds populairder. Daarin spreekt de gebruiker een vraag in of wordt de vraag niet ingetypt. Daarnaast ontwikkelen we de Kadaster Knowledge Graph. Hierdoor ontstaan allerlei nieuwe inzichten over hoe we in de tVirtuele assistenten, zoals Siri, Alexa en de Google Assistent worden steeds populairder. Daarin spreekt de gebruiker een vraag in of wordt de vraag niet ingetypt. Daarnaast ontwikkelen we de Kadaster Knowledge Graph. Hierdoor ontstaan allerlei nieuwe inzichten over hoe we in de toekomst data moeten presenteren. We willen onderzoeken hoe we de data het beste kunnen presenteren.\n", - "decision_making_process": "-", - "documentation": "https://labs.kadaster.nl/cases/loki", - "competent_authority": "Kadaster", - "lawful_basis": "In artikel 2a lid c Kadasterwet staat: \u201ceen doelmatige informatievoorziening van de overheid ten behoeve van de goede vervulling van publiekrechtelijke taken en de nakoming van wettelijke verplichtingen door bestuursorganen\u201d. \nKortom, wij willen onze informatie beschikbaar maken voor een zo groot mogelijk publiek. Dus ook aan burgers.", - "iama": null, - "iama_description": null, - "dpia": "-", - "dpia_description": "-", - "objection_procedure": "-", - "standard_version": "0.1.0", - "uuid": "volgt", - "url": "volgt", - "contact_email": "https://formulieren.kadaster.nl/contact_kadaster_algoritmeregister", - "area": "Nederland", - "lang": "Nederlands", - "revision_date": "2023-12-01 00:00:00", - "description": "Chatbot, die in natuurlijke taal antwoordt\nVirtuele assistenten als Siri, Alexa en Google Assistent worden steeds populairder. Als gebruiker spreek je je vraag in en je krijgt direct antwoord. Kunnen wij bij het Kadaster ook zo\u2019n chatbot ontwikkelen? Een chatbot die gebruikmaakt van onze databronnen en antwoord geeft op vragen als: wat is het bouwjaar van mijn huis? En waar ligt mijn perceel precies?\n\nInformatie uit meerdere bronnen\nBij het Kadaster beheren we meerdere databronnen, zoals de BAG, BRK en BRT. Als burgers iets vragen, dan komt het antwoord meestal niet uit 1 bron. Vaak zijn combinaties van meerdere bronnen nodig. Op die manier kun je juiste en volledige antwoorden geven aan gebruikers.\n\nLoki 3.0 is in ontwikkeling\nLoki is een chatbot, die natuurlijke taal gebruikt om vragen van burgers te beantwoorden. Loki gebruikt meerdere bronnen voor het beste antwoord. Op dit moment werken we aan een bruikbare versie voor burgers: Loki 3.0.", - "application_url": "https://labs.kadaster.nl/cases/loki", - "publiccode": null, - "mprd": "* BAG: Basisregistratie Adressen en GebouBAG: Basisregistratie Adressen en Gebouwen\n* BRK: Basisregistratie Kadaster (Kadastrale kaart)\n* BRT: Basisregistratie Topografie\n* WOZ: Waardering Onroerende Zaken", - "source_data": "Loki maakt gebruik van openbare gegevens in de BAG, BRK (Kadastrale kaart), BRT en WOZ", - "methods_and_models": "1) chatbot framework Rasa\n2) speech-to-text API van Microsoft Azure\n3) knowledge graph voor het verbinden data uit verschillende registraties en SPARQL-endpoints", - "monitoring": "Hoe kunnen we het gebruik van Loki monitoren? Daarvoor hebben wij een database gemaakt. Hiermee kunnen we de gesprekken tussen Loki en de gebruikers opslaan. Aan de hand van deze data zien wij welke taal burgers gebruiken. En we kunnen Loki leren om op deze manier te reageren. Zo zorgen we ervoor dat het taalgebruik van Loki aansluit op dat van de gebruikers: natuurlijke taal.\n\nDaarnaast kunnen we hiermee de klantbehoefte van Loki in kaart brengen. Welke vragen stellen gebruikers nu aan ons? En hoe stellen zij deze? Het development team ontwikkelde een dashboard. Hiermee krijgen ze inzichten in de antwoorden op deze vragen.", - "human_intervention": "-", - "risks": "minimaal risico", - "performance_standard": "-", - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.478386+00:00", - "lars": "48536774", - "owner": "kadaster" - }, - { - "name": "Transfer", - "organization": "Kadaster", - "department": "Landinrichting, directie Operatie, Dienstverlening en Registratie (ODR)", - "description_short": "Bij landinrichting komen de wensen en belangen van veel partijen samen, zoals boeren, natuurbeheerorganisaties en overheden. In Transfer voeren we al deze de wensen en belangen in. Op basis hiervan geeft Transfer de beste mogelijke oplossing om een gebied opnieuw in te richten.", - "type": "Op regels gebaseerd", - "category": "landbouw, natuur en voedsel", - "website": "-", - "status": "in gebruik", - "goal": "Transfer helpt om ingewikkelde vraagstukken op het gebied vTransfer helpt om ingewikkelde vraagstukken op het gebied van landinrichting op te lossen.\n", - "impact": "Transfer is een hulpmiddel wat wordt ingezet in een wettelijk traject. De gevolgen voor de belanghebbenden en de samenleving zijn geborgd in de wetgeving. ", - "proportionality": "Met Transfer kunnen we een ingewikkeld vraagstuk objectief behandelen.", - "decision_making_process": "De voorganger van Transfer is ontwikkeld in de jaren 70 van de vorige eeuw. Transfer is gebaseerd op onderzoeken van de TU Delft.", - "documentation": ",-", - "competent_authority": "Dit is de opdrachtgever van een landinrichtingsproject. Meestal is dit de provincie. Soms doet het Kadaster ook zelf onderzoek.", - "lawful_basis": "Dit is in de uitvoeringsfase Dit is in de uitvoeringsfase de Wilg. Lees meer op de pagina pagina Verkavelen met de Wilg .", - "iama": null, - "iama_description": null, - "dpia": "-", - "dpia_description": "-", - "objection_procedure": "Wetgeving beschermt de belangen van burgers.\n", - "standard_version": "0.1.0", - "uuid": "volgt", - "url": "volgt", - "contact_email": "https://formulieren.kadaster.nl/contact_kadaster_algoritmeregister", - "area": "Nederland", - "lang": "Nederlands", - "revision_date": "2023-12-01 00:00:00", - "description": "Objectief de beste oplossing bij landinrichting\nWe willen steeds vaker de natuur de ruimte geven. Maar tegelijkertijd spelen ook de belangen van bijvoorbeeld boeren en provincies mee. Het is niet gemakkelijk om land opnieuw in te richten. Bij landinrichting en ruilverkaveling hebben veel partijen allemaal wensen. Transfer is een algoritme dat helpt om op objectieve wijze op zoek te gaan naar de best mogelijke oplossing voor iedereen.\n\nTransfer doorloopt altijd 3 fases\n1) In de voorfase regelen we de modellen in.\n2) In de planfase onderzoeken we de belangen en voornemens van betrokken partijen, zoals boeren, natuurbeheerorganisaties en overheden. We onderzoeken ook hoe we al deze belangen en voornemens met elkaar in evenwicht kunnen brengen.\n3) In de uitvoeringsfase voeren we de wensen van betrokkenen in. Transfer gebruikt hiervoor een bepaald abstractieniveau. Dat wil zeggen dat we niet met percelen rekenen, maar met grotere eenheden, zogenaamde blokdelen. Bedrijfsdelen voegen we samen tot logische eenheden.\n\nHet resultaat?\nOp basis van de wensen van alle betrokken partijen en het wettelijke kader berekent Transfer de best mogelijke nieuwe situatie. Doordat het een algoritme is, is het zo objectief mogelijk. Hiermee helpt Transfer om ingewikkelde vraagstukken op het gebied van landinrichting op te lossen.", - "application_url": "-", - "publiccode": "-", - "mprd": "Er is geen directe koppeling met basisregistraties. Wel wordt data afgeleid uit de BRK, de Basisregistratie Kadaster.", - "source_data": "De data komt van rechthebbenden (volgens de Kadastrale registratie, maar ook bijvoorbeeld pachters). Verder gebruiken we: kaarten en de wensen en beleidsvoornemens van betrokkenen.\n", - "methods_and_models": "De modellen zijn ontwikkeld op basis van onderzoeken van de TU Delft. Het is een optimaliseringsalgoritme. Dit betekent dat de beste optie wordt gekozen uit alle mogelijke oplossingen. Daarbij is sprake van een beperkte set van mogelijkheden. Transfer maakt dus geen nieuwe opties aan, maar zoekt de beste uit bestaande opties.\n", - "monitoring": "-", - "human_intervention": "Human in the loop. Transfer is een hulpmiddel om tot de uiteindelijke oplossing te komen. ", - "risks": "minimaal risico", - "performance_standard": "-", - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.482769+00:00", - "lars": "25625149", - "owner": "kadaster" - }, - { - "name": "Akte AI", - "organization": "Kadaster", - "department": "team Akte AI, directie Beheer en Ontwikkeling Informatietechnologie (BOI)", - "description_short": "Akte AI zorgt ervoor dat data uit notari\u00eble akten automatisch wordt overgenomen. De medewerker die de akte verwerkt hoeft de gegevens alleen nog maar te controleren en eventueel aan te passen.", - "type": "Deels op regels gebaseerd, deels zelflerend", - "category": "wonen, werken en leefomgeving", - "website": "-", - "status": "in gebruik", - "goal": "Met Akte AI willen we akten zo snel mMet Akte AI willen we akten zo snel mogelijk en zo juist mogelijk kunnen verwerken. Het helpt ons om effici\u00ebnt te werken en de kwaliteit van de akteverwerking te verbeteren.", - "impact": "Akte AI heeft geen directe impact op burgers. Het gaat om het verbeteren van ons interne procAkte AI heeft geen directe impact op burgers. Het gaat om het verbeteren van ons interne proces. Wel worden akten sneller verwerkt en maken we hierbij minder fouten.", - "proportionality": "Akte AI heeft geen negatieve gevolgen voor de maatschappij. Het proces is zo ingericht dat de rechtszekerheid niet minder wordt en waarschijnlijk zelfs beter wordt.\n", - "decision_making_process": "-", - "documentation": "-", - "competent_authority": "Kadaster", - "lawful_basis": "Volgens artikel 3 lid 1a Kadasterwet < https://wetten.overheid.nl/BWBR0004541/2021-07-01/#Hoofdstuk1_Artikel3> is het onze wettelijke taak om de Basisregistratie Kadaster te beheren en bij te werken. Daar helpt Akte AI bij. ", - "iama": null, - "iama_description": null, - "dpia": "Er is geen eigen DPIA. Wel is Akte AI onderdeel van de DPIA voor akteverwerking.", - "dpia_description": "Er zijn geen aanvullende aandachtspunten voor Akte AI.", - "objection_procedure": "Zijn de gegevens uit de akten gecontroleerd en verwerkt in de Basisregistratie Kadaster? Dan krijgt de betrokkene een kennisgeZijn de gegevens uit de akten gecontroleerd en verwerkt in de Basisregistratie Kadaster? Dan krijgt de betrokkene een kennisgeving. Als gegevens niet juist zijn, dan is er een terugmeldprocedure. Kijk voor meer informatie op de pagina Fout in registratie melden (terugmelding doen) .", - "standard_version": "0.1.0", - "uuid": "volgt", - "url": "volgt", - "contact_email": "https://formulieren.kadaster.nl/contact_kadaster_algoritmeregister", - "area": "Nederland", - "lang": "Nederlands", - "revision_date": "2023-12-01 00:00:00", - "description": "Helpt akten geautomatiseerd verwerken\nHet Kadaster houdt de Basisregistratie Kadaster bij. Dat doen we op basis van informatie in notari\u00eble leverings- of hypotheekakten. Akte AI helpt ons daarbij door informatie geautomatiseerd op te halen uit de akten.\n\nWelke informatie haalt Akte AI op uit de akten?\n* wie de koper is\n* wie de verkoper is\n* om welke onroerende zaak het gaat, zoals een huis of perceel\n* om welke rechtsfeiten het gaat, zoals de vestiging van een hypotheek in een akte\n\nEen medewerker controleert de gegevens\nAlle gegevens worden verzameld door dit algoritme. Dat helpt de medewerker die de akte verwerkt. De medewerker controleert de data en bepaalt of de informatie wordt overgenomen (of niet). Na het verwerken zijn de gegevens opgenomen in de Basisregistratie Kadaster.", - "application_url": null, - "publiccode": null, - "mprd": "Akte AI maakt geen gebruik van koppelingen met basisregistraties.\n", - "source_data": "Voor het herkennen van persoonsgegevens gebruiken we \"bert-base-dutch-cased-finetuned-sonar-ner\". Dit is een open source taalmodel van de Rijksuniversiteit Groningen.\n\nVoor het herkennen van de andere data gebruiken we modellen die we zelf hebben getraind. En algoritmen die we zelf hebben ontwikkeld.Voor het herkennen van persoonsgegevens gebruiken we \"bert-base-dutch-cased-finetuned-sonar-ner\". Dit is een open source taalmodel van de Rijksuniversiteit Groningen.\nVoor het herkennen van de andere data gebruiken we modellen die we zelf hebben getraind. En algoritmen die we zelf hebben ontwikkeld.\n\nOver de trainingssets\nDe trainingssets bestaan uit akteteksten. Die zijn op dit moment nog statisch en vari\u00ebren in grootte: van enkele honderden tot enkele tienduizenden teksten per set.\nVerder werken we aan een feedback-loop. Hiermee is het geen statische set meer: iedere maand wordt dan 8,33% ververst. Er verdwijnen dan teksten en hier komen nieuwe akteteksten voor terug.", - "methods_and_models": "* Named Entity Recognition van persoonsnamen met Hugging Face Transformers\n* Named Entity Recognition van organisatienaam, adres en rechtsvorm met het spaCy framework\n* Dependency Parsing van personen, organisaties, onroerende zaken, notarissen, rechtsfeiten en ondertekening met het spaCy framework\n* Named Entity Recognition van de omschrijving van de onroerende zaak met het spaCy framework\n* Named Entity Recognition voor het splitsen van persoonsnamen in voornaam, tussenvoegsel en achternaam met het spaCy framework\n* Named Entity Recognition voor het splitsen van een adres in straat, huisnummer, huisletter, en toevoeging met het spaCy framework\n* Classificatie van type akte met het spaCy framework\n* De zelf ontwikkelde algoritmen maken onder andere gebruik van:\n * reguliere expressies\n * spaCy pattern matchersNamed Entity Recognition van persoonsnamen met Hugging Face Transformers\n", - "monitoring": "Wij werken met een 5% controle. Dit betekent dat een onafhankelijk team 5% van alle verwerkte akten controleert.", - "human_intervention": "Human in the loop. De Akte AI doet een suggestie aan de medewerker die de data verwerkt. Er is dus altijd een medewerker, die de suggestie beoordeelt.", - "risks": "minimaal risico", - "performance_standard": "We willen graag dat de akte zo snel mogelijk verwerkt wordt. Daar sturen wij op.", - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.487076+00:00", - "lars": "58455861", - "owner": "kadaster" - }, - { - "name": "Rechtsfeiten KIK 2e deel", - "organization": "Kadaster", - "department": null, - "description_short": "Dit algoritme herkent inschrijfbare rechtsfeiten in het 2e deel van KIK-akten.", - "type": "Nee", - "category": "{Werk,Huisvesting,\"Ruimte en infrastructuur\"}", - "website": "-", - "status": "In gebruik", - "goal": "Met dit algoritme willen we akten zo snel mogelijk en zo juist mogelijk kunnen verwerken. Het helpt ons om effici\u00ebnt te werken en de kwaliteit van de akteverwerking te verbeteren.", - "impact": null, - "proportionality": "Rechtsfeiten KIK 2e deel heeft geen negatieve gevolgen voor de maatschappij. Het proces is zo ingericht dat de rechtszekerheid niet minder wordt en waarschijnlijk zelfs beter wordt.", - "decision_making_process": null, - "documentation": null, - "competent_authority": null, - "lawful_basis": "Volgens artikel 3 lid 1a Kadasterwet (https://wetten.overheid.nl/BWBR0004541/#Hoofdstuk1_Artikel3) is het onze wettelijke taak om de Basisregistratie Kadaster te beheren en bij te werken. Daar helpt dit algoritme bij.", - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.4.0", - "uuid": "volgt", - "url": "volgt", - "contact_email": "https://formulieren.kadaster.nl/contact_kadaster_algoritmeregister", - "area": null, - "lang": "Nld", - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": "-", - "mprd": null, - "source_data": "We toetsen de regelset op een testset van 83.414 akten. Deze trainingsset is statisch en wordt niet ververst. Dit betekent dat er dus geen nieuwe teksten bijkomen.", - "methods_and_models": "Wij maken gebruik van een set regels (reguliere expressies). Die helpen om inschrijfbare feiten te herkennen. De bewaarder heeft deze gecontroleerd en akkoord gegeven.", - "monitoring": null, - "human_intervention": "Human on the loop. Dit algoritme wordt gebruikt in een geautomatiseerd proces. Er is geen directe, handmatige controle. Wij controleren door middel van een steekproef van 2%.", - "risks": "minimaal risico", - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-06-15 11:05:55.649143+00:00", - "lars": "48553344", - "owner": "kadaster" - }, - { - "name": "TVL Risicomodel", - "organization": "Ministerie van Economische Zaken en Klimaat, Rijksdienst voor Ondernemend Nederland", - "department": "Kernprocessen NL (KPNL) \\ Project- en Organisatiefinanciering (PROF)", - "description_short": "Het algoritme wordt gebruikt om voor alle aanvragen Tegemoetkoming Vaste Lasten geautomatiseerd een risicoinschatting te maken, voorafgaand aan een geautomatiseerde of handmatige verlening en uitbetaling van het voorschot. ", - "type": "Regelgebaseerd", - "category": "Corona steunmaatregel", - "website": null, - "status": "In gebruik sinds 18-12-2020", - "goal": "Met de inzet van het algoritme wordt het nemen van een besluit versneld, zodat zo veel mogelijk ondernemers op tijd liquiditeitssteun kunnen krijgen. Het algoritme versnelt de besluitvorming voor de toekenning van een tegemoetkoming en het geeft een risico duiding voor de handmatige stroom. ", - "impact": "De inzet van het algoritme bij TVL-aanvragen zorgt ervoor dat de aanvragen van ondernemers snel en doelmatig afgehandeld kunnen worden. Het grootste deel van de ondernemers heeft het geld snel op de rekening staan.\nHet algoritme zorgt ervoor dat laag-risico aanvragen meteen geautomatiseerd verleend of vastgesteld kunen worden.\nWanneer een aanvraag uitvalt naar handmatige controle, moet een medewerker de aanvraag beoordelen. In dat geval duurt het langer voordat er een beslissing wordt genomen over de tegemoetkoming, met als gevolg dat het geld later op de rekening van de ondernemer staat. ", - "proportionality": "In de TVL wordt het risicomodel (het algoritme) gebruikt om alle aanvragen geautomatiseerd te toetsen aan de criteria van de regeling en een risicoclassificatie op oneigenlijk gebruik te maken. Voorafgaand aan de uitbetaling van het voorschot en voor de definitieve vaststelling van de subsidie. Daarmee wordt de besluitvormingsketen versneld, zodat ondernemers zo snel mogelijk liquiditeitssteun kunnen krijgen. \nDe inzet van het risicomodel stelt RVO in staat om over grote hoeveelheid subsidieaanvragen in een zeer korte tijd positief te beslissen, zodat ondernemers die tijdens de corona lockdowns snel vaste lasten steun nodig hebben, dit ook kunnen krijgen. Verder stelt het risicomodel RVO in staat dat slechts positieve besluiten zonder tussenkomst van een medewerker worden behandeld, zodat de medewerkers de overige besluiten sneller kunnen beoordelen. Een vergelijkbaar resultaat zonder de inzet van het risicomodel is bij de voorbereiding van de regeling beoordeeld als niet uitvoerbaar: dit zou een opschaling van grote omvang van gespecialiseerd personeel vergen, die niet op korte termijn is te organiseren. Zelfs als dat wel gelukt was zouden de doorlooptijden voor ondernemers veel langer geweest zijn zonder risicomodel. ", - "decision_making_process": "Uitvoering TVL", - "documentation": "https://www.rvo.nl/subsidies-financiering/tvl", - "competent_authority": null, - "lawful_basis": "Wettelijke grondslag TVL regeling: https://wetten.overheid.nl/BWBR0044808/2022-10-19. De Tweede Kamer is over de grotendeels geautomatiseerde uitvoering geinformeerd middels de volgende voortgangsrapportage, zie: https://www.rijksoverheid.nl/documenten/kamerstukken/2021/03/22/voortgangsrapportage-tvl", - "iama": "Nee", - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": "\nIn elk TVL besluit staat een bezwaarclausule met uitleg over hoe een ondernemer tegen het besluit van de gemandateerde in bezwaar kan gaan, zie https://www.rvo.nl/subsidies-financiering/bezwaar-maken voor de bezwaarprocedure.", - "standard_version": "0.1.0", - "uuid": "RVO-TVLRisicomodel", - "url": null, - "contact_email": "Voor contact over deze registratie neem contact op met RVO via het contactformulier; https://www.rvo.nl/onderwerpen/over-ons/contact/formulier onder vermelding van Bedrijf/instelling, Covid-19: TVL/TOGS/ATE, of Overheidsorganisatie, Covid-19 regelingen.", - "area": "Nederland", - "lang": "Nederlands", - "revision_date": "2024-04-01 00:00:00", - "description": "RVO zet een algoritme in als ondersteuning bij de beoordeling van aanvragen van ondernemers. Dit algoritme toetst of een aanvraag voldoet aan de voorwaarden die door de minister zijn gesteld. Dit wordt gedaan met behulp van een risicomodel:\nals een aanvraag binnenkomt bij de RVO, wordt een inschatting gemaakt of de ondernemer daadwerkelijk recht heeft op de tegemoetkoming. Hierbij vergelijkt RVO bijvoorbeeld de opgegeven informatie van de aanvrager met andere bij de overheid bekende gegevens, zoals aangiftes bij de Belastingdienst. Een aanvraag wordt automatisch goedgekeurd wanneer de aanvraag door het algoritme als laag risico is aangemerkt, bijvoorbeeld omdat het bedrag waarop de aanvrager aanspraak maakt laag is en er geen aanwijzingen voor misbruik of oneigenlijk gebruik zijn. In dat geval komt er geen medewerker meer aan te pas. De ondernemer heeft het geld dan binnen een week op zijn rekening staan. Als een aanvraag door het algoritme als hoog risico is aangemerkt, bijvoorbeeld omdat het een hoog bedrag betreft of omdat er twijfel is over de opgegeven omzet, volgt een handmatige controle met als gevolg een extra verwerkingstijd van gemiddeld twee tot drie weken - gemaximaliseerd tot de Awb beslistermijnen. In cijfers uitgedrukt is 49% binnen 1 week na ontvangst beslist, 71% binnen 3 weken en 96% binnen 8 weken.\nWanneer bij een eerdere aanvraag misbruik of oneigenlijk gebruik is geconstateerd, zullen toekomstige aanvragen altijd handmatig gecontroleerd worden. Ook wanneer een aanvraag complex is waardoor deze niet automatisch beoordeeld kan worden, volgt een handmatige controle. De aanvraag wordt dan beoordeeld door een medewerker.\nDe medewerker kan de ondernemer vragen om aanvullende informatie. De medewerker besluit vervolgens of de aanvraag wordt toegekend of wordt afgewezen. Bij afwijking van het klantverzoek en bij subsidiebedragen boven een bepaalde grens gebeurt dit altijd via het 4-ogen principe.", - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": null, - "human_intervention": "Bij elke nieuwe TVL ronde (aanvraagfase zowel als vaststellingsfase) wordt het risicomodel aangepast en opnieuw ter goedkeuring voorgelegd aan een interdepartementaal samengestelde adviescommissie (rolling review) die de algemeen directeur RVO adviseert inzake de toepassing van het risicomodel.\nZodra het in gebruik genomen is bepaald het risicomodel van elke aanvraag het kwalitatieve en kwantitatieve risico; die factoren samen vormen de algemene risicocategorie. Categorie 1 wordt automatisch toegekend, van Categorie 2 valt 10% uit naar handmatig en wordt de rest automatisch toegekend. In het geval dat het algoritme een aanvraag als hoog risico aanmerkt, Categorie 3, valt deze uit naar een handmatige controle door een medewerker. Bijvoorbeeld omdat het een hoog bedrag betreft, de aanvraag incompleet is, of omdat er aanwijzingen zijn voor misbruik of oneigenlijk gebruik. De aanvraag wordt dan klaargezet voor een menselijke beoordeling.\nHet algoritme geeft een advies mee aan de medewerker waar deze op moet letten, zoals gegevens die incompleet of tegenstrijdig zijn. Dit kan nuttig zijn: het advies helpt de medewerker om zich snel een beeld te vormen van de situatie. De medewerker bekijkt vervolgens de gehele aanvraag. De medewerker kan aanvragen vervolgens goedkeuren of afwijzen, eventueel na een nadere uitvraag om informatie. Een negatief besluit (geen of lagere subsidie) volgt daardoor niet uit het risicomodel maar altijd uit de beoordeling door een medewerker. Bij afwijking van het klantverzoek en bij subsidiebedragen boven een bepaalde grens gebeurt dit altijd via het 4-ogen principe.", - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.496023+00:00", - "lars": "62129549", - "owner": "ministerie-ezk" - }, - { - "name": "Risicoscan Verblijf Buitenland", - "organization": "Uitvoeringsinstituut Werknemersverzekeringen (UWV)", - "department": "Handhaven", - "description_short": "De risicoscan Verblijf Buiten Nederland stuurt een bericht aan medewerkers van UWV over mensen met een WW-uitkering die waarschijnlijk (tijdelijk) in het buitenland verblijven. En zich mogelijk niet aan de regels houden. Onze medewerkers doen onderzoek en nemen een besluit over de vervolgstappen. Als we vaststellen dat iemand met een WW-uitkering onrechtmatig in het buitenland verblijft, kan dit gevolgen hebben voor de uitkering.", - "type": "Voorspellend", - "category": "Uitkering, buitenland, buiten Nederland, risicoscan, WW", - "website": "https://www.uwv.nl/nl/over-uwv/organisatie/algoritmeregister-uwv/risicoscan-verblijf-buiten-nederland", - "status": "In gebruik", - "goal": "De risicoscan Verblijf Buiten Nederland is een algoritme dat ons helpt om in 1 keer gericht binnen een grote groep onderzoek te doen. Zo hoeven we niet iedereen met een WW-uitkering apart te bekijken.", - "impact": "De risicoscan Verblijf Buiten Nederland stuurt een bericht aan medewerkers van UWV over mensen met een WW-uitkering die waarschijnlijk (tijdelijk) in het buitenland verblijven. Als uit verder onderzoek blijkt dat u zich niet aan de regels houdt, kan dit gevolgen hebben voor de uitkering. ", - "proportionality": null, - "decision_making_process": null, - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": "Er is een DPIA uitgevoerd", - "dpia_description": null, - "objection_procedure": "Burgers kunnen bezwaar maken tegen een beslissing van het UWV. Dat kan via de volgende link: https://www.uwv.nl/particulieren/klantenservice/klachten-bezwaar-beroep/bezwaar/index.aspx", - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": null, - "lang": null, - "revision_date": null, - "description": "Voor mensen met een WW-uitkering gelden er bepaalde regels. Zo krijgt u geen uitkering meer als u in het buitenland bent om een andere reden dan vakantie. De risicoscan Verblijf Buiten Nederland is een algoritme dat ons helpt om in 1 keer gericht binnen een grote groep onderzoek te doen. Zo hoeven we niet iedereen met een WW-uitkering apart te bekijken.\n\nDe risicoscan Verblijf Buiten Nederland stuurt een bericht aan medewerkers van UWV over mensen met een WW-uitkering die waarschijnlijk (tijdelijk) in het buitenland verblijven. En zich mogelijk niet aan de regels houden. Onze medewerkers doen onderzoek en nemen een besluit over de vervolgstappen. Als we vaststellen dat iemand met een WW-uitkering onrechtmatig in het buitenland verblijft, kan dit gevolgen hebben voor de uitkering.\nDe risicoscan gebruikt gegevens die nodig zijn om te onderzoeken of iemand met een WW-uitkering in het buitenland is en zich niet aan de regels houdt. De gegevens gaan alleen over het gedrag van deze persoon. We noemen ze daarom gedragskenmerken. Bijvoorbeeld het aantal keren dat iemand met een WW-uitkering met ons belt in een bepaalde periode. Of het kanaal waarmee de WW-uitkering is aangevraagd (bijvoorbeeld digitaal of via een formulier).\n\nDe risicoscan geeft de verschillende gedragskenmerken een score. Op basis van deze score volgt een bericht aan de medewerker. Die bepaalt of verder onderzoek nodig is.\n\nWe kunnen niet vermelden welke gedragskenmerken dit algoritme precies gebruikt. Zo voorkomen we dat mensen die misbruik maken van een WW-uitkering hun gedrag gaan veranderen.", - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": "Medewerkers van UWV houden op de volgende manieren toezicht op het gebruik van het algoritme:\n.\n- Iedere twee weken controleren gespecialiseerde UWV-medewerkers de kwaliteit van de gegevens die de risicoscan gebruikt. Zo testen zij het algoritme.\n- We verwijderen gedragskenmerken die geen toegevoegde waarde hebben voor het algoritme.\n- Zodra we zien dat de risicoscan onvoldoende resultaat geeft, stoppen we het algoritme direct en starten we een onderzoek. Vinden we iets dat niet klopt? Dan passen we de risicoscan aan.", - "human_intervention": "De medewerker beslist over de situatie van iemand met een WW-uitkering en eventuele vervolgstappen. De risicoscan neemt dus zelf geen besluiten.\n\nZodra we zien dat de risicoscan onvoldoende resultaat geeft, stoppen we het algoritme direct en starten we een onderzoek. Vinden we iets dat niet klopt? Dan passen we de risicoscan aan.", - "risks": "We zorgen ervoor dat we blijven voldoen aan de eisen van informatiebeveiliging en privacy. Dat doen we op de volgende manier:\n- We controleren de kwaliteit van de gegevens steeds opnieuw. \n- We zorgen er altijd voor dat medewerkers de uiteindelijke beoordeling doen en niet het algoritme.\n- We laten andere organisaties controleren of wat we doen binnen de normen past.\n- Adviesbureau KPMG voert kwaliteitscontroles uit om te toetsen of het algoritme zorgvuldig en volledig is.", - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.500748+00:00", - "lars": "89741375", - "owner": "uitvoeringsinstituut-werknemersverzekeringen" - }, - { - "name": "Klantapplicatie WW", - "organization": "Uitvoeringsinstituut Werknemersverzekeringen (UWV)", - "department": "Uitkeren", - "description_short": "Met de Klantapplicatie WW kunnen mensen die werkloos zijn of binnenkort hun baan verliezen gemakkelijk en snel een WW-uitkering aanvragen via Mijn UWV.", - "type": "Regelgebaseerd", - "category": "WW, uitkering", - "website": "https://www.uwv.nl/overuwv/algoritmes-bij-uwv/klantapplicatie-ww.aspx", - "status": "In gebruik", - "goal": "De Klantapplicatie WW zorgt ervoor dat u uw online aanvraag gemakkelijk en snel kunt doen. Onze medewerkers kunnen deze aanvragen vervolgens sneller beoordelen.", - "impact": "De Klantapplicatie WW toont de gegevens die UWV al heeft en die van belang zijn voor uw aanvraag. U kunt kijken of de gegevens kloppen en hoeft dan alleen nog maar de ontbrekende gegevens in te vullen. Daarna bepaalt UWV of u recht heeft op een WW-uitkering.", - "proportionality": "Om de aanvraag WW conform de wettelijke voorschriften te kunnen beoordelen, zijn alle gegevens nodig die Uitkeren WW op het digitale - en papieren aanvraagformulier uitvraagt. Gezien het grote aantal aanvragen WW en de duidelijke wettelijke regels over wanneer recht op WW-uitkering bestaat, is het proportioneel om geautomatiseerde besluitvorming toe te passen. ", - "decision_making_process": null, - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": "Burgers kunnen bezwaar maken tegen een beslissing van het UWV. Dat kan via de volgende link: https://www.uwv.nl/particulieren/klantenservice/klachten-bezwaar-beroep/bezwaar/index.aspx", - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": "algoritmeregister@uwv.nl", - "area": null, - "lang": null, - "revision_date": null, - "description": "Als u werkloos bent of binnenkort uw baan verliest, krijgt u misschien een WW-uitkering via UWV. U vraagt deze uitkering aan via Mijn UWV. De Klantapplicatie WW zorgt ervoor dat u uw online aanvraag gemakkelijk en snel kunt doen. Onze medewerkers kunnen deze aanvragen vervolgens sneller beoordelen.\n\nDe Klantapplicatie WW toont de gegevens die UWV al heeft en die van belang zijn voor uw aanvraag. U kunt kijken of de gegevens kloppen en hoeft dan alleen nog maar de ontbrekende gegevens in te vullen. De Klantapplicatie WW gebruikt gegevens als leeftijd, inkomen, arbeidsverleden en uitkeringsgegevens vanuit verschillende overheidssystemen. Wij krijgen bijvoorbeeld informatie over uw inkomen en arbeidsverleden van de Belastingdienst. Gegevens over uw leeftijd en adres komen van de gemeente waar u woont. Daarna bepaalt UWV of u recht heeft op een WW-uitkering.De afhandeling van uw aanvraag gaat voor een deel geautomatiseerd. Met de Klantapplicatie WW stelt UWV de volgende zaken vast:\n\n- Of u recht heeft op een uitkering.\n- Hoe hoog uw uitkering ongeveer is.\n- Hoelang u een uitkering krijgt. ", - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": "Wij toetsen de processen waarmee we het algoritme ontwikkelen, beheren en gebruiken steeds opnieuw. Zo zorgen wij ervoor dat de beoordeling van aanvragen voor een WW-uitkering goed blijft verlopen.\n\nOntstaat er toch een risico op een foute beoordeling? Dan kan UWV de Klantapplicatie WW, of bronsystemen die erop zijn aangesloten, uitzetten en een onderzoek starten.", - "human_intervention": "Medewerkers van UWV houden op de volgende manieren toezicht op het gebruik van het algoritme:\n\nBij de ontwikkeling en het beheer van de Klantapplicatie WW zijn verschillende partijen betrokken. Denk aan analisten, juristen, uitvoerende medewerkers en klantpanels. Zij controleren maandelijks of het algoritme nog goed werkt.\n\nUWV handelt een aanvraag voor een WW-uitkering geautomatiseerd of handmatig af. Dat laatste gebeurt in lastige situaties waarbij het nodig is dat een medewerker meekijkt. Medewerkers bekijken daarnaast regelmatig aanvragen. Bijvoorbeeld om te controleren of mensen recht hebben op een WW-uitkering.\n\nTijdens uw online WW-aanvraag kunt u via de telefoon vragen stellen over de werking van de Klantapplicatie WW.\nOnze medewerkers houden in de gaten of wetten en regels veranderen. Als dat gebeurt passen we het algoritme aan. Zo blijft het algoritme voldoen aan de geldende wetten en regels.", - "risks": "Wij toetsen de processen waarmee we het algoritme ontwikkelen, beheren en gebruiken steeds opnieuw. Zo zorgen wij ervoor dat de beoordeling van aanvragen voor een WW-uitkering goed blijft verlopen. \n\nOntstaat er toch een risico op een foute beoordeling? Dan kan UWV de Klantapplicatie WW, of bronsystemen die erop zijn aangesloten, uitzetten en een onderzoek starten.", - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.505784+00:00", - "lars": "51845995", - "owner": "uitvoeringsinstituut-werknemersverzekeringen" - }, - { - "name": "Claim beoordelings- en borgingsysteem (CBBS)", - "organization": "Uitvoeringsinstituut Werknemersverzekeringen (UWV)", - "department": null, - "description_short": "Dit model zoekt mogelijke banen voor burgers.", - "type": "Op regels gebaseerd", - "category": null, - "website": "https://www.uwv.nl/overuwv/algoritmes-bij-uwv/claim-beoordelings-en-borgingssysteem-cbbs.aspx", - "status": "In gebruik", - "goal": null, - "impact": null, - "proportionality": null, - "decision_making_process": null, - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": "algoritmeregister@uwv.nl", - "area": "Nederland", - "lang": "Nederlands", - "revision_date": null, - "description": "U bent (gedeeltelijk) arbeidsongeschikt als u door ziekte of een handicap minder of helemaal niet kunt werken. UWV beoordeelt of en hoeveel u nog kunt werken. Dat vertalen wij in een arbeidsongeschiktheidspercentage. De hoogte van dit percentage bepaalt of u (nog) recht heeft op een uitkering voor arbeidsongeschiktheid.\n\nBij het vaststellen van het arbeidsongeschiktheidspercentage gebruiken we het Claim Beoordelings- en Borgingssysteem (CBBS). Hierin staan beschrijvingen van duizenden functies die in Nederland voorkomen. Een arbeidsdeskundige van UWV beoordeelt met behulp van het CBBS welke banen geschikt zijn voor u. Door de ondersteuning van het CBBS hoeft onze arbeidsdeskundige deze functies niet allemaal handmatig te onderzoeken. Zo kunnen wij u sneller helpen.", - "application_url": null, - "publiccode": null, - "mprd": "Ja", - "source_data": "In het CBBS zit een bestand met beschrijvingen van duizenden functies. Deze functies geven een goed beeld van de Nederlandse arbeidsmarkt. Elke functieomschrijving geeft uitgebreide informatie over onder andere de werkomgeving, de taken in de functie, het aantal werkuren, de vereiste opleidingen en werkervaring en hoe zwaar het werk is (werkbelasting).\n\nDaarnaast haalt het CBBS gegevens uit de volgende bronnen:\n\nUWV-polisadministratie\nHierin staan alle gegevens over lonen, uitkeringen en arbeidsverhoudingen van alle werknemers en mensen met een uitkering in Nederland. Dit systeem levert naam, geboortedatum en geslacht aan het CBBS. Wij gebruiken deze gegevens om uw arbeidsongeschiktheid te beoordelen. Dat werkt als volgt:\n\nWij gebruiken uw naam en geslacht om zichtbaar te maken over wie de beoordeling gaat.\nUw leeftijd gebruiken wij voor het hanteren van de juiste regels en berekeningen. Ook controleren wij hiermee of u te jong of te oud bent om een bepaalde functie uit te mogen voeren.\nBeoordeling van de verzekeringsarts\nDe verzekeringsarts legt in het CBBS de code vast die hoort bij de medische diagnose. Ook beoordeelt de verzekeringsarts uw belastbaarheid en registreert hij deze in het CBBS.\n\nAanvullende gegevens van de arbeidsdeskundige\nDe arbeidsdeskundige voert de volgende gegevens in het CBBS in:\n\nhet aantal uren dat u heeft gewerkt direct voordat u ziek werd\nhet bijbehorende loon\nuw opleidingsniveau en de opleidingsrichting", - "methods_and_models": null, - "monitoring": null, - "human_intervention": "Medewerkers van UWV houden op de volgende manieren toezicht op het gebruik van het algoritme:\n\nEen beoordeling over een uitkering is maatwerk en gebeurt op individueel niveau. Onze medewerkers voeren de beoordeling daarom altijd zelf uit. Zij kijken kritisch naar de resultaten van het CBBS.\nWij controleren regelmatig de kwaliteit van beoordelingen die willekeurig zijn geselecteerd.\nWij onderzoeken de manier waarop onze medewerkers het CBBS gebruiken. Dit doen wij op verzoek of als er aanleiding voor is.\nWij onderzoeken en gebruiken de resultaten van de beoordelingen om de kwaliteit van onze vestigingen onderling te vergelijken.\nVerder gebruiken we deze resultaten op landelijk niveau. Bijvoorbeeld om de kwaliteit van de beoordelingen op hetzelfde peil te houden.\nTot slot gebruiken we de resultaten om verantwoording af te leggen aan bijvoorbeeld het ministerie of de toezichthouder.\nSoms passen we het CBBS aan\nBijvoorbeeld in de volgende situaties:\n\nWetten en regels veranderen.\nFuncties en de zwaarte van functies veranderen.\nEr komen nieuwe medische inzichten.\nProcessen en werkwijzen bij UWV veranderen.\nWe testen het systeem\nOm te zorgen dat het CBBS goed blijft werken, testen wij het systeem iedere dag. Veranderingen bereiden wij zorgvuldig voor. Dat doen we met een groot aantal deskundigen. Denk aan juristen, ontwerpers, bouwers, testers, verzekeringsartsen en arbeidsdeskundigen. Wij testen doorgevoerde veranderingen in CBBS altijd uitgebreid. Pas als het systeem de testen succesvol heeft doorlopen, nemen wij het weer in gebruik.", - "risks": "Alleen met de juiste kennis over het CBBS kunnen onze medewerkers uw arbeidsongeschiktheid goed beoordelen. Het is bijvoorbeeld belangrijk dat zij gebruikte definities begrijpen. Of weten hoe het systeem functies aan personen koppelt. Daarom kunnen zij alleen zelfstandig met het systeem werken als ze een opleiding hebben gevolgd en een certificaat hebben behaald. Bij grote wijzigingen vindt nascholing plaats. Ook scholen wij regelmatig onze arbeidsdeskundig analisten. En zijn er handleidingen beschikbaar voor gebruikers en medewerkers die betrokken zijn bij de ontwikkeling van het algoritme.", - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.510514+00:00", - "lars": "21447945", - "owner": "uitvoeringsinstituut-werknemersverzekeringen" - }, - { - "name": "Kinderbijslag", - "organization": "Sociale Verzekeringsbank (SVB)", - "department": null, - "description_short": "Door algoritmes kunnen we automatisch bepalen of u recht heeft op kinderbijslag. ", - "type": "Op regels gebaseerd", - "category": null, - "website": "https://www.svb.nl/nl/over-de-svb/hoe-werken-we/algoritmes-kinderbijslag", - "status": "In gebruik", - "goal": "Met een algoritme is beter te voorspellen hoeveel alle uitkeringen bij elkaar gaan kosten voor de Rijksbegroting. Een goed algoritme zorgt ervoor dat we minder klantdossiers handmatig verwerken. Dit bespaart kosten en onze medewerkers kunnen hun aandacht richten op maatwerk waar dat nodig is.", - "impact": "Als wij de kinderbijslag verkeerd berekenen kunt u in de problemen komen. U krijgt dan te weinig geld om te leven. Of u krijgt teveel en moet dat later terugbetalen. Dit is vervelend en kan leiden tot schulden. Een algoritme verwerkt gegevens vooral automatisch. Daarmee voorkomt het schulden.", - "proportionality": null, - "decision_making_process": null, - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": "Nederland", - "lang": "Nederlands", - "revision_date": null, - "description": "De gemeente levert gegevens aan van het kind en de ouders. Een van de algoritmes combineert al deze gegevens. Hiermee bepalen wij of het nodig is om u een aanvraagformulier voor de kinderbijslag te sturen. Wij sturen geen aanvraagformulier als u geen recht op kinderbijslag heeft.\n\nAls de kinderbijslag is toegewezen, zorgen andere algoritmes ervoor dat de betaling per kwartaal automatisch gaat. Eenvoudige wijzigingen als een verhuizing van het hele gezin binnen Nederland of de geboorte van een volgend kind worden automatisch verwerkt.\n\nDoor het gebruik van algoritmes lukt het om 90% van de beslissingen helemaal automatisch te doen. Hierdoor hoeven wij u om minder informatie te vragen en worden de kosten per uitkering ook lager.", - "application_url": null, - "publiccode": null, - "mprd": "Ja", - "source_data": "Onze belangrijkste bronnen om gegevens uit te halen zijn:\n\nde bevolkingsadministratie van de Nederlandse gemeenten\nde administratie wij bijhouden over de verzekering voor de volksverzekeringen\ninternationale systemen voor klanten buiten Nederland\nLees meer over hoe we omgaan met uw gegevens", - "methods_and_models": "Beslisboom (rule-based)", - "monitoring": null, - "human_intervention": null, - "risks": "We verwerken erg gevoelige gegevens. Daarom zetten wij de meest ervaren medewerkers in bij het ontwikkelen van de algoritmes. Ook gebruiken wij voor deze algoritmes klantenpanels om tijdens de ontwikkeling mee te kijken.\n\nDaarnaast is er voor het gebruik van de gegevens een werkwijze met veel details ingericht. Meerdere partijen binnen de SVB kijken of het gebruik van gegevens veilig gebeurt en of wij ons aan alle regels houden.", - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.515628+00:00", - "lars": "48155188", - "owner": "sociale-verzekeringsbank" - }, - { - "name": "AIO-aanvulling", - "organization": "Sociale Verzekeringsbank (SVB)", - "department": null, - "description_short": "Algoritmes bepalen of er recht is op AIO-aanvulling. Ook bepalen algoritmes of u de AIO-aanvulling als uitkering of als lening krijgt. En hoe hoog de AIO-aanvulling is.", - "type": "Op regels gebaseerd", - "category": null, - "website": "https://www.svb.nl/nl/over-de-svb/hoe-werken-we/algoritmes-aio-aanvulling", - "status": "In gebruik", - "goal": "Met een algoritme is beter te voorspellen hoeveel alle uitkeringen bij elkaar gaan kosten voor de Rijksbegroting. Een goed algoritme zorgt ervoor dat we minder klantdossiers handmatig verwerken. Dit bespaart kosten en onze medewerkers kunnen hun aandacht richten op maatwerk waar dat nodig is.", - "impact": "Als wij de AIO-aanvulling verkeerd berekenen kunt u in de problemen komen. U krijgt dan te weinig geld om te leven. Of u krijgt teveel en moet dat later terugbetalen. Dit is vervelend en kan leiden tot schulden. Een algoritme verwerkt gegevens vooral automatisch. Daarmee voorkomt het schulden.", - "proportionality": null, - "decision_making_process": null, - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": "Nederland", - "lang": "Nederlands", - "revision_date": null, - "description": "Algoritmes bepalen of er recht is op AIO-aanvulling. Ook bepalen algoritmes of u de AIO-aanvulling als uitkering of als lening krijgt. En hoe hoog de AIO-aanvulling is.\n\nHet algoritme neemt de beslissing met de gegevens die wij hebben en de gegevens die u levert. Maar gebruikt ook handmatige deelbeslissingen van medewerkers. Bijvoorbeeld de onderdelen van de vermogenstoets.", - "application_url": null, - "publiccode": null, - "mprd": "Ja", - "source_data": "Onze belangrijkste bronnen om gegevens uit te halen zijn:\n\nde bevolkingsadministratie van de Nederlandse gemeenten\nde inkomensgegevens van het UWV en de Belastingdienst\nvermogensgegevens van de Belastingdienst\nvoertuiggegevens van de Rijksdienst voor het Wegverkeer (RDW)\ngegevens die u zelf aanlevert", - "methods_and_models": "Beslisboom (rule-based)", - "monitoring": null, - "human_intervention": null, - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.521509+00:00", - "lars": "14748484", - "owner": "sociale-verzekeringsbank" - }, - { - "name": "Sancties", - "organization": "Sociale Verzekeringsbank (SVB)", - "department": null, - "description_short": "Een beslistool helpt onze medewerkers om te beoordelen of wij een boete of maatregel moeten geven.", - "type": "Op regels gebaseerd", - "category": null, - "website": "https://www.svb.nl/nl/over-de-svb/hoe-werken-we/algoritmes-sancties", - "status": "In gebruik", - "goal": "Algoritmes helpen bij moeilijke beslissingen waarbij verschillende zaken een rol spelen. Hierdoor worden minder fouten gemaakt. Het systeem behandelt iedereen in dezelfde situatie op dezelfde manier.", - "impact": "Een sanctie heeft vaak financi\u00eble gevolgen voor u. Daarnaast heeft een sanctie ook emotionele gevolgen. Nog meer dan het terug moeten betalen van een bedrag. Het geven van een sanctie heeft ook gevolgen voor de manier waarop moet worden terugbetaald. Schulden komen vaak voor.", - "proportionality": null, - "decision_making_process": null, - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": "Nederland", - "lang": "Nederlands", - "revision_date": null, - "description": "n kinderbijslag kunnen wij in sommige gevallen een sanctie geven. Een sanctie is een boete of maatregel. Wij kunnen een sanctie geven als u bijvoorbeeld een wijziging niet doorgeeft.\n\nEen beslistool helpt onze medewerkers om te beoordelen of wij een boete of maatregel moeten geven. En hoe hoog de boete is of hoelang de maatregel duurt. Hierbij kijken we naar:\n\nhet bedrag dat u teveel heeft betaald\nhoe lang u teveel heeft betaald\nde datum dat de melding binnenkwam\nde datum dat de melding binnen had moeten komen", - "application_url": null, - "publiccode": null, - "mprd": "Nee", - "source_data": "Onze belangrijkste bronnen zijn uw gegevens in onze systemen.", - "methods_and_models": "Beslisboom (rule-based)", - "monitoring": null, - "human_intervention": null, - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.526697+00:00", - "lars": "23448142", - "owner": "sociale-verzekeringsbank" - }, - { - "name": "Vrijwillige verzekering AOW en Anw", - "organization": "Sociale Verzekeringsbank (SVB)", - "department": null, - "description_short": "Een algoritme berekent de hoogte van de premie voor de vrijwillige verzekering AOW en Anw.", - "type": "Op regels gebaseerd", - "category": null, - "website": "https://www.svb.nl/nl/over-de-svb/hoe-werken-we/algoritmes-vrijwillige-verzekering-aow-en-anw", - "status": "In gebruik", - "goal": "Algoritmes helpen bij het nuttig uitvoeren van ons werk. Ook zorgen ze dat u krijgt waar u recht op heeft. En niet te weinig of te veel krijgt.", - "impact": null, - "proportionality": null, - "decision_making_process": null, - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": "Nederland", - "lang": "Nederlands", - "revision_date": null, - "description": "Als u buiten Nederland gaat wonen, betaalt u geen belasting meer in Nederland. En daardoor stopt de opbouw van uw AOW. U of uw werkgever kunnen de verzekering voor de AOW en Anw door laten gaan. Hiervoor moet een premie betaald worden. Hoe hoog de premie is, hangt af van uw inkomen. Een algoritme berekent de hoogte van die premie.", - "application_url": null, - "publiccode": null, - "mprd": "Ja", - "source_data": "Onze belangrijkste bronnen zijn:\n\npersoonsgegevens uit de bevolkingsadministratie van de Nederlandse gemeenten en van de klant\ninkomen en omstandigheden van de klant\nonze verzekeringsgegevens", - "methods_and_models": "Beslisboom (rule-based)", - "monitoring": null, - "human_intervention": null, - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.531584+00:00", - "lars": "96585577", - "owner": "sociale-verzekeringsbank" - }, - { - "name": "Preventie & Handhaving", - "organization": "Sociale Verzekeringsbank (SVB)", - "department": null, - "description_short": "Met dit model voorspellen wij hoe groot de kans is dat een alleenstaande toch samenwoont.", - "type": "Zelflerend", - "category": null, - "website": "https://www.svb.nl/nl/over-de-svb/hoe-werken-we/algoritmes-preventie-en-handhaving", - "status": "In ontwikkeling", - "goal": "Door het SWAN-model kunnen wij ons richten op het verminderen van risico\u2019s. Wij kunnen situaties waarin u krijgt waar u geen recht op heeft eerder herkennen. En aanpassen om het bedrag dat u terug moet betalen laag te houden. Ook zorgen wij ervoor dat toezichthouders nuttig worden ingezet. Het model zorgt ervoor dat we geld besparen op uitkeringen en op het werk dat we uitvoeren.", - "impact": "Om vast te stellen of iemand samenwoont, kan onze afdeling Preventie & Handhaving u thuis bezoeken. Dit zijn persoonlijke bezoeken. Daarom maken we met het SWAN-model een selectie binnen de groep, zodat er zo min mogelijk mensen worden gecontroleerd.", - "proportionality": null, - "decision_making_process": null, - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": "Nederland", - "lang": "Nederlands", - "revision_date": null, - "description": "Iemand die samenwoont krijgt minder AOW dan een alleenstaande. Wij kunnen controleren of een alleenstaande die volgens onze systemen alleen woont, toch niet samenwoont.\u202fDit heet het SWAN-model. Met dit model voorspellen wij hoe groot de kans is dat een alleenstaande toch samenwoont. Het SWAN-model is een algoritme.", - "application_url": null, - "publiccode": null, - "mprd": "Ja", - "source_data": "Onze belangrijkste bronnen zijn interne gegevens die beschikbaar zijn over de klant. Bijvoorbeeld:\n\ninformatie over het adres waar de klant nu woont of in het verleden woonde\nwoonsituatie\nleeftijd\ngeslacht", - "methods_and_models": "Zelflerend", - "monitoring": null, - "human_intervention": null, - "risks": "Wij toetsen onze modellen altijd of ze voldoen aan de regels. Dit zijn regels over ethiek en controleerbaarheid. Regels die we gebruiken zijn van de Algemene Rekenkamer en de regels die we zelf hebben opgesteld.\n\nOok hebben partijen binnen onze organisatie en partijen buiten onze organisatie toezicht gehouden op de ontwikkeling van het algoritme. En gezorgd dat de ontwikkeling met veel aandacht en veilig is gedaan.", - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.537021+00:00", - "lars": "28915384", - "owner": "sociale-verzekeringsbank" - }, - { - "name": "Beoordeling AOW-verstrekking", - "organization": "Sociale Verzekeringsbank (SVB)", - "department": null, - "description_short": "Ondersteunt bij de beoordeling van\nAOW-aanvragen.", - "type": "Op regels gebaseerd", - "category": null, - "website": "https://www.svb.nl/nl/over-de-svb/hoe-werken-we/algoritmes-aow", - "status": "In gebruik", - "goal": "Met een algoritme is beter te voorspellen hoeveel alle uitkeringen bij elkaar gaan kosten voor de Rijksbegroting. Een goed algoritme zorgt ervoor dat we minder klantdossiers handmatig verwerken. Dit bespaart kosten en onze medewerkers kunnen hun aandacht richten op maatwerk waar dat nodig is.", - "impact": "Als wij de AOW verkeerd berekenen kunt u in de problemen komen. U krijgt dan te weinig geld om van te leven. Of u krijgt teveel en moet dat later terugbetalen. Dit is vervelend en kan leiden tot schulden. Een algoritme verwerkt gegevens vooral automatisch. Daarmee voorkomt het schulden.", - "proportionality": null, - "decision_making_process": null, - "documentation": null, - "competent_authority": "Sociale Verzekeringsbank (SVB)", - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": "Ja", - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": "Nederland", - "lang": "Nederlands", - "revision_date": null, - "description": "Een van de algoritmes combineert alle gegevens die vooraf bekend en nodig zijn. Zoals woonplaats, verblijf en werk in het buitenland. Met die gegevens berekenen wij of iemand recht heeft op een complete AOW. Als de AOW is toegewezen, zorgen andere algoritmes dat de betaling per maand automatisch gaat. Eenvoudige wijzigingen als een verhuizing van het hele gezin binnen Nederland worden automatisch verwerkt.\n\nDoor algoritmes te gebruiken, lukt het al om meer dan 90% van de beslissingen helemaal automatisch te doen. Hierdoor hoeven wij u minder om informatie te vragen en worden de kosten per uitkering ook lager. Twijfelt het algoritme of de gegevens wel kloppen? Dan stopt de automatische verwerking en gaat een medewerker kijken wat er aan de hand is.", - "application_url": null, - "publiccode": null, - "mprd": "Ja", - "source_data": "Onze belangrijkste bronnen om gegevens uit te halen zijn:\n\nde bevolkingsadministratie van de Nederlandse gemeenten\nde administratie die wij bijhouden over de verzekering voor de volksverzekeringen\ninternationale systemen voor klanten buiten Nederland", - "methods_and_models": "Beslisboom (rule-based)", - "monitoring": null, - "human_intervention": null, - "risks": "We verwerken erg gevoelige gegevens. Daarom zetten wij de meest ervaren medewerkers in bij het ontwikkelen van de algoritmes. Ook gebruiken wij voor deze algoritmes klantpanels om tijdens de ontwikkeling mee te kijken.\n\nDaarnaast is er voor het gebruik van de gegevens een werkwijze met veel details ingericht. Meerdere partijen binnen de SVB kijken of het gebruik van gegevens veilig gebeurt en of wij ons aan alle regels houden.", - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.541529+00:00", - "lars": "71631383", - "owner": "sociale-verzekeringsbank" - }, - { - "name": "Berekenen huurtoeslag", - "organization": "Ministerie van Financi\u00ebn", - "department": "Dienst Toeslagen", - "description_short": "Het algoritme huurtoeslag berekent de hoogte op basis van gegevens over de aanvrager en de huurwoning. Hierbij worden de huurtoeslagregels toegepast.", - "type": "Op regels gebaseerd", - "category": "Sociale zekerheid", - "website": null, - "status": "In gebruik", - "goal": "De inzet van het algoritme heeft als doel:\n- Snel, effici\u00ebnt en consistent huurtoeslag vaststellen.\n\n- De aanvrager direct inzage geven in het besluit en, waar van toepassing, de hoogte van de huurtoeslag. \n\n- Snel, effici\u00ebnt en consistent huurtoeslag verstrekken voor ongeveer \u00e9\u00e9n miljoen huishoudens.", - "impact": "Een aanvraag voor huurtoeslag wordt beoordeeld met behulp van het algoritme. Op basis van de gegevens die de burger door heeft gegeven volgt een geheel automatisch besluit over recht op en hoogte van de huurtoeslag. \nHet algoritme kan bij de aanvraag van huurtoeslag om beoordeling door ambtenaar vragen. De verwerking neemt dan meer tijd in beslag.", - "proportionality": "Het volume is te groot voor handmatige behandeling van alle huurtoeslag aanvragen en mutaties.", - "decision_making_process": "Huurtoeslag", - "documentation": "Informatie over huurtoeslag is gepubliceerd op:\n\nhttps://www.belastingdienst.nl/wps/wcm/connect/nl/huurtoeslag/huurtoeslag", - "competent_authority": "Dienst Toeslagen", - "lawful_basis": "De wettelijke grondslag is vastgelegd in de Wet op de huurtoeslag: (https://wetten.overheid.nl/BWBR0008659/2022-01-01).\n\nIn de Algemene wet inkomensafhankelijke regelingen (AWIR) staat de toezicht en controle taak voor Dienst Toeslagen genoemd. \n(https://www.belastingdienst.nl/wps/wcm/connect/bldcontentnl/belastingdienst/intermediairs/toeslagen/wetgeving/wetgeving)\n\nDaarnaast is de Algemene Verordening Gegevensbescherming (AVG) van toepassing op de inzet van het algoritme huurtoeslag door Dienst Toeslagen.", - "iama": null, - "iama_description": null, - "dpia": "ja", - "dpia_description": "Door het algoritme worden bedrijfsregels geautomatiseerd afgehandeld. Een uitworp door het algoritme van een aanvraag ontstaat als er sprake is van:\n- Niet door het geautomatiseerde proces vast te stellen gegevens (teveel of onduidelijke gegevens, waardoor beoordeling door een ambtenaar nodig is), en/of;\n- Ontbrekende gegevens (noodzakelijk voor bepalen van recht en hoogte), en/of;\n- dienstverlening aan de burger die niet voldoet aan de eisen (maar ambtshalve hersteld wordt), en/of:\n- Technische fouten (de automaat mist gegevens om verder te kunnen gaan), en/of:\n- Afwijkende behandeling (door een ambtenaar opgevoerd om te voorkomen dat gewijzigde gegevens automatisch worden overschreven).", - "objection_procedure": "Mijn toeslag klopt niet moet ik bezwaar maken:\n\nhttps://www.belastingdienst.nl/wps/wcm/connect/nl/toeslagen/content/mijn-toeslag-klopt-niet\n\nVeel gestelde (FAQ-) vragen zijn opgenomen op:\n\nhttps://www.belastingdienst.nl/wps/wcm/connect/nl/huurtoeslag/huurtoeslag", - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": "Specifieke vragen die betrekking hebben op het algoritme kunnen gesteld worden aan:\n CIO.Office.DG.Toeslagen@toeslagen.nl", - "area": "Nederland", - "lang": "Nederlands", - "revision_date": null, - "description": "Burgers kunnen huurtoeslag aanvragen voor het adres waarop zij volgens de BasisRegistratie Personen (BRP) op het moment van de aanvraag zijn ingeschreven. Bij de aanvraag geeft hij of zij door: \n1) de gegevens van een eventuele partner of medebewoners die onderdeel uitmaken van het huishouden,\n2) de huurprijs en \n3) het (geschatte) inkomen en vermogen per lid van het huishouden. \n\nOmdat precieze huishoudsamenstelling niet altijd overeenkomt met de basisregistratie personen (BRP), huurprijs en/of (gezamenlijk) inkomen niet altijd actueel zijn, worden redelijkheidscontroleregels toegepast om zowel burgers, als de uitvoerder te behoeden voor onbedoelde fouten en de mogelijke consequenties daarvan.\n\nIn specifieke situaties vindt een uitworp van de aanvraag plaats en volgt een handmatige behandeling (zie menselijke tussenkomst) .\n\n", - "application_url": null, - "publiccode": null, - "mprd": "Het algoritme huurtoeslag maakt onderdeel uit van de huurtoeslagtoepassing (applicatie). Deze is gekoppeld aan de basisregistratie personen (BRP), basisregistratie gebouwen (BAG) en de basisregistratie Inkomen (BRI) en gebruikt de gegevens die daar bekend zijn.", - "source_data": "Bij het ontwikkelen van het model worden geen databronnen gebruikt.", - "methods_and_models": "Het algoritme huurtoeslag gebruikt eenvoudige bedrijfsregels met absulte waarden of percentage van numerieke gegevens en de regels uit de Algemene wet inkomensafhankelijke regelingen (AWIR). Met deze informatie worden persoonsrelaties en partnerschap gecontroleerd. Ook vindt met behulp van de basisregistratie personen (BRP) controle plaats op verblijfstatus, leeftijd, ouder-kindrelatie en partnerrelatie.", - "monitoring": null, - "human_intervention": "In specifieke situaties (zie omschrijving DPIA) vindt handmatige behandeling plaats, waarbij desgewenst contact wordt gezocht met de burger voor aanvullende informatie of validatie. \nGecorrigeerde gegevens worden vervolgens weer aangeboden aan het algoritme voor berekening.", - "risks": "Het algoritme is door de Algemene Rekenkamer getoetst. Het rapport met de voorziene risico's is gepubliceerd.\n\nhttps://www.rekenkamer.nl/publicaties/rapporten/2022/05/18/algoritmes-getoetst", - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.546164+00:00", - "lars": "29328576", - "owner": "toeslagen" - }, - { - "name": "Ontdooiverzoeken", - "organization": "Omgevingsdienst Noordzeekanaalgebied", - "department": "Proces & Informatie", - "description_short": "Op verzoek van de medewerker tijdelijk de zaak beschikbaar stellen voor het op orde brengen van de administratie.", - "type": "Regelgebaseerd", - "category": null, - "website": null, - "status": "In gebruik", - "goal": "Administratieve taak van het ontdooien zaken overnemen van de medewerker.", - "impact": "Deze DIVA werkt alleen intern en heeft daarom geen impact op de omgeving.", - "proportionality": "Verzoeken van medewerkers worden geautomatiseerd en sneller afgehandeld.\nAdministratieve taken worden verminderd.\n\nAls een zaak niet goed wordt ontdooid levert dat een vertraging op bij de administratie van de aanvrager en eventueel wat frustratie. Verder heeft het geen risico's voor de omgeving; de zaak is al afgehandeld en aan eventuele termijnen is al (niet) voldaan.\n\nDe risico's worden als erg laag ingeschat. Daarom zijn de verwachte baten een stuk groter.", - "decision_making_process": "n.v.t.", - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": "Nee", - "dpia_description": "N.v.t", - "objection_procedure": "N.v.t.", - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": "Noordzeekanaalgebied", - "lang": "Nederlands", - "revision_date": "2022-09-21 00:00:00", - "description": "Soms moeten collega\u2019s nog dingen wijzigen in zaken die al bevroren zijn, bijv. documenten toevoegen, mails versturen, etc.. Via een ontdooiverzoek kunnen deze collega\u2019s bij P&I aangeven welke zaak hiervoor tijdelijk ontdooid moet worden. DIVA neemt het afhandelen van deze ontdooiverzoeken van P&I over. Dit bestaat uit het ontdooien van de zaak en het versturen van een mail naar de aanvrager. Na zeven dagen check DIVA of Mozard de zaak weer vanzelf bevroren heeft. Is dit niet het geval, dan wordt dit alsnog gedaan.", - "application_url": null, - "publiccode": null, - "mprd": "n.v.t.", - "source_data": null, - "methods_and_models": null, - "monitoring": "Na afloop van de verwerking wordt een logmail gestuurd naar de informatieadviseurs en procesbeheerders die informatie bevat over de behandelde verzoeken. Aan de hand van deze logmails (die de behandelde zaaknummers bevatten) kan gecheckt worden of alles goed is gegaan.", - "human_intervention": "Indien uit logging blijkt dat het proces niet goed verlopen is, wordt dit door de medewerker hersteld. Fouten die niet uit de logging volgen, worden gesignaleerd door de indiener van het verzoek en herstelt door de medewerker. Indien nodig wordt DIVA aangepast om herhaling te voorkomen.", - "risks": "Het kan dat door een programeerfout een ontdooiverzoek niet goed behandeld wordt. Dit heeft als gevolg dat de aanvrager langer moet wachten met dat wat hij/zij moet wijzigen in de reeds bevroren zaak. Naast vertraging en eventuele frustratie bij de collega heeft dit geen gevolgen; de zaak is al afgehandeld en aan eventuele termijnen is al (niet) voldaan.", - "performance_standard": "Nader te bepalen", - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-04-06 08:50:18.467502+00:00", - "lars": "39555540", - "owner": "omgevingsdienst-noordzeekanaalgebied" - }, - { - "name": "RVO-meldingen", - "organization": "Omgevingsdienst Noordzeekanaalgebied", - "department": "Milieu en Leefomgeving", - "description_short": "Binnengekomen RVO-meldingen worden gekoppeld aan de juiste inrichting in Mozard.", - "type": "Regelgebaseerd", - "category": null, - "website": null, - "status": "In gebruik", - "goal": "Adminitratieve taak van het koppelen van de melding aan de inrichting in Mozard overnemen van de medewerker.", - "impact": "Deze DIVA werkt alleen intern en heeft daarom geen impact op de omgeving.", - "proportionality": "Administratieve taken worden verminderd.\n\nWanneer de zaak foutief of niet wordt gekoppeld levert dit werk op voor de toezichthouder, om het te corrigeren. Iedere zaak wordt handmatig behandeld vanaf status 3; er vindt dus altijd een menselijke check plaats. Daarom zijn er verder geen risico's. \n\nDe vermindering in adminstratieve taken is bestaat zolang het proces vaak genoeg goed gaat. ", - "decision_making_process": "n.v.t.", - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": "Nee", - "dpia_description": "N.v.t.", - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": "Noordzeekanaalgebied", - "lang": "Nederlands", - "revision_date": "2022-09-21 00:00:00", - "description": "Veel bedrijven zijn verplicht te melden wat zij doen om energie te besparen. De meldingen komen via het RVO en voor elke melding is een zaak aangemaakt. Deze zaken en meldingen horen in de meeste gevallen bij een reeds in Mozard bestaande inrichting. DIVA zorgt ervoor dat deze zaken vast gekoppeld worden. Zo hoeven de toezichthouders alleen nog te zorgen dat er een inrichting wordt opgevoerd bij zaken waarbij er nog geen inrichting bestaat. De toezichthouder gaat bij elke zaak daarna verder met de inhoudelijke behandeling.", - "application_url": null, - "publiccode": null, - "mprd": "0", - "source_data": null, - "methods_and_models": null, - "monitoring": "Na afloop van de verwerking wordt een logmail gestuurd naar de toezichthouders met informatieover de behandelde zaken. Aan de hand van deze logmails (die de behandelde zaaknummers bevatten) kan gecheckt worden of alles goed is gegaan.", - "human_intervention": "Elke zaak wordt inhoudelijk behandeld door een toezichthouder. Daardoor wordt elke zaak automatisch ook gemonitord; bij deze inhoudelijke behandeling komen fouten vanzelf bovendrijven.", - "risks": "Het enige risico is dat de toezichthouder alsnog de koppeling handmatig moet uitvoeren.", - "performance_standard": "Nader te bepalen", - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-04-06 08:50:18.473256+00:00", - "lars": "66996617", - "owner": "omgevingsdienst-noordzeekanaalgebied" - }, - { - "name": "Anonimiseren", - "organization": "Omgevingsdienst Noordzeekanaalgebied", - "department": "Regiebureau", - "description_short": "Zwart lakken van AVG-gevoelige informatie in documenten.", - "type": "Voorspellend", - "category": null, - "website": null, - "status": "In gebruik", - "goal": "De OD wil graag transparant zijn naar de omgeving maar moet ook voldoen aan privacy-wetgeving. De inzet van NLP-software maakt dit mogelijk, zonder dat dit te veel inzet van medewerkers kost.", - "impact": "Gepubliceerde documenten zijn geanonimiseerd. Deze automatisering bepaalt dus feitelijk wat burgers wel en wat ze niet te lezen krijgen. ", - "proportionality": "Met de inzet van deze automatisering wordt bij schatting 6 FTE uitgespaard. \n\n1. Er is een foutmarge. Tussen de 1 tot 5% van de zwarte balkjes wordt vergeten.\n2. Er kan geen onderscheid gemaakt worden tussen minder en meer gevoelige dossiers.\n\nHet inhuren van 6 FTE voor handmatig anonimiseren is zo duur dat gekozen is voor de automatische wijze en bijbehorende risico's.", - "decision_making_process": "Woo, verplichte publicaties", - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": "Nee", - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": "Noordzeekanaalgebied", - "lang": "Nederlands", - "revision_date": "2022-09-13 00:00:00", - "description": "Aan de hand van NLP-software worden privacygevoelige termen in documenten zwartgelakt. Deze software is niet in eigen beheer; wij kopen deze in bij het bedrijf TM7. Samen met TM7 wordt bepaald welke regels er gehanteerd worden. ", - "application_url": null, - "publiccode": null, - "mprd": "0", - "source_data": null, - "methods_and_models": null, - "monitoring": "Aan de hand van steekproeven wordt bijgehouden wat de kwaliteit van de software is. Hierbij wordt geteld hoeveel zwarte balkjes er gemist zijn en hoeveel privacygevoelige informatie er dus onterecht gepubliceerd is.", - "human_intervention": "Bij gevoelige zaken kan er een controle plaats vinden nadat er geautomatiseerd geanonimiseerd is. Hierbij vindt er dan een 100% controle plaats.", - "risks": "De software functioneert niet 100%. Dit betekent dat er hier en daar privacygevoelige informatie niet wordt zwartgelakt en niet-privacygevoelige informatie w\u00e9l wordt zwartgelakt. De risico's zijn dan ook ofwel het openbaar maken van informatie wat niet zou mogen, of juist niet openbaar maken van informatie, wat wel zou moeten.", - "performance_standard": "In de DR is vastgesteld dat de prestaties van de software >95% moeten zijn. Dat betekent dat er niet meer dan 5% zwarte balkjes vergeten mogen worden. Aan de hand van een steekproef worden de prestaties bijgehouden.\n", - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-04-06 08:50:18.478025+00:00", - "lars": "74541993", - "owner": "omgevingsdienst-noordzeekanaalgebied" - }, - { - "name": "Publiceren", - "organization": "Omgevingsdienst Noordzeekanaalgebied", - "department": "Regiebureau", - "description_short": "Het publiceren van binnengekomen aanvragen, meldingen en genomen besluiten op officielebekendmakingen.nl en op de eigen website Omgevingsdienst Noordzeekanaalgebied.nl", - "type": "Regelgebaseerd", - "category": null, - "website": null, - "status": "In gebruik", - "goal": "De OD NZKG is wettelijk verplicht om kennisgevingen van binnengekomen meldingen en aanvragen te publiceren. Daarnaast moeten besluiten openbaar gemaakt worden zodat belanghebbenden er kennis van kunnen nemen en bezwaar/beroep kunnen indienen. Met behulp van DIVA wordt deze repetetieve handeling geautomatiseerd.", - "impact": "De publicaties worden geautomatiseerd op- en samengesteld op dagelijkse basis. Daar zit geen verschil in met handmatige publicaties. Er worden daarom ook geen consequenties voorzien.", - "proportionality": "De publicaties worden elke ochtend uitgevoerd waardoor de medewerkers zich kunnen richten op andere taken, dit betreft circa 3 FTE inzet. Er zijn veel verschillende soorten publicaties met bijkomend risico op fouten. Door automatisering vindt de publicatie altijd volgens dezelfde vaste regels plaats, dus is de tekst van gelijksoortige publicaties altijd hetzelfde.\n\nDIVA verwerkt de door de medewerkers klaargezette publicaties. Als deze foutief worden klaargezet, wordt dit niet in het publicatieproces hersteld. Er zijn wel diverse controles bij de start van het proces ingebouwd om te zorgen dat benodigde informatie voor de publicatie compleet is.\n\nAangezien er een menselijke controle aan de voorkant zit, levert het inzetten op kwaliteit een meerwaarde op voor de OD en daarmee de omgeving.", - "decision_making_process": "Publicaties voor Wabo, meldingen Activiteitenbesluit, BUS-meldingen", - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": "Nee", - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": "Noordzeekanaalgebied", - "lang": "Nederlands", - "revision_date": "2022-09-16 00:00:00", - "description": "Publicaties die zijn toegewezen aan DIVA worden zowel op officielebekendmakingen.nl en op de eigen website Omgevingsdienst Noordzeekanaalgebied.nl gepubliceerd met alle bijbehorende teksten, zoals soort publicatie, bezwaar- en beroepsmogelijkheden, etc.. Het betreft aanvragen, meldingen en besluiten die ingediend zijn bij of genomen zijn door de Omgevingsdienst Noordzeekanaalgebied.", - "application_url": null, - "publiccode": null, - "mprd": "0", - "source_data": null, - "methods_and_models": null, - "monitoring": "Na afloop van de verwerking wordt een logmail gestuurd naar de medewerkers van het Regiebureau met informatie over de behandelde zaken. Aan de hand van deze logmails (die de behandelde zaaknummers bevatten) kan gecheckt worden of alles goed is gegaan.", - "human_intervention": "Alleen publicaties die aan afgesproken voorwaarden voldoen, worden door medewerkers toegewezen aan DIVA. Daarbij kan dus vooraf bepaald worden dat het risico voor geautomatiseerde verwerking te groot is en kan worden gekozen voor handmatige verwerking.", - "risks": "Alleen aan DIVA toegewezen publicaties worden afgehandeld, daarmee wordt voorkomen dat publicaties opgepakt worden voordat controle heeft plaatsgevonden. Daarbij start automatische verwerking met een aantal controles om de volledigheid van de publicatie voor verwerking te controleren.", - "performance_standard": "Nader te bepalen", - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-04-06 08:50:18.483839+00:00", - "lars": "36143229", - "owner": "omgevingsdienst-noordzeekanaalgebied" - }, - { - "name": "Deelzaken starten Arbeidsinspectie ILT", - "organization": "Omgevingsdienst Noordzeekanaalgebied", - "department": "Milieu en Industrie", - "description_short": "Het starten van deelzaken 'Adviesverzoek extern uitzetten' bij Waboprocedures.", - "type": "Regelgebaseerd", - "category": null, - "website": null, - "status": "In gebruik", - "goal": "Om te voldoen aan wet- en regelgeving moet de OD NZKG bij elke Wabo-zaak een adviesverzoek doen bij de ILT en de aanvraag ter informatie aanbieden aan de Arbeidsinspectie. Het automatiseren van dit proces heeft als primair doel het geven van een kwaliteitsimpuls: het starten van de deelzaken wordt bij handmatig uitvoeren nog wel eens vergeten. Daarnaast levert de automatisering een tijdsbesparing op, waardoor vergunningverleners meer tijd overhouden voor inhoudelijk werk. ", - "impact": "Bij de Wabo-vergunningsprocedure worden de Arbeidsinspectie en ILT al vroeg in het proces in de gelegenheid gesteld advies te geven. Als er iets fout gaat met de automatisering, heeft dat daarmee invloed op de kans die deze organen hebben om hun advies uit te brengen.", - "proportionality": "Door automatisering kan het uitzetten van de deelzaken niet meer worden vergeten door een van de vergunningverleners. Verwacht wordt daarom dat het aantal niet-gedane verzoeken/ niet-aangeboden aanvragen zal afnemen.\n\nOok wanneer de deelzaken geautomatiseerd worden gestart, bestaat de kans dat dit misgaat en het verzoek/ de aanvraag niet verstuurd wordt. Dit heeft als gevolg dat de organen die worden aangschreven niet genoeg tijd hebben/ niet de gelegenheid krijgen om hun advies uit te brengen.\n\nDe verwachting is dat er bij geautomatiseerde adviesverzoeken minder deelzaken worden overgeslagen dan bij het handmatig starten van deze deelzaken. ", - "decision_making_process": "De volgende wetgeving verplicht ons tot het doen van de adviesvrzoeken:\nArt. 2.26 lid 3 Wabo\nArt. 6.3 lid 2 Bor\nArt. 6.15 lid 2 or", - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": "Nee", - "dpia_description": "N.v.t.", - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": "Noordzeekanaalgebied", - "lang": "Nederlands", - "revision_date": "2022-09-21 00:00:00", - "description": "Met dit proces worden bij zaken voor Wabo-regulier- en Wabo-uitgebreid deelzaken 'Adviesverzoek extern uitzetten' gestart voor het ter informatie aanbieden van de aanvraag aan de Nederlandse Arbeidsinspectie en een adviesverzoek aan de Inspectie Leefomgeving en Transport. ", - "application_url": null, - "publiccode": null, - "mprd": "0", - "source_data": null, - "methods_and_models": null, - "monitoring": "Na afloop van de verwerking wordt een logmail gestuurd naar de vergunningverleners met informatieover de behandelde zaken. Aan de hand van deze logmails (die de behandelde zaaknummers bevatten) kan gecheckt worden of alles goed is gegaan.", - "human_intervention": "Bij de inhoudelijke behandeling van de Waboprocedure kan de vergunningverlener altijd nalopen of de juiste deelzaken zijn uitgezet. Fouten kunnen zo worden geconstateerd en hersteld.", - "risks": "Bij fouten voldoet de OD NZKG niet aan wet- en regelgeving.", - "performance_standard": "Nader te bepalen", - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-04-06 08:50:18.489378+00:00", - "lars": "74973213", - "owner": "omgevingsdienst-noordzeekanaalgebied" - }, - { - "name": "OD Besluit", - "organization": "Omgevingsdienst Noordzeekanaalgebied", - "department": "Regulering en Expertise", - "description_short": "Documentnummer en link naar besluit toevoegen aan registratie OD Besluit in Mozard", - "type": "Regelgebaseerd", - "category": null, - "website": null, - "status": "In gebruik", - "goal": "Administratieve taak van het koppelen van het besluitdocument aan de registratie OD Besluit in Mozard uitvoeren in plaats van dat het handmatig door de medewerker gedaan moet worden.", - "impact": "Medewerkers gebruiken OD Besluit als ingang om de genomen besluiten overzichtelijk te raadplegen.\nOD Besluit wordt ontsloten op de website van de OD via de GISviewer. Burgers kunnen deze kaart raadplegen wanneer zij op zoek zijn naar besluiten die de OD genomen heeft. Door inzet van DIVA zijn de besluiten beschikbaar voor inzage.", - "proportionality": "De inzet van DIVA scheelt per besluit naar schatting 8 minuten administratief werk. Elke maand worden er zo'n 50 besluiten genomen. Dit betekent een totaal van circa 7 uur per maand.\n\nHet risico bestaat dat er geen of een onjuist besluitdocument wordt gekoppeld aan de registratie. Bij menselijk handelen kan hier hier nog een check op plaatsvinden, echter, bij geautomatiseerd handelen kan dit niet. Hierdoor krijgen burgers en/of OD-medewerkers eventueel geen of het verkeerde document te zien. \n\nAls het juiste document in de zaak staat, wordt ook het juiste document gekoppeld. Er zijn verschillende checks om ervoor te zorgen dat het juiste besluitdocument in de zaak staat (collegiale toets, goedkeuring door de manager). De kans op een verkeerd document is zeer klein (bij een steekproef van 35 documenten 100% score). Hiermee zijn de baten groter dan het geschatte risico.", - "decision_making_process": "Wabo-vergunningverleningsprocessen", - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": "Nee", - "dpia_description": "N.v.t", - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": null, - "area": "Noordzeekanaalgebied", - "lang": "Nederlands", - "revision_date": "2022-11-28 00:00:00", - "description": "Van alle Wabo-besluiten die genomen worden, wordt een registratie aangemaakt waardoor medewerkers en burgers inzicht kunnen verkrijgen welke door de OD genomen besluiten op een locatie gelden. Hiervoor wordt bij het afhandelen van een vergunningzaak een registratie opgevoerd. Als administratieve lastenverlichting voor de medewerker in combinatie met kwaliteitsverbetering wordt vervolgens geautomatiseerd het bijbehorende document aan deze registratie gekoppeld.", - "application_url": null, - "publiccode": null, - "mprd": "n.v.t.", - "source_data": null, - "methods_and_models": null, - "monitoring": "Na afloop van de verwerking wordt een logmail gestuurd naar de key-users van vergunningverlening met informatieover de behandelde zaken. Aan de hand van deze logmails (die de behandelde zaaknummers bevatten) kan gecheckt worden of alles goed is gegaan.", - "human_intervention": "Indien DIVA geen besluit kan vinden of als er meerdere documenten met dezelfde kenmerken in een zaak aanwezig zijn, zal DIVA een melding geven dat v\u00f3\u00f3r verdere afhandeling eerst de medewerker het dossier op orde moet maken.", - "risks": "De automatisering wordt zo ingericht dat alleen verwerking plaatsvindt indien er \u00e9\u00e9n document voldoet aan de voorwaarden om toe te voegen aan de registratie. In alle andere gevallen wordt een medewerker ingeschakeld. Het enige risico wat daarmee overblijft is dat dit ene document niet het juiste is, maar de achterliggende oorzaak daarvan is een menselijke fout.", - "performance_standard": ">90% geautomatiseerd verwerkt.", - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-04-06 08:50:18.494471+00:00", - "lars": "91657145", - "owner": "omgevingsdienst-noordzeekanaalgebied" - }, - { - "name": "Gladheid meldsysteem", - "organization": "Provincie Noord-Brabant", - "department": "Multimodale Bereikbaarheid", - "description_short": "Het algoritme gebruikt sensordata om een calculatie te maken voor voorspellingen van gladheidsrisico's. Deze voorspellingen worden gebruikt om te bepalen waar (preventief) gestrooid moet worden, in overleg met meteorologen. Daarnaast kan het algoritme verschillende alarmen geven, bijvoorbeeld bij kans op bevriezing van natte wegdelen of gladheid door condensatie. ", - "type": "Voorspellend en diagnostisch", - "category": "Verkeersveiligheid", - "website": null, - "status": "In werking", - "goal": "Het doel van het algoritme is om de veiligheid en doorstroming op de weg te waarborgen, door op tijd gladheidsrisico's te melden waardoor er op tijd gestrooid kan worden.", - "impact": "Burgers, met name weggebruikers, die gebruik maken van het weggennetwerk. Zij merken of er gestrooid is of niet.", - "proportionality": "Negatieve effecten en risico's zijn verwaarloosbaar. De verwachte baten zijn vooral gericht op effici\u00ebnter proces en stooibeleid.", - "decision_making_process": "Het gladheidsmeldsysteem verbetert de veiligheid en doorstroming op de weg, daarbij draagt het bij aan de mobiliteitsopgave. De mobiliteitsopgave is een wettelijke taak. Voor de veiligheid van het wegennetwerk heeft de Provincie een inspanningsverplichting, die ze verplicht inspanning te verrichten om het wegennet veilig te houden, waaronder het strooien valt. Er is geen resultaatverplichting. Artikel 16 en verder van de Wegenwet.", - "documentation": null, - "competent_authority": "De Provincie is eigenaar van het algoritme, maar het kan zelf geen aanpassingen doen.\nOnderhoud en aanpassingen worden gedaan door Rijkswaterstaat \nDe rekenregels die gebruikt worden zijn van het KMNI. ", - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": "Nee", - "dpia_description": "N.v.t.", - "objection_procedure": null, - "standard_version": "0.1.0", - "uuid": null, - "url": null, - "contact_email": "algoritmeregister@brabant.nl", - "area": "Noord-Brabant", - "lang": "Nederlands", - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": "Nee", - "source_data": "De data die gebruikt wordt is de sensordata van de meetpunten:\n- Wegdektemperatuur\n- Luchttemperatuur\n- Ondergrondtemperatuur\n- Neerslag\n- Geleiding\n- Dauwpunttemperatuur\nEr wordt geen gevoelige/persoonlijke data gebruikt.", - "methods_and_models": null, - "monitoring": "Omdat het onderhoud onder Rijkswaterstaat valt, controleren zij de werking van het algoritme, zij kalibreren het systeem jaarlijks.\nDaarnaast krijgt de Provincie automatisch een melding bij een kapotte sensor.", - "human_intervention": "Het algoritme is adviserend, en heeft geen beslissingsbevoegdheid. Er is altijd een mens die besluit of er inderdaad gestrooid zal worden of niet. ", - "risks": "Als het algoritme niet goed werkt en er niet tijdig gestrooid wordt kan de veiligheid op de weg in het geding komen, daarnaast kan de doorstroom verminderd worden. Dit risico wordt ondervangen doordat het strooien altijd in overleg gebeurt met meteorologen. Als meteorologen aangeven dat zij denken dat er gestrooid moet worden, terwijl het algoritme dit niet aangeeft, kan er alsnog besloten worden te gaan strooien.\nEen tweede risico is dat de situatie op specifieke meetpunten bekeken wordt (15 in Brabant) waarop het risico voor de omgeving wordt bepaalt. Dit kan tot onnauwkeurigheden leiden. Ook dit risico wordt ondervangen door de samenwerking met meteorologen.", - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.551042+00:00", - "lars": "85816259", - "owner": "provincie-noord-brabant" - }, - { - "name": "intelligente Verkeers Regel Installatie (iVRI)", - "organization": "Provincie Noord-Brabant", - "department": "Multimodale Bereikbaarheid", - "description_short": "Het veilig, autonoom en automatisch regelen van de verkeerstromen op een kruispunt middels een iVRI.", - "type": "Binnen het algoritme worden alle types gebruikt om tot een continue uitkomst te komen, dus meten, diagnostiseren, voorspellen en voorschrijdend inzicht word verwerkt.", - "category": null, - "website": "Talking Traffic (talking-traffic.com)", - "status": "In werking", - "goal": "1. Zorg dragen voor een effici\u00ebnte doorstroming op kruispunten met iVRI's op een veilige (zonder ongevallen) en geloofwaardige (zonder dat mensen voor niks staan te wachten / logische volgorde) manier.\n\n2. Generen van data voor controle juiste werking door Provincie, en als input voor het centraal landelijk datapunt UDAP.\n\n3. De inzet van de iVRI's draagt ook bij aan een betere bereikbaarheid, aan meer reiscomfort, aan verkeersveiligheid en aan vergroening van de mobiliteit.", - "impact": "Het algoritme bepaalt de stand/kleur van de verkeerslichten en zodoende of een burger mag doorrijden of moet stoppen.", - "proportionality": "De verkeersintensiteit in en rond steden neemt toe, de beleidsdoelen die wegbeheerders dienen zijn veelvoudig: doorstroming, bereikbaarheid, verkeersveiligheid, leefbaarheid, duurzaamheid, economische vitaliteit dienen allemaal zoveel als mogelijk bevorderd te worden. Hierbij moet ook rekening gehouden worden met de verschillende gedragingen van verkeersdeelnemers (lopen, fietsen, personenauto\u2019s, OV, vrachtwagens, nood en hulpdiensten) met elk hun eigen karakteristieken, noodzaken en beperkingen waarbij politiek-bestuurlijke prioriteiten regelmatig ander accenten vergen in het accommoderen van de ene groep boven de andere(bijv. meer voorrang voor fietsers boven personenauto\u2019s) en het gebied zich ook blijft ontwikkelen en veranderen (denk aan nieuwe woonwijken en bedrijfsterreinen en/of kantoorlocaties). Binnen dit speelveld van doelen, belangen en veranderingen zijn iVRI's noodzakelijk om dit op een effici\u00ebnte manier in de praktijk uit te voeren.", - "decision_making_process": "De inzet van de iVRI's is noodzakelijk om de taak als wegbeheerder van provinciale wegen op een effici\u00ebnte manier uit te kunnen voeren.", - "documentation": "Het algoritme is een cluster van verschillende algoritme's van verschillende leveranciers die allemaal verschillende nuaces hebben. Voor elk kruispunt wordt een uniek algoritme ontwikkeld door verschillende leveranciers:\nwww.vialis.nl\nwww.dynniq.nl\nwww.swarco.nl", - "competent_authority": "De formele wegbeheerder, zijnde Provincie Noord-Brabant.", - "lawful_basis": "De grondslag voor het inzetten van iVRI's is een combinatie van de verschillende opgaves (met name: veiligheid-, mobiliteits-, ruimtelijke ordening-, en financi\u00eble opgave) van de provincie.", - "iama": null, - "iama_description": null, - "dpia": "Nee", - "dpia_description": "N.v.t.", - "objection_procedure": "Een burger kan melding doen van een slecht/niet functionerend regelsysteem via een elektrisch formulier.\nhttps://fd9.formdesk.com/provincienoordbrabant/Infra_melding_provinciale_wegen/?get=1&sidn=c34ae56da0cf4088b5bbd9fc1b320828", - "standard_version": "0.1.0", - "uuid": "N.v.t.", - "url": "N.v.t.", - "contact_email": "algoritmeregister@brabant.nl", - "area": "Noord-Brabant", - "lang": "Nederlands", - "revision_date": null, - "description": "Het algoritme detecteert de aanwezigheid van verschillende mobiliteiten (auto's / fietsen / vrachtwagens / voetgangers) met behulp van detectielussen, drukknoppen, mobile app data, en boordcomputer. Dit zal in de toekomst waarschijnlijk nog een breder pallet van inputs worden. Op basis van deze data en vooraf gedefinieerde criteria wordt per cyclus (+/- 90 of 120 seconden) de meest effici\u00ebnte doorstroom op een veilige en geloofwaardige manier berekend. Hierop worden in Real-Time door het regel-algoritme de verkeerslichten afgestemd (wie krijgt eerst groen etc.). Het 'regel-algoritme' wordt gecontroleerd door het 'controle-algoritme' om de veilgheid van de kruispunten te kunnen garanderen.", - "application_url": "Voor elk kruispunt met iVRI's wordt een specifiek algoritme gemaakt door verschillende leveranciers. Deze informatie is nu (nog) niet beschikbaar.", - "publiccode": "N.v.t.", - "mprd": "Nee", - "source_data": "De data die het algoritme gebruikt is de real-time data die het regelsysteem zelf meet met behulp van o.a. detectielussen en drukknoppen.\nDaarnaast wordt data opgehaald via landelijke UDAP. Deze specifieke dataflow (origine vanuit mobieltjes en boordcomputers) zijn betiteld als (mogelijke) persoon herleidbare data. Alle partijen die deze data verwerken dienen een dataverwerkersoverkeenkomst te ondertekenen.", - "methods_and_models": "https://www.talking-traffic.com/nl/\n\nwww.crow.nl", - "monitoring": "https://www.talking-traffic.com/nl/\n\nwww.crow.nl", - "human_intervention": "De formele wegbeheerder mag ingrijpen op de werking van de iVRI inclusief het algoritme. Voor elk kruispunt wordt een uniek algoritme ontwikkeld door leveranciers op basis van de inrichting van het kruispunt en het beleid van de provincie. Elk kruispunt bestaat uit honderde parameters die door verkeerskundigen aangepast kunnen worden om de doorstroming van de kruispunten te verbeteren op basis van beleid (verkeersveiligheid, doorstrooming, leefbaarheid,,,).", - "risks": "De risico\u2019s zijn veelvuldig maar ook klein. Zodra verkeersonveilige situaties zouden kunnen ontstaan (conflicteren richtingen krijgen groen) zal het algoritme afgebroken worden en zullen de verkeerslichten gaan knipperen. Dit komt omdat er naast het 'regel-algoritme' die de verkeerslichten regelt, ook een controle-algoritme is. Het afbreken gebeurd door dit separate veiligheids-controle-algoritme. Hiernaast is de algemene verkeerswet ook van toepassing als de verkeerslichten \u2018knipperen\u2019. Verkeersveiligheid is een basisontwerp principe bij verkeerslichten en de gebruikte algoritmes.", - "performance_standard": "Maandelijks wordt functioneel onderhoud bij het slechts presterende systeem in Noord Brabant gedaan. \nGemiddeld 1x per 5 jaar wordt ieder verkeerslicht fysiek gecontroleerd of systeem nog naar beheren werkt.\n1x per jaar is er preventief technisch onderhoud.", - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.555891+00:00", - "lars": "46452825", - "owner": "provincie-noord-brabant" - }, - { - "name": "Webapplicatie Impactmonitor Brugopening ", - "organization": "Provincie Zuid-Holland", - "department": "Dienst Beheer en Infrastructuur (DBI)", - "description_short": "De Impactmonitor Brugopeningen is een beslissingsondersteunende webapplicatie die brugbedieners ondersteunt bij het kiezen van het optimale moment voor een brugopening. Er wordt rekening gehouden met de verkeersdoorstroom en de uitstoot (CO2 voetafdruk). De applicatie is uitgerust om de verkeersdrukte tot 21 minuten vooruit te voorspellen in combinatie met actuele (real-time) verkeerinformatie.", - "type": "Voorspellend\nDe app is een real-time voorspelmodel dat tot 21 minuten in de toekomst de overlast voor het wegverkeer als gevolg van een brugopening kan voorspellen (voertuigverliesuren op basis van verkeersintensiteit en verkeerscongestiemodel)", - "category": "Verkeer en vaarwegen, Brug monitoringsysteem (BMS), Verkeersdoorstroming Voorspellen, Deep learning, Long Short-Term Memory (LSTM), Verkeerscongestiemodel, Data science, Prognosemodel, Real-time, API", - "website": "https://werkenvoor.zuid-holland.nl/artikelen/slimme-bruggen-door-data-deeplearning/\n https://baae58888c14f40f89d08821.blob.core.windows.net/paper/SmartShipping_paper_nl.pdf", - "status": "Het algoritme is in productie en het gebruik zit in een pilotfase. Het gebruik is enkel intern. Er zijn op dit moment drie bruggen opgenomen in de Impactmonitor Brugopeningen: de Coenecoopbrug (Waddinxveen), de Lammebrug (Leiden) en de Kruithuisbrug (Delft). De applicatie wordt momenteel met een selecte groep getest, waarna deze na verdere evaluatie gefaseerd zal worden ingevoerd in de bediencentrale.", - "goal": "De Impactmonitor Brugopeningen is gebouwd om brugbedieners te ondersteunen in het kiezen van het optimale moment voor een brugopening. De applicatie is uitgerust om de verkeersdrukte tot 21 minuten vooruit te voorspellen in combinatie met actuele scheepsverkeer informatie. De Impactmonitor Brugopeningen is aangepast op het gedrag en werkproces van brugbedieners. De brugbedienaar ziet in de applicatie bij een brug 3 tijdsvakken van 7 minuten. De app berekent in welke van de drie tijdsvakken een brugopening de minste overlast voor het wegverkeer veroorzaakt. De brugbedienaar neemt vervolgens het besluit wanneer en hoe lang de brug opengaat.", - "impact": "Het algoritme verwerkt geen persoonsgegevens (zoals leeftijd, geslacht, inkomen, gezondheid, enzovoort). De informatie is op geen enkele wijze herleidbaar tot een natuurlijk persoon. Bovendien is er altijd nog een menselijke tussenkomst en bepaalt de brugbedienaar uiteindelijk nog altijd op welk moment een brug het beste open kan. Het algoritme zelf is enkel beslissingsondersteunend.", - "proportionality": "Het algoritme verwerkt geen persoonsgegevens (zoals leeftijd, geslacht, inkomen, gezondheid, enzovoort). De informatie is op geen enkele wijze herleidbaar tot een natuurlijk persoon. Bovendien is er altijd nog een menselijke tussenkomst en bepaalt de brugbedienaar uiteindelijk nog altijd op welk moment een brug het beste open kan. Het algoritme zelf is enkel beslissingondersteunend.", - "decision_making_process": "Binnen het proces van de brugbediening operatie. Wettelijke taak om de weg- en vaarverkeer te verbeteren en ervoor te zorgen dat dit veilig gebeurt. ", - "documentation": " https://baae58888c14f40f89d08821.blob.core.windows.net/paper/SmartShipping_paper_nl.pdf ", - "competent_authority": "DBI is verantwoordelijk voor de tool en het gebruik en inzet van het algoritme. DBI is echter niet verantwoordelijk voor het toetsen van de inhoud, dat ligt bij mensen van de techniek.", - "lawful_basis": "De provincie Zuid-Holland heeft een belangrijke rol in de verkeersdoorstroming binnen de regio en is verantwoordelijk voor het beheer, onderhoud en bedienen van meer dan 100 bruggen in Zuid-Holland. Zie onder andere: https://lokaleregelgeving.overheid.nl/CVDR431299/1", - "iama": null, - "iama_description": null, - "dpia": "Er zijn geen persoonsgegevens bij dit algoritme betrokken.", - "dpia_description": "Er ziijn geen persoonsgegevens bij dit algoritme betrokken.", - "objection_procedure": "Voor vragen en opmerkingen kan je terecht bij: digitaalzuidholland@pzh.nl.\nWil je bezwaar maken, dan kan je terecht bij de Juridische afdeling van dienst beheer organisatie. https://www.zuid-holland.nl/contact/", - "standard_version": "0.1.0", - "uuid": "Niet bekend.", - "url": "Niet bekend.", - "contact_email": "Voor vragen en opmerkingen kan je terecht bij: digitaalzuidholland@pzh.nl.\nWil je bezwaar maken, dan kan je terecht bij de Juridische afdeling van dienst beheer organisatie. https://www.zuid-holland.nl/contact/", - "area": "Provincie Zuid-Holland", - "lang": "Nederlands", - "revision_date": "Wordt vervolgd", - "description": "De provincie Zuid-Holland heeft een belangrijke rol in de verkeersdoorstroming binnen de regio door het bedienen en onderhouden van meer dan 100 bruggen. Slimme ICT-oplossingen bieden nieuwe kansen om via sensoren en algoritmes haarfijn actuele verkeersinformatie te koppelen aan realtime scheepvaart informatie. \nVan deze 100 bruggen zijn er 55 die sensoren hebben, waarmee gemonitord wordt of de brug open of dicht is. Voor een steeds groter wordend aantal van deze bruggen staat de provincie voor een uitdaging om de verkeersstroom optimaal af te stemmen met de scheepvaart en een toenemende verkeersdrukte. De provincie zet zich in voor een slimmere, veiligere en effici\u00ebntere doorvaart om deze uitdagingen te verwezenlijken. \nIn het project \u2018Impactmonitor Brugopeningen\u2019 is hierin een wezenlijke stap gezet in het voorspellen van verkeersintensiteiten rondom een aantal belangrijke bruggen in de provincie Zuid-Holland. De gebruikte Long Short-Term Memory neurale netwerken kunnen met een correlatieco\u00ebffici\u00ebnt nauwkeurigheid van 75-95% voorspellingen doen tot 21 minuten vooruit. De ontwikkelde algoritmes zijn uitgerold binnen een Azure cloud omgeving. Het is opgeleverd als gebruiksvriendelijke webapplicatie waarin live scheepvaart en verkeersinformatie gepresenteerd wordt. Deze informatie wordt door de applicatie gebruikt om het optimale moment voor een brugopening te adviseren aan een brugbediener. \nIn een volgende fase kan deze informatie direct teruggevoerd worden aan het verkeersnetwerk waarmee bijvoorbeeld navigatie software rekening kan gaan houden met geplande brugopeningen. Samenvattend, de ontwikkelde webapplicatie gebruikt recente technologie op het gebied van kunstmatige intelligentie waarmee brugbedieners vakkennis kunnen combineren met de laatste technologie.", - "application_url": "Komt er nog.", - "publiccode": null, - "mprd": "Er komen geen persoonsgegevens in voor.", - "source_data": "De data die worden gebruikt, worden real-time ingelezen uit de Nationale Databank Wegverkeergegevens (NDW). Data over vaarwegen zit er nu nog niet in.\n\n- Aantal voertuigen\n- Soort voertuigen\n- Snelheid per voertuigen\n\nHIG Meetlusgegevens\nIn de provinciale wegen liggen meetlussen die de doorstroom van het verkeer in aantal voertuigen, soort voertuig en snelheid per voertuig registreert. Slechts een subset van deze lussen wordt real-time ontsloten aan het NDW (Nationale Databank Wegverkeersgegevens) \u2013 de rest wordt gebruikt voor monitoring en evaluatie. Omdat niet alle voor het project relevante meetlussen beschikbaar waren in het NDW is bij de leverancier een ruwe dataset opgevraagd voor de drie in de inleiding genoemde bruggen. Hierin stonden de meest gedetailleerde data van alle voertuigen die over een meetlus rijden, waarbij elke regel in de dataset \u0301een voertuig is. Voor het verdere gebruik van deze data zijn de individuele regels geaggregeerd per minuut met de som van aantal voertuigen, gemiddelde snelheid en gemiddelde lengte en aantallen per voertuigclasses. Hierbij is tussen de \u0301e \u0301en en twee jaar aan historische data gebruikt voor het maken van het voorspelmodel afhankelijk van beschikbaarheid per meetlus\n\nNDW real-time wegverkeersintensiteiten \nNDW heeft actuele verkeersgegevens van het aantal voertuigen dat per minuut een meetpunt passeert. \n\nCentrale Object Bediening Analyse Log Data (COBALD) brugopening data \nCOBALD is een voor de Provincie ontwikkeld systeem dat gekoppeld staat aan de bediencentrale. Alle historische brugopeningen met daarin het moment (start datum/tijd) en de duur van de brugopening staan hierin. Deze historische data is gebruikt voor het prepareren en analyseren van de meetlusgegevens.\n\nBridge Sense real-time data \nOp de meeste bruggen zijn extra sensoren geplaatst die real-time brugopeningen detecteert en doorstuurt aan de Blauwe Golf Verbindend en het NDW \u2013 die het beschikbaar stellen als Open Data. Deze real-time data wordt gebruikt voor de actuele brugstatus in de ontwikkelde webapplicatie.", - "methods_and_models": "LSTM Long short term memory. Deep learning algoritme\nVerkeersintensiteitenmodel ontwikkeling Deep learning modellen zijn ontwikkeld in de Keras library (versie 2.2.4), een open-source neural netwerk pakket geschreven in Python. Keras stelt onderzoekers in staat om snel te experimenteren met deep neural networks. Keras was gebruikt in samenhang met TensorFlow (versie 1.5.0) als backend waarbij in de experimentele fase de GPU variant van het gekozen model (sectie 3) is gebruikt. Een grid-search was toegepast ontleed aan de Scikit-learn machine learning library voor Python. Alle analyses voor het opschonen van data en het modelleren van verkeersintensiteiten zijn uitgevoerd in Python.\n\nArtifici\u00eble Neurale Netwerken (ANN) zijn een set aan algoritmes ge\u00efnspireerd door de enorm effici\u00ebnte werking van het menselijk brein om patronen te herkennen. Een ANN bestaat uit artifici\u00eble neuronen en kan in recente jaren tot in vergaande diepte en complexiteit effici \u0308ent getraind worden door zogenoemde deep learning algoritmes. Voor tijdseries data zoals in deze casus zijn Recurrent (Terugkerend) Neuraal Netwerken (RNN) vaak een geschikte oplossing omdat hierbij neuronen niet alleen informatie uit vorige lagen van het netwerk meewegen, maar ook informatie uit vorige tijdspunten meenemen. Een krachtige variant op RNN\u2019s is het Long Short-Term Memory (LSTM) netwerk die\nspeciaal is ontwikkeld om lange tijdsreeksen te modelleren. In het hier gepresenteerde werk zijn LSTM gekozen als uiteindelijk algoritme om real-time verkeersintensiteiten te voorspellen voor drie bruggen\n\nAls eerste is een LSTM model getraind op historische verkeersdata waarbij een tijdsreeks aan input gebruikt is om een vector aan stappen vooruit te voorspellen (script 1). In het tweede geval is een encoder-decoder LSTM gebruikt (script 2) waarbij de invoer tijdreeks aan data gecodeerd wordt (encode). De decoder gebruikt deze gecodeerde data en maakt een voorspelling een stap vooruit voor elk element in de output reeks. Het verschil is klein, aangezien in de praktijk beide modellen een reeks vooruit voorspellen. Het belangrijkste verschil is dat een LSTM model encoder decoder model informatie heeft over zowel de voorgaande stap die voorspeld is als ook de geaccumuleerde informatie uit de encoder stap wordt meegewogen in het voorspellen van de output sequentie", - "monitoring": "Tijdens de pilotfase is er een dashboard ontwikkeld waarop te zien is hoe het algoritme wordt ingezet en waar het wordt ingezet. ", - "human_intervention": "Het algoritme zelf is enkel beslissingsondersteunend. De brugbediende maakt zelf de eind beslissing. Hiermee is de brugbedienaar verantwoordelijk. Er zit nog menselijke interactie tussen. Het algoritme bepaalt niet zelf wanneer de brug open en dicht gaat.", - "risks": "De gebruikte Long Short-Term Memory neurale netwerken kunnen met een correlatieco\u00ebffici\u00ebnt nauwkeurigheid van 75-95% voorspellingen doen tot 21 minuten vooruit. Dit is niet 100%. De nauwkeurigheid van het algoritme zou te laag kunnen zijn, waardoor je minder inzicht krijgt en je minder goed een beslissing kan maken als brugbedienaar.\n\nOok kan het algoritme mogelijk verkeerd worden ge\u00efnterpreteerd door de brugbedienaar. Die kans bestaat, maar de impact ervan is heel klein. Daarom wordt er nu een pilot gedaan om brugbedienaars hierin mee te nemen, zodat zij het algoritme goed begrijpen.", - "performance_standard": "Performance is van enorm belang \u2013 gezien de brugbedieners niet willen wachten op de uitkomst van het model. De Non Functional Requirement (NFR) is dat de voorspelling binnen 3 seconden op het scherm te zien moet zijn. De uiteindelijk oplossing biedt een responsetijd tussen de 0,5 en 2 seconden.", - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.560649+00:00", - "lars": "96895333", - "owner": "provincie-zuid-holland" - }, - { - "name": "Keuzehulp WBU-Tabel", - "organization": "Provincie Zuid-Holland", - "department": "Dienst, Beheer en Infrastructuur", - "description_short": "De verkeersmanagers willen voorspelbaar onderhoud aan de weg kunnen plannen op basis van de werkbare uren. Om onderhoud te kunnen plegen, moeten er verkeersmaatregelen worden genomen (in de vorm van gedeeltelijke wegafsluitingen). Dit kan een een negatief effect hebben op de capaciteit van de weg om verkeer te kunnen verwerken. \nWerkbare uren worden bepaald door:\n\u2022de capaciteit van de locatie.\n\u2022het tijdstip (dag, uur).\n\u2022de minimaal vereiste restcapaciteit van de locatie.\n\u2022het effect van het type verkeersmaatregel op de capaciteit. \n\nWerkbare uren worden nu statisch bepaald. Het doel van deze fase is om te bepalen of we deze werkbare uren data-gedreven kunnen bepalen. \nDe definitie van data-gedreven in deze fase is: maximale capaciteit van de locatie wordt bepaald door daadwerkelijk bemeten intensiteiten (vanuit verkeersdata NDW, met interpolatie) op dezelfde tijdstippen. \nAan de hand van historische data kan je met dit algoritme zien welke type afzetting en verkeersmaatregel kan worden toegepast op een weg. Ook kan je zien welke momenten geschikt zijn.\n\nDe keuzehulp WBU-tabel wordt mede gebruikt om de WBU-tabel op te stellen. Bij het opstellen van de tool wordt naast de tool ook rekening gehouden met bepaalde afspraken uit het bedrijfsleven en andere beleidskeuzes van PZH.", - "type": "Diagnostich", - "category": "Wegwerkzaamheden en verkeer", - "website": "De (tijdelijke) URL is: https://c6ae6fa2db7da44c79581d7e.azurewebsites.net/ \nEr komt nog een URL waarmee eerst via PZH netwerk moet worden ingelogd. Tevens is het (nog) niet de bedoeling dat deze URL door externe wordt gebruikt. In eerste instantie wordt de WBU doorvertaald in een tabel (zoas nu ook het geval is). ", - "status": "Op dit moment worden de laatste kinderziektes uit de tool gehaald (nov, 2022)", - "goal": "Verlagen van operationele kosten en verhogen van de verkeersveiligheid.\n\n\u2022Verhogen verkeersveiligheid \nDe CROW96b geeft rekenmethodes om te bepalen bij welke verkeersintensiteit bij welke verkeersmaatregel toegepast mag worden. De huidige WBU-tabel houdt hier geen rekening mee. Doordat een webapplicatie per type verkeersmaatregel de WBU weergegeven wordt, wordt er altijd voldaan aan de eisen vanuit de richtlijn. Hierdoor blijft de verkeersveiligheid gewaarborgd. \n\n\u2022Operationele kosten \nDe webapplicatie maakt het in tegenstelling tot de oude WBU-tabel mogelijk om de WBU per dag te berekenen. Ervaring leert dat het verkeersbeeld op een woensdag en vrijdag significant rustiger is dan op een dinsdag of donderdag. Onderstaande casus laat zien wat dit voor financi\u00eble consequenties met zich meebrengt. Onze DBO-aannemer heeft in de gehele maand december maaiwerkzaamheden ingepland in de Hoeksche-Waard. De werkzaamheden worden uitgevoerd conform een halve rijbaanafzetting (fig 1323b). De oude WBU-tabel geeft aan dat de WBU tussen 09:00 uur en 15:00 uur is. De te maken webapplicatie geeft aan dat op maandag, woensdag en vrijdag er gewerkt kan worden van 09:00 uur tot en met 16:00 uur. Dit houdt in dat de aannemer 3 uur extra per week kan werken. Dit is dus 12 uur extra per maand. Doordat de aannemer 12 uur extra werktijd heeft, hoeft hij minder vaak de weg op. Ervan uitgaande dat de werkzaamheden worden uitgevoerd middels een voorwaarschuwingswagen, actiewagen en eindewagen scheelt dit de huur en operationele kosten van drie werkvoertuigen en drie chauffeurs. Dit kan geldbesparing met zich meebrengen. Dit is slechts een voorbeeld van \u00e9\u00e9n aannemer die aan het werk is. Jaarlijks worden er circa 2400 TVM aanvragen ingediend. Door het toepassen van de WBU-applicatie kan waarschijnlijk bij een groot gedeelte van deze aanvragen effici\u00ebnter gewerkt worden en kunnen kosten worden bespaard. \nHet is aannemelijk, dat dankzij de WBU-webapplicatie het verkeer minder vaak in de file staat. Hierdoor worden ook maatschappelijke kosten bespaard in de vorm van minder voertuigverliesuren. ", - "impact": "Met het algoritme is er minder hinder voor weggebruikers. Daarnaast wordt de verkeersveiligheid verhoogd.", - "proportionality": "Veiligheid wordt verhoogd, omdat er voldaan wordt aan de richtlijn CROW96B.\nEr is minder file en minder voertuigverliesuren.", - "decision_making_process": "Het algoritme geeft een advies/voorspelling. Maar er wordt wel rekening gehouden met de geldende richtlijnen van CROW 96B en APV (algemeen plaatselijke verordeningen) vastgelegd. En de voorwaarden van Melvin(Melden van verstoringen van Infrastructuur in Nederland). ", - "documentation": "Richtlijn TVM (inclusief huidige WBU-tabel)\u00a0\u00a0\nhttps://www.zuid-holland.nl/onderwerpen/verkeer-vervoer/tijdelijke/melvin/\u00a0\u00a0\n\nOnderzoek WBU Frank de Winter 2018 (LET OP: rapport is niet openbaar)\u00a0\nhttp://idms/otcs/llisapi.dll/link/656243217\u00a0\u00a0", - "competent_authority": "Provincie Zuid-Holland", - "lawful_basis": "Het algoritme geeft een advies/voorspelling. Maar er wordt wel rekening gehouden met de geldende richtlijnen van CROW 96B en APV (algemeen plaatselijke verordeningen) vastgelegd. En de voorwaarden van Melvin(Melden van verstoringen van Infrastructuur in Nederland). ", - "iama": null, - "iama_description": null, - "dpia": "Geen persoonsgegevens, ook niks bekend over de voertuigen of kentekens.", - "dpia_description": "Geen persoonsgegevens, ook niks bekend over de voertuigen of kentekens.", - "objection_procedure": "Voor vragen en opmerkingen kan je terecht bij: digitaalzuidholland@pzh.nl.\nWil je bezwaar maken, dan kan je terecht bij de Juridische afdeling van dienst beheer organisatie. https://www.zuid-holland.nl/contact/", - "standard_version": "0.1.0", - "uuid": "Niet bekend.", - "url": "Niet bekend.", - "contact_email": "Voor vragen en opmerkingen kan je terecht bij: digitaalzuidholland@pzh.nl.\nWil je bezwaar maken, dan kan je terecht bij de Juridische afdeling van dienst beheer organisatie. https://www.zuid-holland.nl/contact/", - "area": "Provincie Zuid-Holland", - "lang": "Nederlands", - "revision_date": "Jaarlijks onderhoud beheer gaat via afdeling I&A", - "description": "In de provincie Zuid-Holland wordt gebruik gemaakt van een werkbare urentabel (WBU-tabel). In deze WBU-tabel staat aangegeven binnen welke tijdvensters welke verkeersbeperkende maatregelen mogen worden genomen door aannemers, ten behoeve van het plegen van onderhoud aan de Provinciale wegen.\nDeze tabel is gebaseerd op kennis en ervaring van de toezichthouders en verkeersmanagers. Het is niet cijfermatig onderbouwd. De WBU-tabel is nu niet gebaseerd op de actuele verkeerssituaties. Het gevolg kan zijn dat er onnodig streng wordt gestuurd (bijv. alleen \u2019s nachts werken), terwijl op een aantal wegen tijdens een ruimere periode gewerkt kan worden. Dit kan schelen in de operationele kosten. \nUitgangspunt moet zijn: meten is weten. We meten op basis van de feitelijke drukte op straat en de verwachtte veroorzaakte hinder. Het cijfermatig onderbouwen van de tabel helpt ons, om het gesprek te voeren met stakeholders. \nDaarnaast wordt er nu in de WBU geen onderscheid gemaakt in de verschillende type verkeersmaatregelen die toegepast kunnen worden. Dit houdt in dat er verkeersmaatregelen op de weg kunnen komen, waar conform de verkeersdrukte en de richtlijnen vanuit de CROW dit feitelijk niet is toegestaan. Hierdoor kunnen verkeersonveilige situaties ontstaan.\nEr is een professionaliseringslag nodig, die ervoor zorgt dat de WBU-tabel cijfermatig wordt onderbouwd. Door het cijfermatig onderbouwen van onze WBU kunnen wij transparant richting stakeholders aangeven waarom op bepaalde tijdstippen verkeersbeperkende maatregelen mogen worden getroffen. Hiermee kunnen wij werken aan de effici\u00ebntie en de verkeersveiligheid verhogen.", - "application_url": "https://c6ae6fa2db7da44c79581d7e.azurewebsites.net/", - "publiccode": "Is er nog niet (nov, 2022)", - "mprd": "Gebaseerd op data van de NDW, openbare data en gebasseerd op het SWUNG 2 model.", - "source_data": "\u2022Lusdata (hoe hard verkeer rijdt, hoe lang een voertuig is, om onderscheid te maken tussen vrachtwagen en persoonsauto\u2019s; intensiteiten) \n\u2022Informatietrajecten met hoeveel rijstroken en maximale snelheid \n\u2022Planningsdata in Melvin\n\u2022SWUNG 2 model\n\u2022Floating car data", - "methods_and_models": "Werking van het model nu:\nWe geven aan:\n\u2022Welke N-weg het betreft\n\u2022We geven het start en eindpunt aan in hectometrering\n\u2022het type verkeersmaatregel aan (wisselstrook met doorgangsregeling) \n\u2022de datum in op komende maandag\n\nWe krijgen terug:\n\u2022Een overzicht van de tijdsvakken (per half uur), met daarbij per tijdvak een rood/groen score op werkbare uren voor de hele week \n\u2022Het historisch profiel is bepalend voor de score van de tijdvakken\n\u2022Het historisch profiel per tijdvak wordt berekend op basis van dezelfde tijd en weekdag, van de afgelopen weken (groeiende historie sinds juni 2021)", - "monitoring": "De webapplicatie wordt getest aan de hand van eigen bevindingen en tellingen.", - "human_intervention": "Op dit moment testen wij de applicatie uit. We kijken of deze overeenkomt met onze eigen bevindingen en die van de weginspecteurs. Op deze manier proberen wij eventuele bugs uit de tool te filteren. ", - "risks": "De volgende risico\u2019s zijn ge\u00efnventariseerd. \n\n\u2022Data van de verkeerslussen is niet dekkend voor het gehele wegennet van de provincie \n> stand van zaken nov 2021: GEEN RISICO. \n\nIn eerste instantie was niet zeker of er voldoende data beschikbaar zou zijn om de verkeersintensiteiten op alle provinciale wegen te kunnen voorspellen. Op basis van de NDW-data en de gegevens vanuit het SWUNG2 model kan echter per 100 meter wegvak de verkeersintensiteit worden voorspeld. De methodes hierachter, zijn gebaseerd op de methodes vanuit het geluid- en luchtberekeningsmodel en dus reeds bewezen. \n\n\u2022Rekenregels vanuit de CROW kunnen niet worden toegepast \n> stand van zaken nov 2021: GEEN RISICO \n\nBinnen de provincie Zuid-Holland wordt voor het dagelijks beheer en onderhoud gebruik gemaakt van vijf verschillende afzettingen. Op basis van de methodes uit de CROW96b kan relatief eenvoudig aan de hand van de verkeersintensiteiten worden bepaald wanneer welke afzetting kan worden toegepast. Aandachtspunt is dat we deze methodes nog goed moeten worden gespiegeld aan de huidige WBU. \n\n\u2022Problemen tijdens verder softwareontwikkeling \n> stand van zaken nov 2021: KLEIN RISICO \n\n Risico\u2019s worden bijgehouden en gemonitord in de voortgangsrapportages.", - "performance_standard": "Resultaten:\n- Een overzicht van de tijdsvakken (per half uur), met daarbij per tijdvak een rood/groen score op werkbare uren voor de hele week\u00a0\u200b\n- Het historisch profiel is bepalend voor de score van de tijdvakken\u200b\n- Het historisch profiel per tijdvak wordt berekend op basis van dezelfde tijd en weekdag, van de afgelopen weken (groeiende historie sinds juni 2021)\u200b", - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.566027+00:00", - "lars": "18747788", - "owner": "provincie-zuid-holland" - }, - { - "name": "Remote Sensing gebiedsclassificatie op basis van AI beeldherkenning", - "organization": "Provincie Zuid-Holland", - "department": "Afdeling Informatisering en Automatisering & Water en Groen", - "description_short": "Op basis van beeldherkenning van satellietbeelden en analyses worden veranderingen in natura2000 gebieden inzichtelijk gemaakt en gedetailleerd in kaart gebracht. Dit doen we voor ecologische doeleinden (stikstofbeleid).", - "type": "Diagnostisch (vaststellen van aanwezigheid van plantsoorten)", - "category": "Natuur, vegetatieverandering onder andere door stikstof en uitlaatgassen CO2", - "website": "https://github.com/Provincie-Zuid-Holland/satellite_images_nso_extractor\nhttps://github.com/Provincie-Zuid-Holland/satellite-images-nso-datascience\nhttps://github.com/Provincie-Zuid-Holland/satellite_images_nso_tif_model_iterator\nhttps://github.com/Provincie-Zuid-Holland/vdwh_ahn_processing", - "status": "Twee natuurgebieden zijn in gebruik (pilot). Het algoritme bestaat, maar wordt nog niet in gebruik genomen door ecologen. ", - "goal": "De biodiversiteit van de leefomgeving is lager dan gewenst. Overheidsinstanties hebben de taak om dit te verbeteren. Op basis van beeldherkenning worden veranderingen in natura2000 gebieden inzichtelijk gemaakt en gedetailleerd in kaart gebracht. Dit doen we voor de habitatkwaliteit. Op deze manier kunnen planten- en diersoorten worden herkend, zoals insecten. Op die manier kunnen we de verspreiding van exoten en indicatorsoorten in kaart brengen. Ook kunnen we op basis hiervan herstelmaatregelen nemen tegen stikstof. Binnen natuurgebieden heb je bepaalde natuur die gevoelig is voor stikstof. Als er teveel stikstof op neer komt dan gaan ze achteruit. Een voorbeeld is het herkennen van vergrassing. Als daar stikstof op neerkomt kunnen er planten, zoals bijvoorbeeld brandnetelgrassen groeien. Dit wil je bij duinen voorkomen. ", - "impact": "De resolutie van de beelden is 50 centimeter rauwe data van NSO, met aggregaties. De ecoloog krijgt 3-4 meter te zien. Er is geen impact op mensen, want zij zijn niet te herkennen op de satellietbeelden (afhankelijk van privacy check NSO). \n\nHoogtedata van Nederland. Actueel Hoogtebestand Nederland (AHN) radarsysteem door de Nederlandse Overheid met Lidar (https://www.ahn.nl/).", - "proportionality": "Open en heldere communicatie (transparantie) over de inzet van het gebruik van satellietbeelden is belangrijk voor de acceptatie door inwoners en het vertrouwen dat mensen hebben in (het inzetten van) de technologie. Het is puur voor de natuur en stikstofbeleid.", - "decision_making_process": "Besluitvormingsproces stikstofbeleid (verandering in vegetatie Natura2000) en gebruik door ecologen binnen de provincie.", - "documentation": "https://github.com/Provincie-Zuid-Holland/satellite_images_nso_extractor", - "competent_authority": "Afdeling Water en Groen", - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": "Nee, want er is geen sprake van persoonsgegevens.", - "dpia_description": null, - "objection_procedure": "Voor vragen en opmerkingen kan je terecht bij: digitaalzuidholland@pzh.nl.\nWil je bezwaar maken, dan kan je terecht bij de Juridische afdeling van dienst beheer organisatie. https://www.zuid-holland.nl/contact/", - "standard_version": "0.1.0", - "uuid": "Niet van toepassing", - "url": "NSO en AHN, Scikit", - "contact_email": "Voor vragen en opmerkingen kan je terecht bij: digitaalzuidholland@pzh.nl.\nWil je bezwaar maken, dan kan je terecht bij de Juridische afdeling van dienst beheer organisatie. https://www.zuid-holland.nl/contact/", - "area": "Provincie Zuid-Holland", - "lang": "Nederlands", - "revision_date": "Mogelijk 2023", - "description": "Het algoritme classificeert vegetatiestructuur van Natura 2000 gebieden, gebaseerd op gemodelleerde satellietbeeld- herkenning.\nProvincie Zuid-Holland wordt door verschillende sensoren (beeld, LIDAR, IR, multispectraal, microgolf, etc) gemeten. Dit gebeurt vanuit satellieten, vliegtuigen en helikopters. Een groot deel van de data is gratis beschikbaar. Het benutten van dergelijke vlakdekkende meetreeksen kan een grote impuls geven aan het monitoren van natuurgebieden. \nHet interpreteren van remote sensing-data tot ecologisch relevante inzichten kan een belangrijke bouwsteen zijn van een digital twin natuur. Deze meetreeksen kunnen het \u2018skelet\u2019 of raamwerk bieden waarop de digital twin verder kan worden opgebouwd. Drone-beelden bieden in combinatie met soortherkenning een tool om zeer hoge resolutie-data te verkrijgen. \nHet verhoogt de dekking en het zorgt voor een grotere actualisatie voor de provincie. ", - "application_url": "https://pzh.maps.arcgis.com/apps/dashboards/478920c4012042b0a17b42e353345aba", - "publiccode": null, - "mprd": "Nee.", - "source_data": "Deze dataset bevat momentopnames van geautomatiseerd gegenereerde vegetatiestructuur-classificaties van de Natura 2000 gebieden, op basis van SuperView Netherlands Space Office (NSO) satellietbeelden. De beelden worden elke \u00e9\u00e9n tot vier maanden beschikbaar gesteld door het NSO en middels een modelberekening gesegmenteerd tot vegetatiestructuur-klassen. De geanalyseerde beelden gaan terug tot 2019. De data wordt gevisualiseerd in een ArcGIS Operations Dashboard waarin alle gesegmenteerde momentopnames met elkaar te vergelijken zijn. Ook bevat het dataset Lidar van Actueel Hoogtebestand Nederland (AHN)", - "methods_and_models": "Scikit learn: pakket modellen open source binnen Python. Random forest voor het herkennen van vegetatie structuren. https://scikit-learn.org/stable/", - "monitoring": "Nog niet in gebruik, dus wordt nog niet gemonitord. ", - "human_intervention": "Ja door de ecologen.", - "risks": "Het model is 85-90% waterdicht. Er is menselijke tussenkomst (ecoloog) nodig, om zaken te controleren. Ook is het goed om aanvullend naar dronebeelden te kijken. ", - "performance_standard": "Het beoogd resultaat is een simpel structuurmodel (zand, gras, bos) uitrollen naar andere N2000-gebieden (in aanvulling op duingebieden 3A) over hele provincie. \nDe accuratie is 85% van beeldherkenning met F1 score.", - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-03-31 08:34:12.571270+00:00", - "lars": "87239212", - "owner": "provincie-zuid-holland" - }, - { - "name": "Kentekenplaatherkenning autoluwe binnenstad", - "organization": "Gemeente Amersfoort", - "department": "Stad en Ontwikkeling", - "description_short": "De camera's detecteren en lezen d.m.v. Optical Character Recognizing-techniek kentekenplaten van voertuigen die de binnenstad van Amersfoort inrijden.", - "type": "Zelflerend", - "category": "Fysiek domein", - "website": "Nog niet beschikbaar", - "status": "In gebruik", - "goal": "De camera's, en daarmee het algoritme, worden ingezet t.b.v. het handhaven van de geslotenverklaring van de binnenstad voor voertuigen.", - "impact": "De impact van het algoritme op de burger is laag. Enkel het lezen van de kentekenplaat wordt door het algoritme uitgevoerd. Vermeende overtreders worden door een BOA handmatig gecheckt of er is sprake is van een strafbare gedraging waarbij de BOA ook de kentekenplaat zelf nog controleert op camerabeelden. ", - "proportionality": "Het 24 uur per dag gebruik maken van mensen en analoge middelen is vanuit capaciteit gezien niet haalbaar, en een foto van een overtreding vormt een sluitend bewijs. Vermeende overtreders worden door een BOA handmatig gecheckt of er sprake is van een strafbare gedraging. ", - "decision_making_process": null, - "documentation": null, - "competent_authority": null, - "lawful_basis": "Wegenverkeerswet, Verkeersbesluit gemeenteraad, Beleidskader Geslotenverklaringen en Voetgangersgebieden", - "iama": "Nee", - "iama_description": "Niet beschikbaar", - "dpia": "Ja", - "dpia_description": null, - "objection_procedure": "Bezwaar maken conform de Algemene wet bestuursrecht", - "standard_version": "0.3.1", - "uuid": null, - "url": "Nog niet beschikbaar", - "contact_email": "Nog niet beschikbaar ", - "area": "Binnenstad van Amersfoort ", - "lang": "NLD", - "revision_date": null, - "description": null, - "application_url": "https://www.brickyard.eu/camerahandhaving", - "publiccode": null, - "mprd": null, - "source_data": "Kentekenplaten van voertuigen", - "methods_and_models": "Neural network", - "monitoring": "Nog niet beschikbaar", - "human_intervention": "Een BOA constateert of een vermeende overtreder een strafbare gedraging heeft begaan. ", - "risks": null, - "performance_standard": null, - "provider": "Brickyard B.V. ", - "process_index_url": "https://www.amersfoort.nl/register-van-verwerkingen-amersfoort", - "tags": "Objectherkenning", - "source_id": "Nog niet beschikbaar", - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-04-26 08:02:54.705668+00:00", - "lars": "77953126", - "owner": "gemeente-amersfoort" - }, - { - "name": "Anonimiseringstool", - "organization": "Gemeente Amersfoort", - "department": "Informatievoorziening", - "description_short": "Het algoritme herkent en anonimiseert o.a. (persoons)gegevens en vertrouwelijke financi\u00eble gegevens in documenten voordat deze gepubliceerd worden.", - "type": "Zelflerend", - "category": "Bedrijfsvoering", - "website": "Nog niet beschikbaar", - "status": "In ontwikkeling", - "goal": "De anonimiseringssoftware wordt ingezet om invulling te geven aan enerzijds transparantie en anderzijds aan de noodzakelijke bescherming van de personen en bedrijven op wie documenten betrekking hebben.", - "impact": "De impact van het algoritme op de burger is laag. Het algoritme zoekt specifiek naar (persoons)gegevens en vertrouwelijke bedrijfsgegevens en maskeert deze ongeacht de verdere inhoud van documenten.", - "proportionality": "Het gebruik van anonimiseringssoftware zorgt voor een versnelling en vereenvoudiging van het proces voor actieve en passieve openbaarmaking. Het geautomatiseerd anonimiseren is tevens minder foutgevoelig dan menselijk handelen. Daardoor is de kans op een datalek kleiner en zijn de gegevens van burgers en bedrijven beter beschermd.", - "decision_making_process": null, - "documentation": null, - "competent_authority": null, - "lawful_basis": "Wet open overheid en AVG", - "iama": "Nee", - "iama_description": "Niet beschikbaar", - "dpia": "Nee", - "dpia_description": null, - "objection_procedure": "Bezwaar maken conform de Algemene wet bestuursrecht ", - "standard_version": "0.3.1", - "uuid": null, - "url": "Nog niet beschikbaar", - "contact_email": "Nog niet beschikbaar", - "area": null, - "lang": "NLD", - "revision_date": null, - "description": null, - "application_url": "https://www.datamask.nl/", - "publiccode": null, - "mprd": null, - "source_data": "Database voor black- en whitelisting", - "methods_and_models": "Natural Language Processing en Named Entity Recognition", - "monitoring": "Nog niet beschikbaar", - "human_intervention": "De door middel van de software geanonimiseerde documenten kunnen na afloop gecontroleerd worden door een medewerker. Het algoritme zelf wordt periodiek hertraind.", - "risks": null, - "performance_standard": null, - "provider": "Data Mask B.V.", - "process_index_url": "https://www.amersfoort.nl/register-van-verwerkingen-amersfoort", - "tags": "tekstanalyse, naamherkenning", - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-04-26 13:57:08.531237+00:00", - "lars": "36779938", - "owner": "gemeente-amersfoort" - }, - { - "name": "Signaalmodel erfbelasting (UDA-Erf)", - "organization": "Belastingdienst", - "department": "-", - "description_short": "Het algoritme \u2018Uitnodiging tot het Doen van Aangifte Erfbelasting (UDA-Erf)\u2019 helpt medewerkers van de Belastingdienst om vast te stellen of erfgenamen belastingplichtig zijn voor de erfbelasting.", - "type": "Regelgebaseerd", - "category": "Erfbelasting", - "website": "https://over-ons.belastingdienst.nl/onderwerpen/omgaan-met-gegevens/algoritmeregister/", - "status": "In gebruik", - "goal": "Doel van het algoritme is om de behandelaar bij de Belastingdienst te ondersteunen met een advies, zodat de juiste personen/erfgenamen een uitnodiging tot het doen van aangifte erfbelasting krijgen. ", - "impact": "De juiste personen/erfgenamen krijgen een uitnodiging tot het doen van aangifte voor de Erfbelasting.", - "proportionality": "Het kost veel tijd om de situatie van alle personen die jaarlijks overlijden en hun erfgenamen handmatig te controleren. De Belastingdienst wordt sinds 2020 ondersteund door een algoritme bij het beoordelen of erfgenamen mogelijk belastingplichtig zijn. Het proces erfbelasting is met het gebruik van het algoritme effectiever geworden; medewerkers van de Belastingdienst worden nu gerichter ingezet in het proces waarin erfgenamen worden uitgenodigd om aangifte erfbelasting te doen. ", - "decision_making_process": null, - "documentation": null, - "competent_authority": null, - "lawful_basis": "https://wetten.overheid.nl/BWBR0002320/\nhttps://wetten.overheid.nl/BWBR0002226/", - "iama": "Nee", - "iama_description": "n.v.t.", - "dpia": null, - "dpia_description": null, - "objection_procedure": "https://www.belastingdienst.nl/bezwaar", - "standard_version": "0.3.1", - "uuid": null, - "url": "https://over-ons.belastingdienst.nl/onderwerpen/omgaan-met-gegevens/signaalmodel-erfbelasting/", - "contact_email": "algoritmeregister@belastingdienst.nl", - "area": "Nederland", - "lang": "NLD", - "revision_date": null, - "description": "Het algoritme verdeelt de situatie na overlijden in 3 groepen met de volgende mogelijke adviezen voor de behandelaar: verzenden 'Beoordelen Aangiftebrief', handmatig beoordelen, en uitnodigen tot het doen van aangifte.", - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": "Aangiftegegevens vennootschapsbelasting, Aangiftegegevens inkomensheffing, Persoonsgegevens relaties, Loongegevens, Banksaldi, Voertuiggegevens, Vastgoedgegevens", - "methods_and_models": "Het algoritme bestaat uit een statistisch model en een model gebaseerd op bedrijfsregels (bedrijfsregelmodel). Het statistische model bepaalt de kans op een belastingplicht met de beschikbare gegevens. Dit model is getraind met zaken die voorheen handmatig werden beoordeeld. Het bedrijfsregelmodel beoordeelt de situatie van de overleden persoon via vooraf vastgestelde regels.", - "monitoring": "Het algoritme is bij de Belastingdienst zelf ontwikkeld en wordt ook intern onderhouden. Regelmatig controleert het team dat het algoritme gemaakt heeft, in samenwerking met de belastinginspecteur, of het statistisch model nog steeds voldoende kwaliteit levert. Hiervoor is een dashboard/overzicht ontwikkeld waarin wordt bijgehouden hoe vaak de behandelaar een beslissing neemt die anders is dan het advies.", - "human_intervention": "De beslissing om iemand uit te nodigen om aangifte erfbelasting te doen, wordt altijd door de behandelaar genomen. Dus niet door het algoritme. ", - "risks": "Voor de ontwikkeling van algoritmes zijn door de Belastingdienst voorwaarden opgesteld, een kwaliteitsframework. Hierin staan regels en afspraken die zijn gevolgd bij de ontwikkeling van het algoritme. De voorwaarden van de Auditdienst Rijk (ADR) zijn hierbij leidend. Bij wijzigingen in het product controleert de Belastingdienst of het algoritme nog steeds aan de kwaliteitseisen voldoet. In de Successiewet is vastgelegd dat nationaliteit gebruikt wordt bij het vaststellen van de aangifteplicht als de overledene woonachtig was in het buitenland. Om het risico op profilering zo klein mogelijk te maken, wordt een zogenoemde indicator gebruikt. Ook de leeftijd van de langstlevende partner is nodig om het recht op de opbrengst van het vermogen (vruchtgebruik) te berekenen. De Belastingdienst is terughoudend bij het gebruik van het persoonsgegeven \u2018leeftijd\u2019 vanwege het risico op profilering. Daarom wordt er gewerkt met leeftijdsgroepen. De precieze leeftijden van de langstlevende partner is daardoor niet te herleiden.", - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-06-02 11:26:25.617966+00:00", - "lars": "11443230", - "owner": "belastingdienst" - }, - { - "name": "Snelle ID lijn", - "organization": "Nederlands Forensisch Instituut", - "department": null, - "description_short": "Het proces omvat het analyseren van een DNA-profiel uit een aangeleverd spoor en een vergelijking van het DNA-profiel met het DNA-profiel van personen binnen de zaak of met profielen in de DNA-databank.", - "type": "Ja", - "category": "{\"Openbare orde en veiligheid\"}", - "website": "https://www.forensischinstituut.nl/over-het-nfi/algoritmeregister", - "status": "In gebruik", - "goal": "Politie en OM ontvangen de gegevens en combineren die met andere informatie uit de strafzaak. De voortgang in de opsporing van strafbare feiten. ", - "impact": null, - "proportionality": "Het snelle ID-lijn proces wordt in de strafrechtketen toegepast en door de automatisering van het proces wordt het opsporen van strafbare feiten versneld. Het proces is bevorderlijk voor een effici\u00ebnte en behoorlijke strafrechtspleging. Het gehele proces wordt door menselijke tussenkomst gemonitord.", - "decision_making_process": null, - "documentation": null, - "competent_authority": null, - "lawful_basis": "Wetboek van Strafvordering", - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.4.0", - "uuid": null, - "url": "verwijzing naar linkhttps://www.forensischinstituut.nl/over-het-nfi/algoritmeregister", - "contact_email": "Als u vragen heeft over de toepassing van dit algoritme, of over algoritmen in het algemeen, neem dan contact op met het NFI via het algemene contactformulier. https://www.forensischinstituut.nl/contact-2", - "area": null, - "lang": "NLD", - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": "DNA profiel uit een aangeleverd spoor en DNA profiel uit de DNA databank", - "methods_and_models": null, - "monitoring": null, - "human_intervention": "Het gehele proces wordt uit door menselijke tussenkomst gemonitord zodat een zorgvuldig verloop van het proces en kwaliteit is geborgd.", - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": " algoritme, snelle ID lijn, Nederlands Forensisch Instituut, strafrecht, opsporing, DNA, profiel", - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": "https://wetten.overheid.nl/BWBR0001903", - "impacttoetsen": "{\"Data Protection Impact Asssesment (DPIA)\"}", - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-06-14 14:54:47.048816+00:00", - "lars": "54986363", - "owner": "nederlands-forensisch-instituut" - }, - { - "name": "Algoritme verwachte inkomsten en uitgaven Justitie en Veiligheid", - "organization": "Ministerie van Justitie en Veiligheid", - "department": null, - "description_short": "De Directie Financieel-Economische Zaken beheert de financi\u00ebn van het ministerie van Justitie en Veiligheid (JenV). Zij heeft daarvoor een goed beeld nodig van de uitgaven en inkomsten. Het algoritme \u2018vermoedelijk beloop\u2019 voorspelt deze.", - "type": "Nee", - "category": "{Financi\u00ebn}", - "website": null, - "status": "In gebruik", - "goal": "Het algoritme wordt gebruikt om een goed beeld te krijgen van de verwachten inkomsten en uitgaven en waar nodig hierop te sturen. Het algoritme gebruikt geen persoonsgegevens. Het algoritme gebruikt alleen gegevens uit de financi\u00eble administratie van het ministerie. JenV controleert het algoritme regelmatig op juistheid en volledigheid, door bijvoorbeeld te controleren of alle uitgaven zijn meegenomen. Daarnaast bekijkt JenV ieder jaar welke versie van het algoritme het beste voorspelt voor een organisatieonderdeel. Vervolgens gebruikt Jen-V dit model voor dat jaar.", - "impact": null, - "proportionality": "Het algoritme wordt gebruikt om een goed beeld te krijgen van de verwachten inkomsten en uitgaven en waar nodig hierop te sturen. Het algoritme voorspelt de verwachte inkomsten en uitgaven (het vermoedelijk beloop) van het ministerie. De inkomsten en uitgaven voorspellen zonder algoritmen kost veel tijd.", - "decision_making_process": null, - "documentation": null, - "competent_authority": null, - "lawful_basis": "Directie Financieel-Economische Zaken (DFEZ) is verantwoordelijk voor het financieel beheer van het hele ministerie van Justitie en Veiligheid (artikel 4.1d en artikel 4.1f van het besluit FEZ van het Rijk).", - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.4.0", - "uuid": null, - "url": null, - "contact_email": "algoritmeregister.fez@minjenv.nl", - "area": null, - "lang": "nld", - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": "Voor het maken van de voorspelling worden alleen de realisatiecijfers van de afgelopen 5 jaar gebruikt, inclusief kostenplaats en kostensoort. Er worden geen persoonsgegevens gebruikt bij dit algoritme.", - "methods_and_models": "Voor het voorspellen van het vermoedelijk beloop gebruiken we twee voorspellingsalgoritmen: Arima en ETS. Beide zijn tijdserie-algoritmen. Dit houdt in dat er op basis van het verleden een voorspelling wordt gemaakt. In deze gevallen bestaat het verleden uit de realisatie van de afgelopen vijf jaar. Beide algoritmen analyseren de realisaties op kostenplaats- en kostensoortniveau van voorgaande jaren en proberen hier patronen in te herkennen. Deze patronen worden gebruikt om realisaties op diezelfde kostenplaatsen en kostensoorten te voorspellen voor het lopende jaar. Per kostenplaats kan het uitgavepatroon erg verschillen. Bij het ene patroon werkt Arima beter en bij het andere werkt ETS beter. Om te bepalen welk voorspellingsalgoritme de beste voorspelling levert, draaien we aan het begin van een nieuw kalenderjaar het algoritme een keer over het afgelopen jaar. Op deze manier wordt steeds het beste model gebruikt, passend bij het patroon. Op het moment dat bepaald is welk voorspellingsalgoritme gebruikt gaat worden per kostenplaats, kan het nieuwe jaar voorspeld worden.", - "monitoring": null, - "human_intervention": " Er is geen automatische besluitvorming. Medewerkers kunnen op een dashboard de resultaten van het algoritme bekijken en deze als input gebruiken bij de uitvoer van hun reguliere werkzaamheden. . Bijvoorbeeld door bij te sturen op de verwachte inkomsten en uitgaven. Het dashboard toont mogelijke grote verschillen tussen de voorspelde en daadwerkelijke inkomsten en uitgaven. Het dashboard geeft aan dat het voorspellingen zijn, en wat het verschil is tussen de voorspelde en werkelijke inkomsten en uitgaven. Ook staat op het dashboard welke uitgaven (kostensoorten) het vorige jaar lastig te voorspellen waren.", - "risks": "JenV controleert het algoritme regelmatig op juistheid en volledigheid, door bijvoorbeeld te controleren of alle uitgaven zijn meegenomen. Daarnaast bekijkt JenV ieder jaar welke versie van het algoritme het beste voorspelt voor een organisatieonderdeel. Vervolgens gebruikt JenV dit model voor dat jaar.", - "performance_standard": null, - "provider": "Zelf ontwikkeld", - "process_index_url": null, - "tags": "jaar verantwoording, vermoedelijk beloop", - "source_id": null, - "begin_date": "03-2022", - "end_date": null, - "lawful_basis_link": "https://wetten.overheid.nl/BWBR0041910", - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-06-13 15:04:21.710432+00:00", - "lars": "62316183", - "owner": "ministerie-jenv" - }, - { - "name": "Algoritme boete en transactieraming Justitie en Veiligheid", - "organization": "Ministerie van Justitie en Veiligheid", - "department": null, - "description_short": "Het algoritme voorspelt hoeveel verkeersboetes de politie in een jaar uitschrijft en hoeveel het ministerie van Justitie en Veiligheid daarvan int. Daardoor weet het ministerie hoeveel personeel nodig is en hoe hoog de inkomsten uit boetes zijn.", - "type": "Nee", - "category": "{Financi\u00ebn}", - "website": null, - "status": "In gebruik", - "goal": "Het algoritme helpt om met minder medewerkers betere inschattingen te maken. Voorspellingen weken voorheen sterk af van de echte aantallen. En het kostte veel tijd om na te gaan waar de verschillen door kwamen.\nHet algoritme gebruikt geen persoonsgegevens. In de gegevens staat het aantal boetes per overtreding (feitcode) en de plaats van overtreding (pleeglocatie). JenV controleert de juistheid en volledigheid van het algoritme. Bijvoorbeeld door te controleren of de gebruikte cijfers voor het aantal boetes overeenkomt met het aantal boetes dat binnen komen. Jaarlijks bepaalt JenV welke versie van het algoritme het gebruikt per handhavingsmiddel (bijvoorbeeld flitspalen, trajectcontroles of staande houding) en of ze deze moeten aanpassen aan nieuw beleid.\n", - "impact": null, - "proportionality": "Het algoritme helpt om met minder medewerkers betere inschattingen te maken. Voorspellingen weken voorheen sterk af van de echte aantallen. En het kostte veel tijd om na te gaan waar de verschillen door kwamen.", - "decision_making_process": null, - "documentation": null, - "competent_authority": null, - "lawful_basis": "De Directie Financieel-Economische Zaken (DFEZ) is verantwoordelijk voor het financieel beheer van het hele ministerie van justitie en veiligheid (artikel 4.1d en artikel 4.1f van het besluit FEZ van het Rijk).", - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.4.0", - "uuid": null, - "url": null, - "contact_email": "algoritmeregister.fez@minjenv.nl", - "area": null, - "lang": "nld", - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": "Er worden geen persoonsgegevens gebruikt bij dit algoritme. Er is gebruik gemaakt van de maandelijks door het CJIB verstrekte rapportages met daarin het aantal uitgeschreven boetes per handhavingsmiddel en instantie van de afgelopen 5 jaar. ", - "methods_and_models": "Voor het voorspellen van de boetes en transacties worden een aantal modellen gebruikt: Het gemiddelde, vorig jaar en twee tijdserie- algoritmen (ETS en Arima). Eerst wordt bepaald welk model gebruikt gaat worden. Voor het bepalen van het te gebruiken model worden de verschillende modellen gedraaid over een volledig jaar waarvoor de realisatiecijfers bekend zijn. Het model met de kleinste afwijking wordt uiteindelijk gekozen. Om de raming uiteindelijk op te stellen is het uiteindelijk geselecteerde model toegepast over de gehele dataset (inclusief de eerder gebruikte evaluatieperiode). Het resultaat van deze raming is de zogenoemde beleidsneutrale raming. Hier worden dan, op basis van beleidswijzigingen, nog een aantal bewerkingen op gedaan. Daarnaast wordt er een vertaalslag gemaakt naar inkomsten, wat gebeurt op basis van een gemiddeld boetebedrag. Dit bedrag wordt vervolgens bijgesteld op basis van vastgestelde indexering.", - "monitoring": null, - "human_intervention": "Er is geen automatische besluitvorming. Medewerkers kunnen de resultaten bekijken en op basis hiervan besluiten nemen. Bijvoorbeeld de verwachte uitgaven aanpassen of meer personeel inzetten.\u00a0Het algoritme levert Excelbestanden waarin staat dat het om een voorspelling gaat. ", - "risks": "Het algoritme gebruikt geen persoonsgegevens. In de gegevens staat het aantal boetes per overtreding (feitcode) en de plaats van overtreding (pleeglocatie). JenV controleert de juistheid en volledigheid van het algoritme. Bijvoorbeeld door te controleren of de gebruikte cijfers voor het aantal boetes overeenkomt met het aantal boetes dat binnen komt voordat het model wordt getraind. Jaarlijks bepaalt JenV welke versie van het algoritme het gebruikt per handhavingsmiddel (bijvoorbeeld flitspalen, trajectcontroles of staande houding) en of ze deze moeten aanpassen aan nieuw beleid.", - "performance_standard": null, - "provider": "Intern ontwikkeld", - "process_index_url": null, - "tags": "boete raming", - "source_id": null, - "begin_date": "01-2021", - "end_date": null, - "lawful_basis_link": "https://wetten.overheid.nl/BWBR0041910", - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-06-13 15:01:57.940217+00:00", - "lars": "37111511", - "owner": "ministerie-jenv" - }, - { - "name": "Profiel (CJIB) Onbestelbaar retour (OBR) (LAA)", - "organization": "Rijksdienst Voor Identiteitsgegevens", - "department": "RvIG, directie Uitvoering, afdeling Onderzoek en Analyse (O&A). Voor de selectie van de gegevens die het Centraal Justitieel Incassobureau (CJIB) aan RvIG levert, is CJIB verantwoordelijk.", - "description_short": "Het OBR-profiel betreft zaken waarbij bij het Centraal Justitieel Incassobureau (CJIB) gerede twijfel is ontstaan aan de juistheid van adresgegevens in de Basisregistratie personen (BRP). Onderdeel van de Landelijke Aanpak Adreskwaliteit (LAA).", - "type": "Regelgebaseerd", - "category": "BRP (Basisregistratie Personen)", - "website": null, - "status": "In gebruik", - "goal": "Het doel van dit algoritme is om potenti\u00eble risicoadressen te selecteren op basis van gerede twijfel en deze aan gemeenten te leveren voor nader adresonderzoek. Op basis van deze adresonderzoeken worden onjuiste adresgegevens gecorrigeerd, zodat overheidsorganen die gebruik maken van gegevens uit de BRP op basis van juiste informatie hun publieke taken kunnen uitvoeren. Daarnaast kan adresonderzoek inzicht bieden in maatschappelijke problematiek, een huisbezoek is h\u00e9t moment waarop schulden of sociale problematiek zichtbaar kan worden. ", - "impact": "Als een onderzoek naar inschrijving van personen op het adres plaats gaat vinden, wordt er huisbezoek op het adres gedaan. De persoonlijke levenssfeer komt mogelijk in het gedrang tijdens een huisbezoek door gemeenten. Gegevens als het gebruik van een naam zijn noodzakelijk voor het adresonderzoek om gezinsverbanden vast te kunnen stellen en om burgers aan te schrijven om hen te informeren over het adresonderzoek.", - "proportionality": "De juistheid van (adres)gegevens in de BRP is essentieel voor het functioneren van de Nederlandse overheid. Een overheid die zijn burgers niet kent of niet weet te vinden, is niet in staat om de taken te verrichten die door de burgers aan haar zijn toevertrouwd. Het is in veel gevallen een randvoorwaarde voor het correct uitvoeren van wettelijke regelingen en voor de effectiviteit van overheidsbeleid. Voor de burger is een juiste registratie van belang voor zijn correspondentie met de overheid en om aanspraak te kunnen maken op adres-gerelateerde overheidsvoorzieningen.\nIn regelgeving is uitdrukkelijk opgenomen welke gegevens mogen worden gebruikt bij het algoritme. Gegevens die niet worden genoemd mogen dus niet worden gebruikt. Ook worden er geen (persoons)gegevens gebruikt die tot discriminatie kunnen leiden. Er wordt niet geselecteerd op nationaliteit, geboorteplaats of afgeleiden daarvan.\nDe inzet van het algoritme is een kosteneffectieve manier om de kwaliteit van de BRP te borgen en te verbeteren. Met behulp van het algoritme kun je prioriteit geven aan adressen waarbij de kans groter dan 50% is dat er iets niet klopt in de registratie en zorg je er tegelijkertijd voor dat je niet onnodig bij burgers aan de deur komt. Er is bij dit algoritme geen sprake van automatische besluitvorming; er is altijd menselijke tussenkomst door de ambtenaar van de gemeente.", - "decision_making_process": null, - "documentation": null, - "competent_authority": null, - "lawful_basis": "De bevoegdheid van de minister tot verwerking van persoonsgegevens noodzakelijk voor de ontwikkeling en het uitzetten van signalen voor adresonderzoek is vastgelegd in artikel 2.37a van de wet basisregistratie persoonsgegevens. \nDe minister van BZK heeft de mogelijkheid om bij ministeri\u00eble regeling (artikel 19a ev.) bestuursorganen en derden aan te wijzen die de mededeling omtrent gerede twijfel over de juistheid van een adresgegeven doen toekomen aan de minister in plaats van aan het college. De minister kan deze terugmeldingen analyseren en uit deze analyse kan een signaal voortkomen dat het vermoeden bestaat dat de registratie van personen op een adres onjuist is. Dit signaal wordt door de minister doorgestuurd naar een college. \nDe informatie uit de terugmeldingen is een belangrijke bron bij de ontwikkeling van signalen. Het besluit BRP, artikel 28b stelt nadere regels over de inhoud van de terugmeldingen van bestuursorganen aan de minister. Bij een terugmelding wordt mededeling gedaan van afwijkingen tussen enerzijds gegevens die zijn verstrekt uit de BRP en anderzijds gegevens waarvan het bestuursorgaan op andere wijze kennis heeft gekregen. Het bestuursorgaan doet hierbij mededeling van de grond van zijn twijfel over de juistheid van het adresgegeven. Bij de grond van twijfel gaat het om gegevens die de terugmelding staven, doordat deze gegevens in onderlinge samenhang iets zeggen over de bewoning op een bepaald adres. In dit geval het feit dat een brief onbestelbaar retour is gekomen. \nIn lagere regelgeving is nader uitgewerkt welke categorie\u00ebn van persoonsgegevens (Besluit artikel 28a ev.) er door de minister verwerkt mogen worden en in de ministeri\u00eble regeling staan de profielen (artikel 19a, tweede lid, bijlage 9a) van aangewezen bestuursorganen beschreven die door de minister op dit moment worden gebruikt. ", - "iama": "Nee", - "iama_description": null, - "dpia": "Ja", - "dpia_description": null, - "objection_procedure": "Inzageverzoek gemeente; bezwaar tegen besluit wijziging BRP", - "standard_version": "0.3.1", - "uuid": null, - "url": null, - "contact_email": "info@rvig.nl", - "area": "Nederland", - "lang": "NLD", - "revision_date": null, - "description": "Het onbestelbaar retour (OBR)-profiel betreft zaken waarbij bij het Centraal Justitieel Incassobureau (CJIB) gerede twijfel is ontstaan aan de juistheid van adresgegevens in de Basisregistratie personen (BRP). Deze twijfel kan ontstaan wanneer post, die door CJIB is verzonden in het kader van de Wet administratiefrechtelijke handhaving verkeersvoorschriften (Wahv), onbestelbaar retour wordt gestuurd. Na ontvangst van het geretourneerde poststuk, verifieert CJIB het adres met het geregistreerde adres in de BRP. Wanneer er inmiddels sprake is van een nieuw adres, ontvangt de betrokkene een nieuwe aanschrijving. Gerede twijfel aan het adresgegeven ontstaat uitsluitend wanneer na verificatie blijkt dat het poststuk is verstuurd naar het adres waarop de aangeschreven persoon nog steeds geregistreerd staat.", - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": "Het model maakt gebruik van een eenvoudige beslisboom. De selectieregels zijn bepaald op basis van analyses en domeinkennis binnen RvIG in samenspraak met gemeenten. Door het CJIB pregeselecteerde gegevens worden in algoritme van RvIG gebruikt als ingangsgegevens. Adressen die door dit algoritme zijn geselecteerd, worden naar gemeenten gestuurd. Gemeenten kunnen per adres beslissen of er een adresonderzoek uitgevoerd moet worden en in welke mate: geen adresonderzoek, alleen een vooronderzoek of een vooronderzoek gevolgd door een huisbezoek.", - "monitoring": "Het algoritme wordt maandelijks ge\u00ebvalueerd door het meten van trefkans na de adresonderzoeken die door gemeenten zijn uitgevoerd. Alle LAA-profielen worden regelmatig ge\u00ebvalueerd met het oog op de vraag of zij nog werken, aangepast moeten worden, of hun effectiviteit hebben verloren en niet meer gebruikt moeten worden. Op die manier wordt getracht de privacy impact op de Nederlandse burger zo klein mogelijk te houden. Een dergelijke evaluatie wordt minimaal \u00e9\u00e9n keer per jaar gedaan in samenwerking met de samenwerkingspartners (gemeenten en afnemers). Tegen een besluit van de gemeente dat leidt tot een aanpassing of wijziging van het adres of een uitschrijving, kan bezwaar worden gemaakt bij de gemeente. Een verzoek tot inzage kan worden gedaan in de bij de RvIG aanwezige persoonsgegevens.", - "human_intervention": "Het profiel wordt regelmatig ge\u00ebvalueerd met het oog van RvIG en gemeenten op de vraag of het nog werkt, aangepast moeten worden of het zijn effectiviteit heeft verloren en niet meer gebruikt moeten worden. Op die manier wordt getracht de privacy impact op de Nederlandse burger zo klein mogelijk te houden.\nEr is geen sprake van automatische besluitvorming. Algoritmes zijn een middel en zijn niet leidend. De beoordeling en beslissingen worden uiteindelijk altijd door mensen gedaan. Voordat de gemeente overgaat tot aanpassing of wijziging van het BRP-adres doet zij altijd nog een eigen adresonderzoek. Van automatische besluitvorming is dan ook geen sprake.\n", - "risks": "De persoonlijke levenssfeer komt mogelijk in het gedrang, door het verwerken van persoonsgegevens en het afleggen van een huisbezoek door gemeenten.", - "performance_standard": "Trefkans is minimaal 50%", - "provider": null, - "process_index_url": null, - "tags": "Landelijke Aanpak Adreskwaliteit, LAA, RvIG, BZK, Kwaliteit BRP, Adresonderzoek, Huisbezoek door gemeente", - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-06-13 11:35:57.913463+00:00", - "lars": "46556266", - "owner": "rijksdienst-voor-identiteitsgegevens" - }, - { - "name": "Automatische sprekervergelijking", - "organization": "Nederlands Forensisch Instituut", - "department": null, - "description_short": "In onderzoek naar strafbare feiten wordt stemmenvergelijking toegepast om erachter te komen of de stem van de verdachte en van de dader dezelfde zijn. Een van de methoden die hiervoor kan worden ingezet, is de automatische sprekervergelijking.", - "type": "Ja", - "category": "{\"Openbare orde en veiligheid\"}", - "website": "https://www.forensischinstituut.nl/over-het-nfi/algoritmeregister", - "status": "In gebruik", - "goal": "Het algoritme ondersteunt de beslissingen die door deskundigen in het sporenonderzoek worden genomen. Het wordt ingezet naast het onderzoek dat alleen door de deskundigen wordt gedaan. Het algoritme wordt ingezet omdat het eindoordeel daar nog objectiever van wordt dan zonder algoritme, omdat van een algoritme goed kan worden gemeten hoe goed het werkt.", - "impact": null, - "proportionality": "Het algoritme zorgt ervoor dat het eindoordeel van de deskundige in het sporenonderzoek objectiever en meetbaar is. Het proces is bevorderlijk voor een effici\u00ebnte en behoorlijke strafrechtspleging.", - "decision_making_process": null, - "documentation": null, - "competent_authority": null, - "lawful_basis": "Wetboek van Strafvordering", - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.4.0", - "uuid": null, - "url": null, - "contact_email": "Als u vragen heeft over de toepassing van dit algoritme, of over algoritmen in het algemeen, neem dan contact op met het NFI via het algemene contactformulier. https://www.forensischinstituut.nl/contact-2", - "area": null, - "lang": "NLD", - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": "stemmen van personen", - "methods_and_models": "Voor de technische werking van het algoritme automatische sprekervergelijking wordt verwezen naar de vakbijlage: deze kunt u is te vinden via deze link: https://www.forensischinstituut.nl/binaries/nfi/documenten/publicaties/2020/02/03/vakbijlage-automatische-sprekervergelijking/VakbijlageAutomatischesprekervergelijking_versiejuli2021.pdf", - "monitoring": null, - "human_intervention": "Er is sprake van menselijk tussenkomst bij het gebruik van het algoritme. Het resultaat van het algoritme automatische sprekervergelijking wordt samengenomen met de uitkomst van de methode waarbij de mens luistert en vergelijkt. ", - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": "algoritme, spraak, sprekervergelijking, stemmen, geluidopnamen, verdachte, deskundige", - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": "https://wetten.overheid.nl/BWBR0001903", - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-06-15 07:01:09.308148+00:00", - "lars": "37589341", - "owner": "nederlands-forensisch-instituut" - }, - { - "name": "Afvalbeleid-Milieupas", - "organization": "Gemeente Eindhoven", - "department": null, - "description_short": "Ondersteunen en adviseren op Afvalbeleid", - "type": "Nee", - "category": "{\"Ruimte en infrastructuur\"}", - "website": null, - "status": "In gebruik", - "goal": "Registratie aantal bezoeken na 12de bezoek dient er betaald te worden.", - "impact": null, - "proportionality": null, - "decision_making_process": null, - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.4.0", - "uuid": null, - "url": null, - "contact_email": "https://www.eindhoven.nl/bestuur-en-beleid/contact/contact-met-de-gemeente", - "area": null, - "lang": null, - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": null, - "human_intervention": "Ja", - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-06-16 07:28:32.598681+00:00", - "lars": "33859460", - "owner": "gemeente-eindhoven" - }, - { - "name": "Aangifte verwerken", - "organization": "Gemeente Eindhoven", - "department": null, - "description_short": "Het algoritme controleert of de burger tot aangifte bevoegd is en of de aangifte geautomatiseerd verwerkt mag worden. Zo niet dan wordt de aanvraag aan een ambtenaar voorgelegd", - "type": "Nee", - "category": null, - "website": null, - "status": "In gebruik", - "goal": "Is de burger tot aangifte bevoegd en mag de aangifte geautomatiseerd worden verwerkt. Zo niet dan wordt de aanvraag aan een ambtenaar worden voorgelegd", - "impact": null, - "proportionality": null, - "decision_making_process": null, - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.4.0", - "uuid": null, - "url": null, - "contact_email": "https://www.eindhoven.nl/bestuur-en-beleid/contact/contact-met-de-gemeente", - "area": null, - "lang": null, - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": null, - "human_intervention": null, - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-06-15 13:25:03.017885+00:00", - "lars": "99226259", - "owner": "gemeente-eindhoven" - }, - { - "name": "Vorderingen innen ", - "organization": "Gemeente Eindhoven", - "department": null, - "description_short": "Het algoritme haalt gegevens uit een database om zodoende openstaande vorderingen te kunnen doen die niet op de reguliere wijze kunnen worden ge\u00efnd.", - "type": "Nee", - "category": null, - "website": null, - "status": "In gebruik", - "goal": "Openstaande vorderingen innen ", - "impact": null, - "proportionality": null, - "decision_making_process": null, - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.4.0", - "uuid": null, - "url": null, - "contact_email": "https://www.eindhoven.nl/bestuur-en-beleid/contact/contact-met-de-gemeente", - "area": null, - "lang": null, - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": null, - "human_intervention": null, - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-06-15 13:24:13.028463+00:00", - "lars": "73981767", - "owner": "gemeente-eindhoven" - }, - { - "name": "Controle stempas", - "organization": "Gemeente Eindhoven", - "department": null, - "description_short": "Controle van een stempas in Register Ongeldige Stempassen", - "type": "Nee", - "category": null, - "website": null, - "status": null, - "goal": "Bepalen of het nummer van de aangeboden stempas in het Register Ongeldige Stempassen (ROS) voorkomt.", - "impact": null, - "proportionality": null, - "decision_making_process": null, - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.4.0", - "uuid": null, - "url": null, - "contact_email": "https://www.eindhoven.nl/bestuur-en-beleid/contact/contact-met-de-gemeente", - "area": null, - "lang": null, - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": null, - "human_intervention": null, - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-06-15 13:23:57.772736+00:00", - "lars": "62458694", - "owner": "gemeente-eindhoven" - }, - { - "name": "Inzicht verlicht", - "organization": "Gemeente Eindhoven", - "department": null, - "description_short": "Registreert of een verkeersplein effectief is of de ruimte beter ingericht kan worden.", - "type": "Nee", - "category": "{\"Ruimte en infrastructuur\"}", - "website": null, - "status": "In gebruik", - "goal": "Doorstroom en leefbaarheid bevorderen van verkeerspleinen.", - "impact": null, - "proportionality": null, - "decision_making_process": null, - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.4.0", - "uuid": null, - "url": null, - "contact_email": "https://www.eindhoven.nl/bestuur-en-beleid/contact/contact-met-de-gemeente", - "area": null, - "lang": null, - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": null, - "human_intervention": null, - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-06-16 07:27:21.082539+00:00", - "lars": "15354192", - "owner": "gemeente-eindhoven" - }, - { - "name": "Afvalbeleid-Milieupas", - "organization": "Gemeente Eindhoven", - "department": null, - "description_short": "Ondersteunen en adviseren op Afvalbeleid", - "type": "Nee", - "category": "{\"Ruimte en infrastructuur\"}", - "website": null, - "status": "In gebruik", - "goal": "Registratie van het aantal bezoeken van de milieu straat.\nNa het 12de bezoek dient er betaald te worden.", - "impact": null, - "proportionality": null, - "decision_making_process": null, - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.4.0", - "uuid": null, - "url": null, - "contact_email": "https://www.eindhoven.nl/bestuur-en-beleid/contact/contact-met-de-gemeente", - "area": null, - "lang": null, - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": null, - "human_intervention": "Ja", - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-06-16 07:27:03.111867+00:00", - "lars": "47443121", - "owner": "gemeente-eindhoven" - }, - { - "name": "Scanauto", - "organization": "Gemeente Eindhoven", - "department": null, - "description_short": "Toezicht houden op en handhaven van het parkeerbeleid in de stad m.b.v. een scanauto", - "type": "Nee", - "category": "{\"Ruimte en infrastructuur\"}", - "website": null, - "status": "In gebruik", - "goal": "Effici\u00ebntere parkeerhandhaving. Betere betalingsbereidheid.", - "impact": null, - "proportionality": null, - "decision_making_process": null, - "documentation": null, - "competent_authority": null, - "lawful_basis": null, - "iama": null, - "iama_description": null, - "dpia": null, - "dpia_description": null, - "objection_procedure": null, - "standard_version": "0.4.0", - "uuid": null, - "url": null, - "contact_email": "https://www.eindhoven.nl/bestuur-en-beleid/contact/contact-met-de-gemeente", - "area": null, - "lang": null, - "revision_date": null, - "description": null, - "application_url": null, - "publiccode": null, - "mprd": null, - "source_data": null, - "methods_and_models": null, - "monitoring": null, - "human_intervention": null, - "risks": null, - "performance_standard": null, - "provider": null, - "process_index_url": null, - "tags": null, - "source_id": null, - "begin_date": null, - "end_date": null, - "lawful_basis_link": null, - "impacttoetsen": null, - "source_data_link": null, - "published": true, - "released": false, - "create_dt": "2023-06-16 07:26:45.463581+00:00", - "lars": "17713131", - "owner": "gemeente-eindhoven" - } -] \ No newline at end of file diff --git a/backend/app/etl/load.py b/backend/app/etl/load.py deleted file mode 100644 index 81e67fcd..00000000 --- a/backend/app/etl/load.py +++ /dev/null @@ -1,20 +0,0 @@ -from app.etl.resources.loader import AlgoritmeLoader - - -def load_json(): - json_file = "app/etl/data/pub_data.json" - loader = AlgoritmeLoader(json_file=json_file) - return loader.load_algoritmes() - - -if __name__ == "__main__": - from app.util.logger import get_logger - - logger = get_logger(__name__) - - # data_loaded = load_json() - data_loaded = load_json() - if data_loaded: - logger.info("Algoritmes loaded") - else: - logger.info("Data not loaded") diff --git a/backend/app/etl/resources/loader.py b/backend/app/etl/resources/loader.py deleted file mode 100644 index 8b704a05..00000000 --- a/backend/app/etl/resources/loader.py +++ /dev/null @@ -1,111 +0,0 @@ -import pandas as pd -import numpy as np -import json -from pydantic import ValidationError -from app.database.database import SessionLocal -from app import models, schemas -from app.util.logger import get_logger -from app.config.settings import Settings - -logger = get_logger(__name__) -env_settings = Settings() - - -class AlgoritmeLoader: - """Load algoritmes from a json file. Existing algoritmes will be removed.""" - - def __init__(self, json_file: str | None = None): - if json_file is not None: - df = self.__get_df_algoritme_from_json(json_file=json_file) - else: - raise RuntimeError("Either excel_file or json_file must be specified") - - self.__algoritmes = self.process_df(df) - - @staticmethod - def __get_df_algoritme_from_json(json_file: str) -> pd.DataFrame: - with open(json_file) as f: - algoritmes: list[dict] = json.load(f) - df = pd.DataFrame(algoritmes) - return df - - @staticmethod - def process_df(df: pd.DataFrame) -> list[dict]: - string_cols = [ - "source_data", - "description_short", - ] - for sc in string_cols: - df[sc] = df[sc].str.slice(0, 5000) - - # build a column to indicate who owns the algorithm. If there are two parties (separated by a comma), take the - # first one. - if "owner" not in df.columns: - df["owner"] = ( - df.organization.replace(" ", "-", regex=True) - .apply(str.lower) - .str.split(pat=",", expand=True)[0] - ) - - df = df.replace( - { - "owner": { - "ministerie-van-financiën": "ministerie-fin", - "ministerie-van-economische-zaken-en-klimaat": "ministerie-ezk", - "sociale-verzekeringsbank-(svb)": "sociale-verzekeringsbank", - "uitvoeringsinstituut-werknemersverzekeringen-(uwv)": "uitvoeringsinstituut-werknemersver" - "zekeringen", - "rijksdienst-voor-identiteitsgegevens-(rvig)": "rijksdienst-voor-identiteitsgegevens", - } - } - ) - - return df.replace({np.nan: None}).to_dict(orient="records") - - def load_algoritmes(self): - counter = 0 - with SessionLocal() as db: - # Query the AlgoritmeVersion table, which is only populated at the end of - logging_algos = db.query(models.AlgoritmeVersion).all() - if (len(logging_algos) == 0) and (env_settings.type != "DEV"): - logger.info( - "No algorithms in database. It is assumed another pod is running the ETL. Stopping loading." - ) - return False - db.query(models.Algoritme).delete() - db.commit() - for algo in self.__algoritmes: - lars = algo["lars"] - - algoritme_version_dict = algo.copy() - algoritme_version_dict.pop("lars") - algoritme_version_dict.pop("owner") - new_algoritme_version = models.AlgoritmeVersion( - **algoritme_version_dict - ) - - # Makes a new algorithm. - algoritme_dict = { - "lars": lars, - "owner": algo["owner"], - "versions": [new_algoritme_version], - } - new_algoritme = models.Algoritme(**algoritme_dict) - - db.add(new_algoritme) - db.add(new_algoritme_version) - logger.info( - "Added " + str(lars) + " | " + str(new_algoritme_version.name) - ) - - # Tests validity. - version_str = "v" + algo["standard_version"].replace(".", "_") - schema = schemas.versions.create_algorithm_in_loader_schema(version_str) - try: - schema.parse_obj(algo) - except ValidationError as e: - logger.warning(e) - counter += len(e.args[0]) - db.commit() - logger.info("Number of validation errors: " + str(counter)) - return True diff --git a/backend/app/mailing/mailing.py b/backend/app/mailing/mailing.py index 80db0cb9..cea3f0bb 100644 --- a/backend/app/mailing/mailing.py +++ b/backend/app/mailing/mailing.py @@ -10,7 +10,7 @@ EMAIL_DOMAIN = "@i8s.nl" -def send_release_notification_mail( +def send_notification_mail( receivers: list[str], sender: str, subject: str, diff --git a/backend/app/main.py b/backend/app/main.py index d155cb1a..9ae426f5 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -1,63 +1,49 @@ from fastapi import FastAPI from starlette.middleware.cors import CORSMiddleware -from fastapi import APIRouter -from app.routers import default, aggregations, text_loader from app.api import api -from app.etl.load import load_json +from app.routers.public import aggregations, default, text_loader, downloads from app.util.logger import get_logger from app.config.settings import Settings, Keycloak +from slowapi import Limiter, _rate_limit_exceeded_handler +from slowapi.util import get_remote_address +from slowapi.middleware import SlowAPIMiddleware +from slowapi.errors import RateLimitExceeded logger = get_logger(__name__) # Only do automatic data loading on the public website env_settings = Settings() -logger.info(f"Environment variable TYPE: {env_settings.type}") - -if (env_settings.type == "PUB") or (env_settings.type == "DEV"): - data_loaded = load_json() - if data_loaded: - logger.info("Algoritmes loaded") - else: - logger.info("Data not loaded") - -if (env_settings.type == "PUB") or (env_settings.type == "DEV"): - fe_api_url = "/api" -else: - fe_api_url = "/conceptapi" - -logger.info(f"API prefix set to {fe_api_url}") - app = FastAPI( - docs_url=f"{fe_api_url}/api-docs", - openapi_url=f"{fe_api_url}/openapi.json", + docs_url="/api/docs", + openapi_url="/api/openapi.json", title="Application API", swagger_ui_parameters={"displayRequestDuration": True}, ) +limiter = Limiter(key_func=get_remote_address, default_limits=["15/minute"]) +api.state.limiter = limiter +api.add_exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler) +api.add_middleware(SlowAPIMiddleware) -router = APIRouter() -app.include_router(default.router, prefix=fe_api_url, tags=["default"]) -app.include_router(aggregations.router, prefix=fe_api_url, tags=["aggregations"]) -app.include_router(text_loader.router, tags=["text loader"]) +app.include_router(default.router, prefix="/api", tags=["default"]) +app.include_router(aggregations.router, prefix="/api", tags=["Aggregaties"]) +app.include_router(text_loader.router, tags=["text_loader"]) +app.include_router(downloads.router, prefix="/api/downloads", tags=["Downloads"]) + +app.mount("/aanleverapi", api) app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"] ) -if (env_settings.type == "API") or (env_settings.type == "DEV"): - logger.info(f"Mounting {env_settings.type}") - app.mount("/aanleverapi", api) - - -if (env_settings.type == "API") or (env_settings.type == "DEV"): - @app.get("/conceptapi/config") - def get_config(): - """I cannot get variables in the frontend relating to differentiate between test, acc and prod""" - settings = Keycloak() - response = { - "keycloak_uri": settings.KEYCLOAK_URI, - "keycloak_realm": settings.KEYCLOAK_REALM, - "keycloak_client": settings.KEYCLOAK_CLIENT, - } - return response +@app.get("/api/config") +def get_config(): + """I cannot get variables in the frontend relating to differentiate between test, acc and prod""" + settings = Keycloak() + response = { + "keycloak_uri": settings.KEYCLOAK_URI, + "keycloak_realm": settings.KEYCLOAK_REALM, + "keycloak_client": settings.KEYCLOAK_CLIENT, + } + return response diff --git a/backend/app/middleware/decorators/auth.py b/backend/app/middleware/decorators/auth.py index a92b0dd3..de2b15e6 100644 --- a/backend/app/middleware/decorators/auth.py +++ b/backend/app/middleware/decorators/auth.py @@ -22,18 +22,30 @@ async def wrapper( *args, db: Session, lars: str | None = None, - as_org: str, + as_org: str = "", user: schemas.User, **kwargs, ): # Tests if the user can act on behalf of this organisation - if as_org not in user.organizations: + if ( + as_org not in user.organizations + and user.role != "admin" + and user.role != "publisher" + ): logger.error( f"Authorization error, requested org: {as_org}.\nOrganisations under this user: \n{user.organizations}" ) raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, - detail=f"Er zijn geen accountsrechten gevonden voor een organisatie '{as_org}'.", + detail=f"Er zijn geen accountsrechten gevonden voor '{as_org}'.", + ) + + orgs = db.query(models.Organisation.code).all() + org_list = [org[0] for org in orgs] + if as_org not in org_list: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail=f"Er is geen organisatie '{as_org}' gevonden.", ) # if no code is given, only authorisation for organisation is needed diff --git a/backend/app/models/__init__.py b/backend/app/models/__init__.py index 95493203..9b90b08f 100644 --- a/backend/app/models/__init__.py +++ b/backend/app/models/__init__.py @@ -1,3 +1,5 @@ from .algoritme import Algoritme # noqa from .algoritme_version import AlgoritmeVersion # noqa -from .action_history import ActionHistory, OperationEnum # noqa +from .words import Words # noqa +from .action_history import ActionHistory # noqa +from .organisation import Organisation # noqa diff --git a/backend/app/models/action_history.py b/backend/app/models/action_history.py index 9a60a8d0..ebefa323 100644 --- a/backend/app/models/action_history.py +++ b/backend/app/models/action_history.py @@ -1,31 +1,23 @@ -from sqlalchemy import Column, Integer, DateTime, VARCHAR, Enum -import enum -from sqlalchemy import ForeignKey +import datetime +from sqlalchemy import Integer, DateTime, VARCHAR, Enum, ForeignKey +from sqlalchemy.orm import Mapped, mapped_column from sqlalchemy.sql import func from app.database.database import Base - - -class OperationEnum(str, enum.Enum): - created = "created" - new_version = "new version" - released = "released" - published = "published" - retracted = "retracted" - preview_activated = "preview activated" - preview_used = "preview used" - preview_timeout = "preview timeout" +from app import schemas class ActionHistory(Base): __tablename__ = "action_history" - id = Column(Integer, primary_key=True, index=True) - algoritme_version_id = Column( - Integer, ForeignKey("algoritme_version.id"), nullable=False + id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True) + algoritme_version_id = mapped_column( + Integer, ForeignKey("algoritme_version.id", ondelete="cascade"), nullable=False + ) + operation = mapped_column( + Enum(schemas.OperationEnum, name="operation"), nullable=False ) - operation = Column(Enum(OperationEnum), nullable=False) - user_id = Column(VARCHAR(1024), nullable=False) + user_id: Mapped[str] = mapped_column(VARCHAR(1024), nullable=False) - create_dt = Column( + create_dt: Mapped[datetime.datetime] = mapped_column( DateTime(timezone=True), nullable=False, server_default=func.now() ) diff --git a/backend/app/models/algoritme.py b/backend/app/models/algoritme.py index 31cc10e2..9256d213 100644 --- a/backend/app/models/algoritme.py +++ b/backend/app/models/algoritme.py @@ -1,5 +1,7 @@ -from sqlalchemy import Column, Integer, DateTime, VARCHAR -from sqlalchemy.orm import relationship +import datetime +from sqlalchemy import Integer, DateTime, VARCHAR, ForeignKey +from sqlalchemy.ext.associationproxy import association_proxy +from sqlalchemy.orm import relationship, Mapped, mapped_column from sqlalchemy.sql import func from app.database.database import Base @@ -7,12 +9,18 @@ class Algoritme(Base): __tablename__ = "algoritme" - id = Column(Integer, primary_key=True, index=True) - lars = Column(VARCHAR(8), nullable=True, index=True) - owner = Column(VARCHAR(1024), nullable=True) + id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True) + lars: Mapped[str] = mapped_column(VARCHAR(8), nullable=True, index=True) + organisation_id: Mapped[str] = mapped_column( + Integer, ForeignKey("organisation.id", ondelete="cascade"), nullable=True + ) - create_dt = Column( + create_dt: Mapped[datetime.datetime] = mapped_column( DateTime(timezone=True), nullable=False, server_default=func.now() ) versions = relationship("AlgoritmeVersion", back_populates="algoritme") + + organisation = relationship("Organisation", back_populates="algoritmes") + + owner = association_proxy("organisation", "code") diff --git a/backend/app/models/algoritme_version.py b/backend/app/models/algoritme_version.py index 348aaf0e..6dc842df 100644 --- a/backend/app/models/algoritme_version.py +++ b/backend/app/models/algoritme_version.py @@ -1,82 +1,120 @@ -from sqlalchemy import Column, Integer, VARCHAR, DateTime, ForeignKey, Boolean +import datetime +from sqlalchemy import ( + JSON, + Index, + Integer, + VARCHAR, + DateTime, + ForeignKey, + Boolean, + Enum, +) from sqlalchemy.ext.associationproxy import association_proxy from app.database.database import Base -from sqlalchemy.orm import relationship +from sqlalchemy.orm import relationship, Mapped, mapped_column from sqlalchemy.sql import func +from sqlalchemy.dialects.postgresql import TSVECTOR +from . import Algoritme +from app.schemas import ( + Language, + ImpacttoetsenGrouping, + SourceDataGrouping, + LawfulBasisGrouping, +) class AlgoritmeVersion(Base): __tablename__ = "algoritme_version" - id = Column(Integer, primary_key=True, index=True) - algoritme_id = Column(Integer, ForeignKey("algoritme.id"), nullable=False) - name = Column(VARCHAR(1024)) - organization = Column(VARCHAR(1024)) - department = Column(VARCHAR(1024)) - description_short = Column(VARCHAR(5000)) - type = Column(VARCHAR(1024)) - category = Column(VARCHAR(1024)) - website = Column(VARCHAR(1024)) - status = Column(VARCHAR(1024)) + id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True) + algoritme_id: Mapped[int] = mapped_column( + Integer, ForeignKey("algoritme.id", ondelete="cascade"), nullable=False + ) + language: Mapped[Language] = mapped_column(Enum(Language), nullable=False) + + name: Mapped[str | None] = mapped_column(VARCHAR(1024)) + organization: Mapped[str | None] = mapped_column(VARCHAR(1024)) + department: Mapped[str | None] = mapped_column(VARCHAR(1024)) + description_short: Mapped[str | None] = mapped_column(VARCHAR(5000)) + type: Mapped[str | None] = mapped_column(VARCHAR(1024)) + category: Mapped[str | None] = mapped_column(VARCHAR(1024)) + website: Mapped[str | None] = mapped_column(VARCHAR(1024)) + status: Mapped[str | None] = mapped_column(VARCHAR(1024)) # Inzet - goal = Column(VARCHAR(5000)) - impact = Column(VARCHAR(5000)) - proportionality = Column(VARCHAR(5000)) - decision_making_process = Column(VARCHAR(5000)) - documentation = Column(VARCHAR(1024)) + goal: Mapped[str | None] = mapped_column(VARCHAR(5000)) + impact: Mapped[str | None] = mapped_column(VARCHAR(5000)) + proportionality: Mapped[str | None] = mapped_column(VARCHAR(5000)) + decision_making_process: Mapped[str | None] = mapped_column(VARCHAR(5000)) + documentation: Mapped[str | None] = mapped_column(VARCHAR(1024)) # Juridisch - competent_authority = Column(VARCHAR(1024)) - lawful_basis = Column(VARCHAR(5000)) - iama = Column(VARCHAR(128)) - iama_description = Column(VARCHAR(5000)) - dpia = Column(VARCHAR(128)) - dpia_description = Column(VARCHAR(5000)) - objection_procedure = Column(VARCHAR(5000)) + competent_authority: Mapped[str | None] = mapped_column(VARCHAR(1024)) + lawful_basis: Mapped[str | None] = mapped_column(VARCHAR(5000)) + iama: Mapped[str | None] = mapped_column(VARCHAR(128)) + iama_description: Mapped[str | None] = mapped_column(VARCHAR(5000)) + dpia: Mapped[str | None] = mapped_column(VARCHAR(128)) + dpia_description: Mapped[str | None] = mapped_column(VARCHAR(5000)) + objection_procedure: Mapped[str | None] = mapped_column(VARCHAR(5000)) # Metadata - standard_version = Column(VARCHAR(1024)) - uuid = Column(VARCHAR(1024)) - url = Column(VARCHAR(1024)) - contact_email = Column(VARCHAR(1024)) - area = Column(VARCHAR(1024)) - lang = Column(VARCHAR(1024)) - revision_date = Column(VARCHAR(1024)) + standard_version: Mapped[str | None] = mapped_column(VARCHAR(1024)) + uuid: Mapped[str | None] = mapped_column(VARCHAR(1024)) + url: Mapped[str | None] = mapped_column(VARCHAR(1024)) + contact_email: Mapped[str | None] = mapped_column(VARCHAR(1024)) + area: Mapped[str | None] = mapped_column(VARCHAR(1024)) + lang: Mapped[str | None] = mapped_column(VARCHAR(1024)) + revision_date: Mapped[str | None] = mapped_column(VARCHAR(1024)) # Toepassing - description = Column(VARCHAR(10000)) - application_url = Column(VARCHAR(1024)) - publiccode = Column(VARCHAR(1024)) - mprd = Column(VARCHAR(500)) - source_data = Column(VARCHAR(5000)) - methods_and_models = Column(VARCHAR(5000)) + description: Mapped[str | None] = mapped_column(VARCHAR(10000)) + application_url: Mapped[str | None] = mapped_column(VARCHAR(1024)) + publiccode: Mapped[str | None] = mapped_column(VARCHAR(1024)) + mprd: Mapped[str | None] = mapped_column(VARCHAR(500)) + source_data: Mapped[str | None] = mapped_column(VARCHAR(5000)) + methods_and_models: Mapped[str | None] = mapped_column(VARCHAR(5000)) # Toezicht - monitoring = Column(VARCHAR(5000)) - human_intervention = Column(VARCHAR(5000)) - risks = Column(VARCHAR(5000)) - performance_standard = Column(VARCHAR(5000)) + monitoring: Mapped[str | None] = mapped_column(VARCHAR(5000)) + human_intervention: Mapped[str | None] = mapped_column(VARCHAR(5000)) + risks: Mapped[str | None] = mapped_column(VARCHAR(5000)) + performance_standard: Mapped[str | None] = mapped_column(VARCHAR(5000)) # Additions by 0.3.1 - provider = Column(VARCHAR(200)) - process_index_url = Column(VARCHAR(500)) - tags = Column(VARCHAR(2500)) - source_id = Column(VARCHAR(100)) + provider: Mapped[str | None] = mapped_column(VARCHAR(200)) + process_index_url: Mapped[str | None] = mapped_column(VARCHAR(500)) + tags: Mapped[str | None] = mapped_column(VARCHAR(2500)) + source_id: Mapped[str | None] = mapped_column(VARCHAR(100)) # Additions by 0.4.0 - begin_date = Column(VARCHAR(7)) - end_date = Column(VARCHAR(7)) - lawful_basis_link = Column(VARCHAR(200)) - impacttoetsen = Column(VARCHAR(1024)) - source_data_link = Column(VARCHAR(500)) + begin_date: Mapped[str | None] = mapped_column(VARCHAR(7)) + end_date: Mapped[str | None] = mapped_column(VARCHAR(7)) + lawful_basis_link: Mapped[str | None] = mapped_column(VARCHAR(200)) + impacttoetsen: Mapped[str | None] = mapped_column(VARCHAR(1024)) + source_data_link: Mapped[str | None] = mapped_column(VARCHAR(500)) + + # Additions by 1.0.0 + publication_category: Mapped[str | None] = mapped_column(VARCHAR(1000)) + lawful_basis_grouping: Mapped[list[LawfulBasisGrouping] | None] = mapped_column( + JSON + ) + impacttoetsen_grouping: Mapped[list[ImpacttoetsenGrouping] | None] = mapped_column( + JSON + ) + source_data_grouping: Mapped[list[SourceDataGrouping] | None] = mapped_column(JSON) - published = Column(Boolean, nullable=False, default=False) - released = Column(Boolean, nullable=False, default=False) - preview_active = Column(Boolean, nullable=False, default=False) - create_dt = Column(DateTime(timezone=True), server_default=func.now()) + published: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False) + released: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False) + preview_active: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False) + create_dt: Mapped[datetime.datetime | None] = mapped_column( + DateTime(timezone=True), server_default=func.now() + ) + vector: Mapped[str | None] = mapped_column(TSVECTOR) - algoritme = relationship("Algoritme", back_populates="versions") + algoritme: Mapped[Algoritme] = relationship("Algoritme", back_populates="versions") lars = association_proxy("algoritme", "lars") owner = association_proxy("algoritme", "owner") + + +vector_index = Index("gin_idx", AlgoritmeVersion.vector, postgresql_using="gin") diff --git a/backend/app/models/organisation.py b/backend/app/models/organisation.py new file mode 100644 index 00000000..4eebfb69 --- /dev/null +++ b/backend/app/models/organisation.py @@ -0,0 +1,24 @@ +import datetime +from sqlalchemy import Integer, DateTime, VARCHAR, Enum +from sqlalchemy.orm import relationship, Mapped, mapped_column +from sqlalchemy.sql import func +from app.database.database import Base +from app.schemas import OrgType +from . import Algoritme + + +class Organisation(Base): + __tablename__ = "organisation" + + id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True) + code: Mapped[str] = mapped_column(VARCHAR(1024), nullable=False) + name: Mapped[str] = mapped_column(VARCHAR(1024), nullable=False) + type: Mapped[OrgType] = mapped_column(Enum(OrgType, name="type"), nullable=True) + + create_dt: Mapped[datetime.datetime] = mapped_column( + DateTime(timezone=True), nullable=False, server_default=func.now() + ) + + algoritmes: Mapped[list[Algoritme]] = relationship( + "Algoritme", back_populates="organisation" + ) diff --git a/backend/app/models/words.py b/backend/app/models/words.py new file mode 100644 index 00000000..7f326ce7 --- /dev/null +++ b/backend/app/models/words.py @@ -0,0 +1,9 @@ +from app.database.database import Base +from sqlalchemy import Text +from sqlalchemy.orm import Mapped, mapped_column + + +class Words(Base): + __tablename__ = "words" + + word: Mapped[str | None] = mapped_column(Text, primary_key=True) diff --git a/backend/app/repositories/__init__.py b/backend/app/repositories/__init__.py new file mode 100644 index 00000000..5949e6c7 --- /dev/null +++ b/backend/app/repositories/__init__.py @@ -0,0 +1,4 @@ +from .algoritme_version import AlgoritmeVersionRepository # noqa +from .organisation import OrganisationRepository # noqa +from .algoritme import AlgoritmeRepository # noqa +from .action_history import ActionHistoryRepository # noqa diff --git a/backend/app/repositories/action_history.py b/backend/app/repositories/action_history.py new file mode 100644 index 00000000..33b503fd --- /dev/null +++ b/backend/app/repositories/action_history.py @@ -0,0 +1,22 @@ +from sqlalchemy.orm import Session +from app import models, schemas +from .index import IRepository + + +class ActionHistoryRepository(IRepository): + def __init__(self, session: Session): + self.session = session + + def __del__(self): + self.session.commit() + + def get_all(self) -> list[schemas.ActionHistoryDB]: + actions = self.session.query(models.ActionHistory).all() + return [schemas.ActionHistoryDB.from_orm(a) for a in actions] + + def add(self, action: schemas.ActionHistoryIn) -> schemas.ActionHistoryDB: + action_model = models.ActionHistory(**action.dict()) + self.session.add(action_model) + self.session.flush() + + return schemas.ActionHistoryDB.from_orm(action_model) diff --git a/backend/app/repositories/algoritme.py b/backend/app/repositories/algoritme.py new file mode 100644 index 00000000..d53f3928 --- /dev/null +++ b/backend/app/repositories/algoritme.py @@ -0,0 +1,44 @@ +from sqlalchemy.orm import Session +from app import models, schemas +from .index import IRepository + + +class AlgoritmeRepository(IRepository): + def __init__(self, session: Session): + self.session = session + + def __del__(self): + self.session.commit() + + def get_all(self) -> list[schemas.AlgoritmeDB]: + algoritmes = self.session.query(models.Algoritme).all() + return [schemas.AlgoritmeDB.from_orm(a) for a in algoritmes] + + def get_by_lars(self, lars: str) -> schemas.AlgoritmeDB | None: + algoritme = ( + self.session.query(models.Algoritme) + .filter(models.Algoritme.lars == lars) + .first() + ) + if not algoritme: + return None + return schemas.AlgoritmeDB.from_orm(algoritme) + + def add(self, item: schemas.AlgoritmeIn) -> schemas.AlgoritmeDB: + algoritme = models.Algoritme(**item.dict()) + self.session.add(algoritme) + self.session.flush() + + return schemas.AlgoritmeDB.from_orm(algoritme) + + def get_all_lars(self) -> list[str]: + return [lars[0] for lars in self.session.query(models.Algoritme.lars).all()] + + def delete_by_lars(self, lars: str) -> int: + n_removed = ( + self.session.query(models.Algoritme) + .filter(models.Algoritme.lars == lars) + .delete() + ) + self.session.commit() + return n_removed diff --git a/backend/app/repositories/algoritme_version.py b/backend/app/repositories/algoritme_version.py new file mode 100644 index 00000000..0b906a2d --- /dev/null +++ b/backend/app/repositories/algoritme_version.py @@ -0,0 +1,295 @@ +from sqlalchemy.orm import Session +from sqlalchemy import desc, func, and_, update, ColumnElement +from app import models, schemas +from app.schemas.misc import Language +from .index import IRepository +from app.services.algoritme_version import ( + db_list_to_python_list_schema, +) + + +class AlgoritmeVersionRepository(IRepository): + def __init__(self, session: Session): + self.session = session + + # def __del__(self): + # self.session.commit() + + def get_all(self) -> list[schemas.AlgoritmeVersionDB]: + algoritme_versions = self.session.query(models.AlgoritmeVersion).all() + return [schemas.AlgoritmeVersionDB.from_orm(a) for a in algoritme_versions] + + def get_published_by_filter( + self, + filter: ColumnElement[bool], + offset: int = 0, + limit: int = 10, + ) -> list[schemas.AlgoritmeVersionQuery]: + algoritme_versions = ( + self.session.query(models.AlgoritmeVersion) + .order_by(desc(models.AlgoritmeVersion.create_dt)) + .filter(filter, models.AlgoritmeVersion.published) + .limit(limit) + .offset(offset) + .all() + ) + return [ + db_list_to_python_list_schema(schemas.AlgoritmeVersionQuery.from_orm(a)) + for a in algoritme_versions + ] + + def get_latest_by_lars_by_lang( + self, lars: str, lang: schemas.Language + ) -> schemas.AlgoritmeVersionDB | None: + latest_algo = ( + self.session.query(models.AlgoritmeVersion) + .filter( + models.AlgoritmeVersion.lars == lars, + models.AlgoritmeVersion.language == lang, + ) + .order_by(desc(models.AlgoritmeVersion.create_dt)) + ).first() + if latest_algo: + latest_algo = schemas.AlgoritmeVersionDB.from_orm(latest_algo) + return db_list_to_python_list_schema(latest_algo) + + def get_published_by_lang( + self, lang: schemas.Language + ) -> list[schemas.AlgoritmeVersionDB]: + published_algoritmes = ( + self.session.query(models.AlgoritmeVersion) + .filter( + models.AlgoritmeVersion.language == lang, + models.AlgoritmeVersion.published, + ) + .order_by(desc(models.AlgoritmeVersion.create_dt)) + .all() + ) + return [ + db_list_to_python_list_schema(schemas.AlgoritmeVersionDB.from_orm(alg)) + for alg in published_algoritmes + ] + + def get_latest_by_lang( + self, lang: schemas.Language + ) -> list[schemas.AlgoritmeVersionDB]: + latest_all_algo_summary = ( + self.session.query( + models.AlgoritmeVersion.algoritme_id, + func.max(models.AlgoritmeVersion.create_dt).label("max_creation_dt"), + ) + .group_by(models.AlgoritmeVersion.algoritme_id) + .subquery() + ) + latest_all_algoritmes = ( + self.session.query(models.AlgoritmeVersion) + .join( + latest_all_algo_summary, + and_( + models.AlgoritmeVersion.algoritme_id + == latest_all_algo_summary.c.algoritme_id, + models.AlgoritmeVersion.create_dt + == latest_all_algo_summary.c.max_creation_dt, + ), + ) + .filter( + models.AlgoritmeVersion.language == lang, + ) + .all() + ) + return [ + db_list_to_python_list_schema(schemas.AlgoritmeVersionDB.from_orm(alg)) + for alg in latest_all_algoritmes + ] + + def get_latest_by_org_by_lang( + self, as_org: str, lang: schemas.Language + ) -> list[schemas.AlgoritmeVersionDB]: + """For an organisation, returns the latest versions of all algoritmebeschrijvingen under them.""" + latest_all_algoritmes = ( + self.session.query( + models.AlgoritmeVersion.algoritme_id, + func.max(models.AlgoritmeVersion.create_dt).label("max_creation_dt"), + ) + .group_by(models.AlgoritmeVersion.algoritme_id) + .subquery() + ) + latest_org_algoritmes = ( + self.session.query(models.AlgoritmeVersion) + .join( + latest_all_algoritmes, + and_( + models.AlgoritmeVersion.algoritme_id + == latest_all_algoritmes.c.algoritme_id, + models.AlgoritmeVersion.create_dt + == latest_all_algoritmes.c.max_creation_dt, + ), + ) + .filter( + models.AlgoritmeVersion.owner == as_org, + models.AlgoritmeVersion.language == lang, + ) + .all() + ) + return [ + db_list_to_python_list_schema(schemas.AlgoritmeVersionDB.from_orm(alg)) + for alg in latest_org_algoritmes + ] + + def get_published_by_lars(self, lars: str) -> list[schemas.AlgoritmeVersionDB]: + """For a lars-code, returns all published""" + published_alg = ( + self.session.query(models.AlgoritmeVersion) + .filter( + models.AlgoritmeVersion.published, + models.AlgoritmeVersion.lars == lars, + ) + .all() + ) + return [ + db_list_to_python_list_schema(schemas.AlgoritmeVersionDB.from_orm(alg)) + for alg in published_alg + ] + + def get_published_by_lars_by_lang( + self, lars: str, lang: schemas.Language + ) -> schemas.AlgoritmeVersionDB | None: + """For a lars-code, return published by language""" + published_alg = ( + self.session.query(models.AlgoritmeVersion) + .filter( + models.AlgoritmeVersion.published, + models.AlgoritmeVersion.lars == lars, + models.AlgoritmeVersion.language == lang, + ) + .first() + ) + if published_alg: + return db_list_to_python_list_schema( + schemas.AlgoritmeVersionDB.from_orm(published_alg) + ) + + def get_published_by_org_by_lang( + self, as_org, lang: schemas.Language + ) -> list[schemas.AlgoritmeVersionDB]: + """For an organisation, returns all published by language""" + published_algos = ( + self.session.query(models.AlgoritmeVersion) + .filter( + models.AlgoritmeVersion.published, + models.AlgoritmeVersion.owner == as_org, + models.AlgoritmeVersion.language == lang, + ) + .all() + ) + + result = [ + db_list_to_python_list_schema(schemas.AlgoritmeVersionDB.from_orm(alg)) + for alg in published_algos + ] + return result + + def add(self, item: schemas.AlgoritmeVersionIn) -> schemas.AlgoritmeVersionDB: + algoritme_version = models.AlgoritmeVersion(**item.dict()) + self.session.add(algoritme_version) + self.session.commit() + + return schemas.AlgoritmeVersionDB.from_orm(algoritme_version) + + def update_by_id(self, id: int, item: schemas.AlgoritmeVersionIn) -> None: + stmt = ( + update(models.AlgoritmeVersion) + .where(models.AlgoritmeVersion.id == id) + .values(**item.dict(exclude={"create_dt"})) + ) + self.session.execute(stmt) + self.session.commit() + + def retract_by_lars(self, lars: str) -> list[schemas.AlgoritmeVersionDB] | None: + query = self.session.query(models.AlgoritmeVersion).filter( + models.AlgoritmeVersion.published, + models.AlgoritmeVersion.lars == lars, + ) + algoritme_versions = query.all() + if len(algoritme_versions) == 0: + return None + + update_is_succesful = query.update( + { + models.AlgoritmeVersion.published: False, + models.AlgoritmeVersion.released: False, + }, + synchronize_session=False, + ) + self.session.commit() + if update_is_succesful: + return [ + schemas.AlgoritmeVersionDB.from_orm(alg) for alg in algoritme_versions + ] + + def release_latest_by_lars(self, lars: str) -> int | None: + # Always NLD + latest_algo = self.get_latest_by_lars_by_lang(lars, schemas.Language.NLD) + if not latest_algo: + return None + + latest_algo.released = True + self.update_by_id( + latest_algo.id, schemas.AlgoritmeVersionIn(**latest_algo.dict()) + ) + self.session.commit() + + def unrelease_by_lars(self, lars: str) -> int: + n_unreleased = ( + self.session.query(models.AlgoritmeVersion) + .filter(models.AlgoritmeVersion.lars == lars) + .update( + { + models.AlgoritmeVersion.released: False, + }, + synchronize_session="fetch", + ) + ) + return n_unreleased + + def preview_latest_by_lars(self, lars: str) -> schemas.AlgoritmeVersionDB | None: + # Always NLD + latest_algo = self.get_latest_by_lars_by_lang(lars, schemas.Language.NLD) + if not latest_algo: + return None + + _ = ( + self.session.query(models.AlgoritmeVersion) + .filter(models.AlgoritmeVersion.id == latest_algo.id) + .update( + {models.AlgoritmeVersion.preview_active: True}, + synchronize_session="fetch", + ) + ) + latest_algo.preview_active = True + return latest_algo + + def unpreview_by_lars(self, lars: str) -> schemas.AlgoritmeVersionDB | None: + # Always NLD + preview_algo = ( + self.session.query(models.AlgoritmeVersion) + .filter( + models.AlgoritmeVersion.lars == lars, + models.AlgoritmeVersion.preview_active, + models.AlgoritmeVersion.language == Language.NLD, + ) + .first() + ) + if not preview_algo: + return + + _ = ( + self.session.query(models.AlgoritmeVersion) + .filter(models.AlgoritmeVersion.id == preview_algo.id) + .update( + {models.AlgoritmeVersion.preview_active: False}, + synchronize_session="fetch", + ) + ) + preview_algo.preview_active = False + return preview_algo diff --git a/backend/app/repositories/index.py b/backend/app/repositories/index.py new file mode 100644 index 00000000..c1701781 --- /dev/null +++ b/backend/app/repositories/index.py @@ -0,0 +1,32 @@ +from abc import ABC, abstractmethod +from sqlalchemy.orm import Session + + +class IRepository(ABC): + @abstractmethod + def __init__(self, session: Session): + raise NotImplementedError + + # @abstractmethod + # def __del__(self): + # raise NotImplementedError + + @abstractmethod + def get_all(self): + raise NotImplementedError + + @abstractmethod + def add(self, item): + raise NotImplementedError + + # @abstractmethod + # def get_by_id(self, id: int): + # raise NotImplementedError + + # @abstractmethod + # def update(self, item, id: int): + # raise NotImplementedError + + # @abstractmethod + # def remove_by_id(self, id: int): + # raise NotImplementedError diff --git a/backend/app/repositories/organisation.py b/backend/app/repositories/organisation.py new file mode 100644 index 00000000..9fe567fc --- /dev/null +++ b/backend/app/repositories/organisation.py @@ -0,0 +1,98 @@ +from sqlalchemy.orm import Session +from sqlalchemy import ColumnElement, func +from app import models, schemas +from .index import IRepository + + +class OrganisationRepository(IRepository): + def __init__(self, session: Session): + self.session = session + + def __del__(self): + self.session.commit() + + def get_all(self) -> list[schemas.OrganisationDB]: + all_orgs: list[models.Organisation] = self.session.query( + models.Organisation + ).all() + return [schemas.OrganisationDB.from_orm(one_org) for one_org in all_orgs] + + def get_aggregated_organisations_by_filter( + self, filter: ColumnElement[bool] + ) -> list[schemas.OrganisationFilterGroup]: + subquery = ( + self.session.query( + models.Algoritme.organisation_id, + func.count(models.Algoritme.id).label("count"), + ) + .join( + models.AlgoritmeVersion, + models.AlgoritmeVersion.algoritme_id == models.Algoritme.id, + ) + .filter(filter) + .group_by(models.Algoritme.organisation_id) + .subquery() + ) + + org_rows_model = self.session.query( + models.Organisation.type, models.Organisation.name, subquery.c.count + ).join( + subquery, + models.Organisation.id == subquery.c.organisation_id, + ) + + org_rows = [schemas.OrganisationGrouping.from_orm(o) for o in org_rows_model] + results: list[schemas.OrganisationFilterGroup] = [] + types_present = set([r.type for r in org_rows]) + for type in types_present: + organisations: list[schemas.OrganisationPresenceCount] = [] + for org_row in org_rows: + if org_row.type == type: + organisations.append( + schemas.OrganisationPresenceCount( + name=org_row.name, count=org_row.count + ) + ) + + if type is None: + type = schemas.OrgType.overig + + results.append( + schemas.OrganisationFilterGroup(type=type, organisations=organisations) + ) + return results + + def add(self, item: schemas.OrganisationIn) -> schemas.OrganisationDB: + organization = models.Organisation(**item.dict()) + self.session.add(organization) + self.session.flush() + + return schemas.OrganisationDB.from_orm(organization) + + def get_by_code(self, code: str) -> schemas.OrganisationDB | None: + organisation = ( + self.session.query(models.Organisation) + .filter(models.Organisation.code == code) + .first() + ) + if organisation: + return schemas.OrganisationDB.from_orm(organisation) + + def get_by_name(self, name: str) -> schemas.OrganisationDB | None: + organisation = ( + self.session.query(models.Organisation) + .filter(models.Organisation.name == name) + .first() + ) + if organisation: + return schemas.OrganisationDB.from_orm(organisation) + + def get_by_lars(self, lars: str) -> schemas.OrganisationDB | None: + organisation = ( + self.session.query(models.Organisation) + .join(models.Algoritme) + .filter(models.Algoritme.lars == lars) + .first() + ) + if organisation: + return schemas.OrganisationDB.from_orm(organisation) diff --git a/backend/app/routers/__init__.py b/backend/app/routers/__init__.py index 4dd283b8..e8a65f2e 100644 --- a/backend/app/routers/__init__.py +++ b/backend/app/routers/__init__.py @@ -1 +1,6 @@ -from . import v0_1_0, v0_2_3, v0_3_1, v0_4_0 # noqa +from . import v0_1_0, v0_2_3, v0_3_1, v0_4_0, v1_0_0 # noqa +from . import downloads # noqa +from . import organization # noqa +from . import algoritme # noqa +from . import c3po # noqa +from . import templates # noqa diff --git a/backend/app/routers/algoritme.py b/backend/app/routers/algoritme.py new file mode 100644 index 00000000..86579ba9 --- /dev/null +++ b/backend/app/routers/algoritme.py @@ -0,0 +1,18 @@ +from fastapi import Depends, APIRouter, Path +from sqlalchemy.orm import Session +from app import schemas, middleware +from app.controllers import get_algoritme_owner + +router = APIRouter() + + +@router.get( + "/algoritme/find/{algoritme_id}", + response_model=schemas.OrganisationIn, +) +async def find_algoritme_owner( + lars: str = Path(alias="algoritme_id"), + db: Session = Depends(middleware.get_db), + user: schemas.User = Depends(middleware.get_current_user), +): + return get_algoritme_owner(db, user, lars) diff --git a/backend/app/routers/c3po.py b/backend/app/routers/c3po.py new file mode 100644 index 00000000..747dd510 --- /dev/null +++ b/backend/app/routers/c3po.py @@ -0,0 +1,31 @@ +from fastapi import APIRouter, Depends +from sqlalchemy.orm import Session +from app.middleware.middleware import get_db +from app.util.logger import get_logger +from app import schemas, controllers +from app.middleware.keycloak_authenticator import get_current_user +from app.config.settings import Settings +from app.middleware.decorators import publisher_only + +logger = get_logger(__name__) +env_settings = Settings() + +router = APIRouter() + + +@router.post("/processing-request", response_model=schemas.C3poResults) +@publisher_only +async def post_c3po_request( + body: schemas.C3poRequest, + user: schemas.User = Depends(get_current_user), +): + return await controllers.forward_request(body, user) + + +@router.get("/rule", response_model=list[schemas.RuleSetOut]) +@publisher_only +async def get_version_rules( + user: schemas.User = Depends(get_current_user), + db: Session = Depends(get_db), +): + return controllers.get_version_rules() diff --git a/backend/app/routers/default.py b/backend/app/routers/default.py deleted file mode 100644 index 6429ebe2..00000000 --- a/backend/app/routers/default.py +++ /dev/null @@ -1,232 +0,0 @@ -from fastapi import APIRouter, HTTPException, status, Depends -from sqlalchemy.orm import Session -import logging -from sqlalchemy import or_, and_, func, sql, desc -import pandas as pd -from fastapi.responses import StreamingResponse -import io -import datetime -import csv -import json -from app.config.settings import Settings -from app.middleware.middleware import get_db -from app.services.algoritme_version import db_list_to_python_list -from app import models, schemas, controllers - -router = APIRouter() -logger = logging.getLogger(__name__) - -env_settings = Settings() - - -@router.post( - "/algoritme/", - response_model=schemas.AlgoritmeQueryResponse, -) -async def get_all( - algoritme_query: schemas.algoritme_version.AlgoritmeQuery, - db: Session = Depends(get_db), -): - model = models.AlgoritmeVersion - - or_clauses_search = [] - - exclude_columns = [ - "id", - "algoritme_id", - "create_dt", - "end_dt", - "dpia", - "mprd", - "published", - "preview_active", - "released", - "source_id", - ] - if len(algoritme_query.search) > 0: - # Select columns to search in from the table - columns = model.__table__.columns - search_columns = [col for col in columns if col.key not in exclude_columns] - - # Add searching in every column to the or clauses - for col in search_columns: - or_clauses_search.append(col.ilike(f"%{algoritme_query.search.lower()}%")) - - and_clauses_filters = [] - if len(algoritme_query.filters) > 0: - for a_filter in algoritme_query.filters: - column = getattr(model, a_filter.attribute) - # a_filter.value is a list when multiple filters of the same column (e.g. organization) are applied. - if type(a_filter.value) is list: - and_clauses_filters.append(column.in_(a_filter.value)) - else: - and_clauses_filters.append(column == a_filter.value) - - search_clause = or_(*or_clauses_search) - - # Public website sees only published, Concept website sees only released. - if (env_settings.type == "API") or (env_settings.type == "DEV"): - show_clause = model.released - else: # env_settings.type == "PUB" - show_clause = model.published - - where_clause = and_(search_clause, *and_clauses_filters, show_clause) - - query = ( - db.query(model) - .order_by(model.algoritme_id) - .filter(where_clause) - .limit(algoritme_query.limit) - .offset((algoritme_query.page - 1) * algoritme_query.limit) - ) - - # Constructs returning aggregation dictionary. - aggregation_columns = [model.organization] - aggregation_queries = [] - for c in aggregation_columns: - query_agg = db.query( - sql.expression.literal(c.name).label("aggregation_column"), - c.label("aggregation_value"), - func.count(c).label("count"), - ) - - query_agg = query_agg.filter(where_clause).group_by(c) - aggregation_queries.append(query_agg) - - aggregation_union = aggregation_queries[0].union(*aggregation_queries[1:]).all() - - # Constructs returning total count. - total_count = db.query(func.count(model.id)).filter(where_clause).scalar() - - results = [] - for q in query.all(): - parsed_algo = db_list_to_python_list(q) - algo_dict = parsed_algo.__dict__.copy() - algo_dict["lars"] = q.lars - results.append(algo_dict) - - return { - "results": results, - "total_count": total_count, - "aggregations": [ - { - "values": [a for a in aggregation_union if a[0] == c.name], - "aggregation_attribute": c.name, - } - for c in aggregation_columns - ], - } - - -output_schemas = schemas.util.get_all_output_schemas_union() - - -@router.get( - "/algoritme/{lars}/", - response_model=output_schemas | None, -) -async def get_one(lars: str, db: Session = Depends(get_db)): - if lars[0] == "C": - result = ( - db.query(models.AlgoritmeVersion) - .filter( - models.AlgoritmeVersion.lars == lars[1:], - models.AlgoritmeVersion.preview_active, - ) - .first() - ) - controllers.disable_preview( - lars=lars[1:], - db=db, - user="anonymous website visitor", - reason=models.OperationEnum.preview_used, - ) - else: - # Public website sees only published, Concept website sees only released. - if (env_settings.type == "API") or (env_settings.type == "DEV"): - show_clause = models.AlgoritmeVersion.released - else: # env_settings.type == "PUB" - show_clause = models.AlgoritmeVersion.published - - result = ( - db.query(models.AlgoritmeVersion) - .filter( - models.AlgoritmeVersion.lars == lars, - show_clause, - ) - .order_by(desc(models.AlgoritmeVersion.create_dt)) - .first() - ) - - if not result: - raise HTTPException( - status_code=status.HTTP_404_NOT_FOUND, - detail="Kan algoritme niet vinden.", - ) - - result = db_list_to_python_list(result) - return result - - -excel_schema = schemas.get_algorithm_export_schema(truncated=True) - - -@router.get("/file/algoritme") -async def download_algoritme(db: Session = Depends(get_db)): - result = ( - db.query(models.AlgoritmeVersion) - .filter(models.AlgoritmeVersion.published) - .order_by(models.AlgoritmeVersion.algoritme_id) - .all() - ) - - # Use schema to filter output of query - data = [excel_schema.from_orm(r).dict() for r in result] - df = pd.DataFrame(data) - - stream = io.BytesIO() - df = df.replace(r"\n", "", regex=True) - df.to_csv(stream, index=False, quoting=csv.QUOTE_ALL, encoding="utf-8-sig") - - response = StreamingResponse(iter([stream.getvalue()]), media_type="text/csv") - timestamp = datetime.datetime.now().strftime("%Y%m%d") - filename = f"algoritmeregister_{timestamp}.csv" - - response.headers["Content-Encoding"] = "UTF-8" - response.headers["Content-type"] = "text/csv; charset=UTF-8" - response.headers["Content-Disposition"] = f"attachment; filename={filename}" - - return response - - -json_schema = schemas.get_algorithm_export_schema(truncated=False) -if (env_settings.type == "API") or (env_settings.type == "DEV"): - - @router.get( - "/json/algoritme", - response_model=list[json_schema], - ) - async def export_algoritme_json(db: Session = Depends(get_db)): - result = ( - db.query(models.algoritme_version.AlgoritmeVersion) - .filter(models.AlgoritmeVersion.published) - .order_by(models.AlgoritmeVersion.algoritme_id) - .all() - ) - - data = [json_schema.from_orm(r).dict() for r in result] - df = pd.DataFrame(data) - df["create_dt"] = df["create_dt"].astype(str) - - df = df[(df["owner"] != "sandbox")] - data_out = df.to_dict(orient="records") - - stream = io.BytesIO() - stream.write(json.dumps(data_out).encode()) - response = StreamingResponse(iter([stream.getvalue()]), media_type="json") - - # response.headers["Content-Encoding"] = "UTF-8" - # response.headers["Content-type"] = "json; charset=UTF-8" - response.headers["Content-Disposition"] = "attachment; filename=pub_data.json" - - return response diff --git a/backend/app/routers/downloads.py b/backend/app/routers/downloads.py new file mode 100644 index 00000000..bef18fed --- /dev/null +++ b/backend/app/routers/downloads.py @@ -0,0 +1,51 @@ +from fastapi import Depends, Path, Query, APIRouter +from fastapi.responses import FileResponse +from sqlalchemy.orm import Session +from app import schemas, middleware +from app.controllers import ( + generate_word_download, + generate_excel_download, + generate_pdf_download, +) +from app.middleware.decorators import authorized_user_only + +router = APIRouter() + + +@router.get( + "/organizations/{organization_name}", + response_class=FileResponse, +) +@authorized_user_only +async def get_file_many( + db: Session = Depends(middleware.get_db), + as_org: str = Path(alias="organization_name"), + filetype: str = Query(alias="filetype"), + user: schemas.User = Depends(middleware.get_current_user), +): + if not filetype or filetype == "word": + return generate_word_download(db, org_name=as_org) + if filetype == "excel": + return generate_excel_download(db, org_name=as_org, which_version="latest") + if filetype == "pdf": + return generate_pdf_download(db, org_name=as_org) + + +@router.get( + "/organizations/{organization_name}/algorithms/{algorithm_id}", + response_class=FileResponse, +) +@authorized_user_only +async def get_file_one( + db: Session = Depends(middleware.get_db), + lars: str = Path(alias="algorithm_id"), + as_org: str = Path(alias="organization_name"), + filetype: str = Query(alias="filetype"), + user: schemas.User = Depends(middleware.get_current_user), +): + if not filetype or filetype == "word": + return generate_word_download(db, lars=lars) + if filetype == "excel": + return generate_excel_download(db, lars=lars, which_version="latest") + if filetype == "pdf": + return generate_pdf_download(db, lars=lars) diff --git a/backend/app/routers/organization.py b/backend/app/routers/organization.py new file mode 100644 index 00000000..6464da5e --- /dev/null +++ b/backend/app/routers/organization.py @@ -0,0 +1,36 @@ +from fastapi import Depends, APIRouter, Path +from sqlalchemy.orm import Session +from app import schemas, middleware +from app.controllers import get_orgs, create_org, update_org +from app.middleware.decorators import admin_only, publisher_only + +router = APIRouter() + + +@router.get("/organization", response_model=list[schemas.OrganisationIn]) +async def get_all_orgs( + db: Session = Depends(middleware.get_db), + user: schemas.User = Depends(middleware.get_current_user), +): + return get_orgs(db, user=user) + + +@router.post("/organization", response_model=None) +@admin_only +async def post_org( + body: schemas.OrganisationIn, + db: Session = Depends(middleware.get_db), + user: schemas.User = Depends(middleware.get_current_user), +): + create_org(db, body) + + +@router.put("/organization/{org_id}", response_model=None) +@publisher_only +async def put_org( + body: schemas.OrganisationIn, + as_org: str = Path(alias="org_id"), + db: Session = Depends(middleware.get_db), + user: schemas.User = Depends(middleware.get_current_user), +): + update_org(db, as_org, body) diff --git a/backend/app/routers/public/__init__.py b/backend/app/routers/public/__init__.py new file mode 100644 index 00000000..27aa71a6 --- /dev/null +++ b/backend/app/routers/public/__init__.py @@ -0,0 +1 @@ +from . import * # noqa diff --git a/backend/app/routers/aggregations.py b/backend/app/routers/public/aggregations.py similarity index 54% rename from backend/app/routers/aggregations.py rename to backend/app/routers/public/aggregations.py index 62e7bbbe..15861ddb 100644 --- a/backend/app/routers/aggregations.py +++ b/backend/app/routers/public/aggregations.py @@ -1,5 +1,6 @@ from fastapi import APIRouter, Query from fastapi import Depends +from pydantic import BaseModel from app.middleware.middleware import get_db from sqlalchemy.orm import Session from sqlalchemy import text @@ -13,70 +14,81 @@ env_settings = Settings() -@router.get("/columns/") +class Column(BaseModel): + column_name: str + is_nullable: str + + +@router.get("/columns/", response_model=list[Column]) async def get_columns(db: Session = Depends(get_db)): + skip_columns = [ + "algoritme_id", + "id", + "create_dt", + "published", + "released", + "preview_active", + "language", + ] + skip_columns_statement = [ + f"AND column_name != '{column}' " for column in skip_columns + ] stmt = text( - """SELECT column_name, is_nullable + f"""SELECT column_name, is_nullable FROM information_schema.columns WHERE table_schema = 'public' AND table_name = 'algoritme_version' - AND column_name != 'algoritme_id' - AND column_name != 'id' - AND column_name != 'end_dt' - AND column_name != 'create_dt' - AND column_name != 'published' + {" ".join(skip_columns_statement)} ORDER BY ordinal_position """ ) - return db.execute(stmt).all() + results = db.execute(stmt).all() + + output = [{"column_name": r[0], "is_nullable": r[1]} for r in results] + return output @router.get("/db-count/") async def get_total_count(db: Session = Depends(get_db)) -> int: - if (env_settings.type == "API") or (env_settings.type == "DEV"): - stmt = text("SELECT count(id) FROM algoritme_version WHERE released IS TRUE") - else: - stmt = text("SELECT count(id) FROM algoritme_version WHERE published IS TRUE") + stmt = text( + "SELECT count(id) FROM algoritme_version WHERE published IS TRUE AND language='NLD'" + ) return int(db.execute(stmt).all()[0][0]) @router.get("/db-count/{column}") async def get_count_per_type(column: Columns, db: Session = Depends(get_db)): - if (env_settings.type == "API") or (env_settings.type == "DEV"): - column_filter = "algoritme_version.released" - else: - column_filter = "algoritme_version.published" - stmt = text( f""" SELECT count(1), {column.value} as descriptor FROM algoritme_version - WHERE {column_filter} IS TRUE + WHERE published IS TRUE + AND language='NLD' GROUP BY {column.value} ORDER BY count(1) desc - LIMIT 10 + LIMIT 20 """ ) - return db.execute(stmt).all() + results = db.execute(stmt).all() + + output = [{"count": r[0], "descriptor": r[1]} for r in results] + + return output @router.get("/completeness/") async def get_count_with_filled_columns( columns: list[Columns] = Query(default=None), db: Session = Depends(get_db) ): - column_list = [col[0] for col in columns] - - ignore_columns = ["end_dt", "published"] + ignore_columns = ["end_dt", "published", "released", "language"] columns_model_list = [ col for col in models.AlgoritmeVersion.__table__.columns if col.key not in ignore_columns ] - if "*" not in column_list: - columns_model_list = [ - col for col in columns_model_list if col.key in column_list - ] + if "*" not in columns: + columns_model_list = [col for col in columns_model_list if col.key in columns] table = ( db.query(*columns_model_list).filter(models.AlgoritmeVersion.published).all() @@ -86,9 +98,9 @@ def is_filled(cell) -> bool: checks = [cell != "", cell is not None] return all(checks) - compliantRows = [] + compliant_rows = [] for row in table: - compliantRow = all([is_filled(cell) for cell in row]) - if compliantRow: - compliantRows.append(row) - return len(compliantRows) + compliant_row = all([is_filled(cell) for cell in row]) + if compliant_row: + compliant_rows.append(row) + return len(compliant_rows) diff --git a/backend/app/routers/public/default.py b/backend/app/routers/public/default.py new file mode 100644 index 00000000..c12c4f07 --- /dev/null +++ b/backend/app/routers/public/default.py @@ -0,0 +1,232 @@ +import io +import json +import logging +import pandas as pd +from fastapi import APIRouter, HTTPException, status, Depends, Path, BackgroundTasks +from fastapi.responses import StreamingResponse +from sqlalchemy import and_, func, desc +from sqlalchemy.orm import Session +from app.config.settings import Settings +from app.middleware.middleware import get_db +from app.services.algoritme_version import db_list_to_python_list +from app import models, schemas, controllers +from app.controllers.smart_search import perform_smart_search, perform_suggestion_search + +router = APIRouter() +logger = logging.getLogger(__name__) + +env_settings = Settings() + + +# 'Get' version of the endpoint, but does not appear to work with frontend. +# @router.get( +# "/algoritme/", +# response_model=schemas.AlgoritmeQueryResponse, +# ) +# async def get_all( +# searchtext: str | None = None, +# organisation: str | None = None, +# page: int = 1, +# limit: int = 10, +# db: Session = Depends(get_db), +# ) -> schemas.AlgoritmeQueryResponse: + + +@router.post( + "/algoritme/{language}", + response_model=schemas.AlgoritmeQueryResponse, +) +async def get_all( + algoritme_query: schemas.algoritme_version.AlgoritmeQuery, + db: Session = Depends(get_db), + language: schemas.Language = Path(alias="language"), +) -> schemas.AlgoritmeQueryResponse: + return perform_smart_search(algoritme_query, db, language) + + +@router.get( + "/suggestion/{language}/{search}", response_model=schemas.SearchSuggestionResponse +) +async def get_search_suggestion( + search: str = "", + db: Session = Depends(get_db), + language: schemas.Language = Path(alias="language"), +) -> schemas.SearchSuggestionResponse: + return perform_suggestion_search(search, db, language) + + +@router.get( + "/algoritme/{language}/{lars}", + response_model=schemas.AlgoritmeVersionGetOne | None, +) +async def get_one( + lars: str, + background_tasks: BackgroundTasks, + db: Session = Depends(get_db), + language: schemas.Language = Path(alias="language"), +): + if lars[0] == "C": + result = ( + db.query(models.AlgoritmeVersion) + .filter( + models.AlgoritmeVersion.lars == lars[1:], + models.AlgoritmeVersion.preview_active, + models.AlgoritmeVersion.language == language, + ) + .first() + ) + + background_tasks.add_task( + controllers.disable_preview, + lars=lars[1:], + db=db, + user="anonymous website visitor", + reason=schemas.OperationEnum.preview_used, + ) + else: + result = ( + db.query(models.AlgoritmeVersion) + .filter( + models.AlgoritmeVersion.lars == lars, + models.AlgoritmeVersion.published, + models.AlgoritmeVersion.language == language, + ) + .order_by(desc(models.AlgoritmeVersion.create_dt)) + .first() + ) + + if not result: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail="Kan algoritme niet vinden.", + ) + + result = db_list_to_python_list(result) + + result = schemas.AlgoritmeVersionDB.from_orm(result) + return result + + +@router.get( + "/highlighted/{language}", + response_model=list[schemas.HighlightedAlgorithmResponse], +) +async def get_highlighted( + db: Session = Depends(get_db), language: schemas.Language = Path(alias="language") +) -> list[schemas.HighlightedAlgorithmResponse]: + latest_upload_owner = ( + db.query( + models.Algoritme.organisation_id, + func.max(models.AlgoritmeVersion.create_dt).label("max_creation_dt"), + ) + .join( + models.Algoritme, + models.Algoritme.id == models.AlgoritmeVersion.algoritme_id, + ) + .filter( + models.AlgoritmeVersion.published, + models.AlgoritmeVersion.language == language, + ) + .group_by(models.Algoritme.organisation_id) + .subquery() + ) + + latest_algo_owner = ( + db.query(models.AlgoritmeVersion) + .join( + latest_upload_owner, + and_( + latest_upload_owner.c.max_creation_dt + == models.AlgoritmeVersion.create_dt + ), + ) + .filter(models.AlgoritmeVersion.language == language) + .order_by(desc(models.AlgoritmeVersion.create_dt)) + .limit(3) + .all() + ) + + for n, _ in enumerate(latest_algo_owner): + latest_algo_owner[n] = db_list_to_python_list(latest_algo_owner[n]) + return [ + schemas.HighlightedAlgorithmResponse.from_orm(alg) for alg in latest_algo_owner + ] + + +json_schema = schemas.get_algorithm_export_schema(truncated=False) + + +@router.get( + "/json/algoritme", + response_model=list[json_schema], +) +async def export_algoritme_json(db: Session = Depends(get_db)): + result = ( + db.query(models.algoritme_version.AlgoritmeVersion) + .filter(models.AlgoritmeVersion.published) + .order_by(models.AlgoritmeVersion.algoritme_id) + .all() + ) + + if len(result) == 0: + raise HTTPException(status.HTTP_404_NOT_FOUND, detail="DATA_NOT_FOUND") + + data = [json_schema.from_orm(r).dict() for r in result] + df = pd.DataFrame(data) + if len(df.index) > 0: + df["create_dt"] = df["create_dt"].astype(str) + + df = df[(df["owner"] != "sandbox")] + + data_out = df.to_dict(orient="records") + + stream = io.BytesIO() + stream.write(json.dumps(data_out).encode()) + response = StreamingResponse(iter([stream.getvalue()]), media_type="json") + + response.headers["Content-Disposition"] = "attachment; filename=pub_data.json" + + return response + + +@router.get("/sitemap-urls") +async def get_sitemap_urls(db: Session = Depends(get_db)): + algorithms_nl = ( + db.query(models.Algoritme) + .join( + models.AlgoritmeVersion, + models.Algoritme.id == models.AlgoritmeVersion.algoritme_id, + ) + .filter(models.AlgoritmeVersion.language == schemas.Language.NLD) + .order_by(models.Algoritme.lars) + .all() + ) + + result_dict = [] + for algorithm in algorithms_nl: + algo_dict = { + "loc": "/nl/algoritme/" + algorithm.lars, + "lastmod": algorithm.create_dt, + "changefreq": "daily", + } + result_dict.append(algo_dict) + + algorithms_en = ( + db.query(models.Algoritme) + .join( + models.AlgoritmeVersion, + models.Algoritme.id == models.AlgoritmeVersion.algoritme_id, + ) + .filter(models.AlgoritmeVersion.language == schemas.Language.ENG) + .order_by(models.Algoritme.lars) + .all() + ) + for algorithm in algorithms_en: + algo_dict = { + "loc": "/en/algoritme/" + algorithm.lars, + "lastmod": algorithm.create_dt, + "changefreq": "daily", + } + result_dict.append(algo_dict) + + return result_dict diff --git a/backend/app/routers/public/downloads.py b/backend/app/routers/public/downloads.py new file mode 100644 index 00000000..5ef0d04b --- /dev/null +++ b/backend/app/routers/public/downloads.py @@ -0,0 +1,39 @@ +from fastapi import APIRouter, Path, Depends, Query +from fastapi.responses import FileResponse +from sqlalchemy.orm import Session +from app import middleware, schemas + +from app.controllers import generate_excel_download + +router = APIRouter() + + +@router.get( + "/{language}", + response_class=FileResponse, +) +async def get_file_all( + db: Session = Depends(middleware.get_db), + lang: schemas.Language = Path(alias="language"), + filetype: str = Query(alias="filetype"), +): + # if filetype == "word": + # return generate_word_download(db, lang, which_version="published") + if filetype == "excel": + return generate_excel_download(db, lang, which_version="published") + + +@router.get( + "/algorithms/{algorithm_id}/{language}", + response_class=FileResponse, +) +async def get_file_one( + db: Session = Depends(middleware.get_db), + lars: str = Path(alias="algorithm_id"), + lang: schemas.Language = Path(alias="language"), + filetype: str = Query(alias="filetype"), +): + # if filetype == "word": + # return generate_word_download(db, lang, lars=lars, which_version="published") + if filetype == "excel": + return generate_excel_download(db, lang, lars=lars, which_version="published") diff --git a/backend/app/routers/text_loader.py b/backend/app/routers/public/text_loader.py similarity index 63% rename from backend/app/routers/text_loader.py rename to backend/app/routers/public/text_loader.py index b710c1e3..d285b252 100644 --- a/backend/app/routers/text_loader.py +++ b/backend/app/routers/public/text_loader.py @@ -1,31 +1,23 @@ import logging -from fastapi import APIRouter +from fastapi import APIRouter, Body import json +import os from app.config.settings import Settings env_settings = Settings() -# Application specific code -if (env_settings.type == "PUB") or (env_settings.type == "DEV"): - fe_api_url = "/api" -else: - fe_api_url = "/conceptapi" - -GET_URL = f"{fe_api_url}/supporting-text" +GET_URL = "/api/supporting-text" JSON_PATH = "app/data/text_loader/supporting_text.json" +JSON_DEFAULT_PATH = "app/data/default/supporting_text.json" -# Boilerplate -if env_settings.type == "DEV": - include_in_schema = True -else: - include_in_schema = False +include_in_schema = False logger = logging.getLogger(__name__) router = APIRouter() def get_content_json() -> dict[str, dict[str, dict[str, str]]]: - path = JSON_PATH + path = JSON_PATH if os.path.exists(JSON_PATH) else JSON_DEFAULT_PATH with open(path) as f: content: dict[str, dict[str, dict[str, str]]] = json.load(f) return content diff --git a/backend/app/routers/templates.py b/backend/app/routers/templates.py new file mode 100644 index 00000000..c68a924e --- /dev/null +++ b/backend/app/routers/templates.py @@ -0,0 +1,35 @@ +from fastapi import APIRouter, Depends, Path, HTTPException, status +from app import schemas, middleware +from app.controllers import get_template_summary, get_template_by_id + +router = APIRouter() + +output_schemas = schemas.get_all_output_schemas_union() + + +@router.get("/{standard_version}", response_model=list[schemas.StandardSupplier]) +async def get_template_list( + _: schemas.User = Depends(middleware.get_current_user), + standard_version: str = Path(alias="standard_version"), +): + if standard_version != "0.4.0": + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, detail="ONLY 0_4_0 AVAILABLE" + ) + return get_template_summary(standard_version) + + +@router.get( + "/{standard_version}/{id}", + response_model=schemas.AlgoritmeVersionTemplate | None, +) +async def get_one_template( + _: schemas.User = Depends(middleware.get_current_user), + standard_version: str = Path(alias="standard_version"), + id: str = Path(alias="id"), +): + if standard_version != "0.4.0": + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, detail="ONLY 0_4_0 AVAILABLE" + ) + return get_template_by_id(standard_version, id) diff --git a/backend/app/routers/v0_1_0/algoritme.py b/backend/app/routers/v0_1_0/algoritme.py index 789917d4..afe0e853 100644 --- a/backend/app/routers/v0_1_0/algoritme.py +++ b/backend/app/routers/v0_1_0/algoritme.py @@ -4,8 +4,7 @@ from slowapi.middleware import SlowAPIMiddleware from slowapi.errors import RateLimitExceeded from sqlalchemy.orm import Session -from app import schemas, models, middleware, controllers -from app.controllers import generate_excel_download +from app import schemas, middleware, controllers from app.middleware.decorators import authorized_user_only, publisher_only, admin_only from app.middleware.keycloak_authenticator import get_current_user from app.config.api import api_text, responses @@ -33,19 +32,6 @@ action_router = APIRouter() -@router.get( - "/organizations/{organization_name}/algorithms/download-excel", - include_in_schema=False, -) -@authorized_user_only -async def download_excel( - db: Session = Depends(middleware.get_db), - as_org: str = Path(alias="organization_name"), - user: schemas.User = Depends(middleware.get_current_user), -): - return generate_excel_download(db, as_org) - - @router.get( "/organizations/{organization_name}/algorithms", response_model=list[schemas.AlgorithmSummary], @@ -59,10 +45,9 @@ async def get_all_algorithms( db: Session = Depends(middleware.get_db), user: schemas.User = Depends(middleware.get_current_user), ) -> list[schemas.AlgorithmSummary]: - result = controllers.algoritme_version.get_all_newest( + result = controllers.algoritme_version.get_algorithm_summary( as_org=as_org, db=db, - user=user, ) return result @@ -80,8 +65,8 @@ async def get_one_algorithm( lars: str = Path(alias="algorithm_id"), db: Session = Depends(middleware.get_db), user: schemas.User = Depends(get_current_user), -) -> models.AlgoritmeVersion: - return controllers.algoritme_version.get_one_newest(lars=lars, db=db, user=user) +) -> schemas.AlgoritmeVersionDB: + return controllers.algoritme_version.get_one_newest(lars=lars, db=db) @router.post( @@ -102,8 +87,9 @@ async def create_one_algorithm( if body.standard_version is None: # type: ignore body.standard_version = version_str + algoritme_version = schemas.AlgoritmeVersionContent(**body.dict()) return controllers.algoritme_version.post_one( - as_org=as_org, body=body, db=db, user=user + as_org=as_org, body=algoritme_version, db=db, user=user ) @@ -121,12 +107,9 @@ async def update_one_algorithm( db: Session = Depends(middleware.get_db), user: schemas.User = Depends(get_current_user), ) -> schemas.AlgorithmActionResponse | None: - # The standard_version can not be required, because it isn't according to BZK. - if body.standard_version is None: # type: ignore - body.standard_version = version_str - + algoritme_version = schemas.AlgoritmeVersionContent(**body.dict()) return controllers.algoritme_version.update_new_version( - body=body, lars=lars, db=db, user=user + body=algoritme_version, lars=lars, db=db, user=user ) @@ -164,8 +147,8 @@ async def get_one_published_algorithm( lars: str = Path(alias="algorithm_id"), db: Session = Depends(middleware.get_db), user: schemas.User = Depends(get_current_user), -) -> models.AlgoritmeVersion: - return controllers.algoritme_version.get_one_published(lars=lars, db=db, user=user) +) -> schemas.AlgoritmeVersionDB: + return controllers.algoritme_version.get_one_published(lars=lars, db=db) @action_router.delete( @@ -176,12 +159,15 @@ async def get_one_published_algorithm( ) @authorized_user_only async def retract_one_published_algorithm( + background_tasks: BackgroundTasks, as_org: str = Path(alias="organization_name"), lars: str = Path(alias="algorithm_id"), db: Session = Depends(middleware.get_db), user: schemas.User = Depends(get_current_user), ) -> None: - return controllers.algoritme_version.retract_one(lars=lars, db=db, user=user) + response = controllers.algoritme_version.retract_one(lars=lars, db=db, user=user) + background_tasks.add_task(controllers.handle_retract_mail, lars, db) + return response @action_router.put( @@ -208,16 +194,20 @@ async def release_one_algorithm( responses=responses["publish"], summary=api_text["publish"]["summary"], description=api_text["publish"]["description"], + include_in_schema=False, ) @publisher_only @authorized_user_only async def publish_one_algorithm( + background_tasks: BackgroundTasks, as_org: str = Path(alias="organization_name"), lars: str = Path(alias="algorithm_id"), db: Session = Depends(middleware.get_db), user: schemas.User = Depends(get_current_user), ) -> schemas.AlgorithmActionResponse | None: - return controllers.algoritme_version.publish_one(lars=lars, db=db, user=user) + return controllers.algoritme_version.publish_one( + background_tasks=background_tasks, lars=lars, db=db, user=user + ) @action_router.delete( @@ -235,7 +225,7 @@ async def remove_one_algorithm( db: Session = Depends(middleware.get_db), user: schemas.User = Depends(get_current_user), ) -> schemas.AlgorithmActionResponse | None: - return controllers.algoritme_version.remove_one(lars=lars, db=db, user=user) + return controllers.algoritme_version.remove_one(lars=lars, db=db) api.include_router(router, tags=["Algoritmes in ontwikkeling"]) diff --git a/backend/app/routers/v0_2_3/algoritme.py b/backend/app/routers/v0_2_3/algoritme.py index 789917d4..afe0e853 100644 --- a/backend/app/routers/v0_2_3/algoritme.py +++ b/backend/app/routers/v0_2_3/algoritme.py @@ -4,8 +4,7 @@ from slowapi.middleware import SlowAPIMiddleware from slowapi.errors import RateLimitExceeded from sqlalchemy.orm import Session -from app import schemas, models, middleware, controllers -from app.controllers import generate_excel_download +from app import schemas, middleware, controllers from app.middleware.decorators import authorized_user_only, publisher_only, admin_only from app.middleware.keycloak_authenticator import get_current_user from app.config.api import api_text, responses @@ -33,19 +32,6 @@ action_router = APIRouter() -@router.get( - "/organizations/{organization_name}/algorithms/download-excel", - include_in_schema=False, -) -@authorized_user_only -async def download_excel( - db: Session = Depends(middleware.get_db), - as_org: str = Path(alias="organization_name"), - user: schemas.User = Depends(middleware.get_current_user), -): - return generate_excel_download(db, as_org) - - @router.get( "/organizations/{organization_name}/algorithms", response_model=list[schemas.AlgorithmSummary], @@ -59,10 +45,9 @@ async def get_all_algorithms( db: Session = Depends(middleware.get_db), user: schemas.User = Depends(middleware.get_current_user), ) -> list[schemas.AlgorithmSummary]: - result = controllers.algoritme_version.get_all_newest( + result = controllers.algoritme_version.get_algorithm_summary( as_org=as_org, db=db, - user=user, ) return result @@ -80,8 +65,8 @@ async def get_one_algorithm( lars: str = Path(alias="algorithm_id"), db: Session = Depends(middleware.get_db), user: schemas.User = Depends(get_current_user), -) -> models.AlgoritmeVersion: - return controllers.algoritme_version.get_one_newest(lars=lars, db=db, user=user) +) -> schemas.AlgoritmeVersionDB: + return controllers.algoritme_version.get_one_newest(lars=lars, db=db) @router.post( @@ -102,8 +87,9 @@ async def create_one_algorithm( if body.standard_version is None: # type: ignore body.standard_version = version_str + algoritme_version = schemas.AlgoritmeVersionContent(**body.dict()) return controllers.algoritme_version.post_one( - as_org=as_org, body=body, db=db, user=user + as_org=as_org, body=algoritme_version, db=db, user=user ) @@ -121,12 +107,9 @@ async def update_one_algorithm( db: Session = Depends(middleware.get_db), user: schemas.User = Depends(get_current_user), ) -> schemas.AlgorithmActionResponse | None: - # The standard_version can not be required, because it isn't according to BZK. - if body.standard_version is None: # type: ignore - body.standard_version = version_str - + algoritme_version = schemas.AlgoritmeVersionContent(**body.dict()) return controllers.algoritme_version.update_new_version( - body=body, lars=lars, db=db, user=user + body=algoritme_version, lars=lars, db=db, user=user ) @@ -164,8 +147,8 @@ async def get_one_published_algorithm( lars: str = Path(alias="algorithm_id"), db: Session = Depends(middleware.get_db), user: schemas.User = Depends(get_current_user), -) -> models.AlgoritmeVersion: - return controllers.algoritme_version.get_one_published(lars=lars, db=db, user=user) +) -> schemas.AlgoritmeVersionDB: + return controllers.algoritme_version.get_one_published(lars=lars, db=db) @action_router.delete( @@ -176,12 +159,15 @@ async def get_one_published_algorithm( ) @authorized_user_only async def retract_one_published_algorithm( + background_tasks: BackgroundTasks, as_org: str = Path(alias="organization_name"), lars: str = Path(alias="algorithm_id"), db: Session = Depends(middleware.get_db), user: schemas.User = Depends(get_current_user), ) -> None: - return controllers.algoritme_version.retract_one(lars=lars, db=db, user=user) + response = controllers.algoritme_version.retract_one(lars=lars, db=db, user=user) + background_tasks.add_task(controllers.handle_retract_mail, lars, db) + return response @action_router.put( @@ -208,16 +194,20 @@ async def release_one_algorithm( responses=responses["publish"], summary=api_text["publish"]["summary"], description=api_text["publish"]["description"], + include_in_schema=False, ) @publisher_only @authorized_user_only async def publish_one_algorithm( + background_tasks: BackgroundTasks, as_org: str = Path(alias="organization_name"), lars: str = Path(alias="algorithm_id"), db: Session = Depends(middleware.get_db), user: schemas.User = Depends(get_current_user), ) -> schemas.AlgorithmActionResponse | None: - return controllers.algoritme_version.publish_one(lars=lars, db=db, user=user) + return controllers.algoritme_version.publish_one( + background_tasks=background_tasks, lars=lars, db=db, user=user + ) @action_router.delete( @@ -235,7 +225,7 @@ async def remove_one_algorithm( db: Session = Depends(middleware.get_db), user: schemas.User = Depends(get_current_user), ) -> schemas.AlgorithmActionResponse | None: - return controllers.algoritme_version.remove_one(lars=lars, db=db, user=user) + return controllers.algoritme_version.remove_one(lars=lars, db=db) api.include_router(router, tags=["Algoritmes in ontwikkeling"]) diff --git a/backend/app/routers/v0_3_1/algoritme.py b/backend/app/routers/v0_3_1/algoritme.py index 789917d4..afe0e853 100644 --- a/backend/app/routers/v0_3_1/algoritme.py +++ b/backend/app/routers/v0_3_1/algoritme.py @@ -4,8 +4,7 @@ from slowapi.middleware import SlowAPIMiddleware from slowapi.errors import RateLimitExceeded from sqlalchemy.orm import Session -from app import schemas, models, middleware, controllers -from app.controllers import generate_excel_download +from app import schemas, middleware, controllers from app.middleware.decorators import authorized_user_only, publisher_only, admin_only from app.middleware.keycloak_authenticator import get_current_user from app.config.api import api_text, responses @@ -33,19 +32,6 @@ action_router = APIRouter() -@router.get( - "/organizations/{organization_name}/algorithms/download-excel", - include_in_schema=False, -) -@authorized_user_only -async def download_excel( - db: Session = Depends(middleware.get_db), - as_org: str = Path(alias="organization_name"), - user: schemas.User = Depends(middleware.get_current_user), -): - return generate_excel_download(db, as_org) - - @router.get( "/organizations/{organization_name}/algorithms", response_model=list[schemas.AlgorithmSummary], @@ -59,10 +45,9 @@ async def get_all_algorithms( db: Session = Depends(middleware.get_db), user: schemas.User = Depends(middleware.get_current_user), ) -> list[schemas.AlgorithmSummary]: - result = controllers.algoritme_version.get_all_newest( + result = controllers.algoritme_version.get_algorithm_summary( as_org=as_org, db=db, - user=user, ) return result @@ -80,8 +65,8 @@ async def get_one_algorithm( lars: str = Path(alias="algorithm_id"), db: Session = Depends(middleware.get_db), user: schemas.User = Depends(get_current_user), -) -> models.AlgoritmeVersion: - return controllers.algoritme_version.get_one_newest(lars=lars, db=db, user=user) +) -> schemas.AlgoritmeVersionDB: + return controllers.algoritme_version.get_one_newest(lars=lars, db=db) @router.post( @@ -102,8 +87,9 @@ async def create_one_algorithm( if body.standard_version is None: # type: ignore body.standard_version = version_str + algoritme_version = schemas.AlgoritmeVersionContent(**body.dict()) return controllers.algoritme_version.post_one( - as_org=as_org, body=body, db=db, user=user + as_org=as_org, body=algoritme_version, db=db, user=user ) @@ -121,12 +107,9 @@ async def update_one_algorithm( db: Session = Depends(middleware.get_db), user: schemas.User = Depends(get_current_user), ) -> schemas.AlgorithmActionResponse | None: - # The standard_version can not be required, because it isn't according to BZK. - if body.standard_version is None: # type: ignore - body.standard_version = version_str - + algoritme_version = schemas.AlgoritmeVersionContent(**body.dict()) return controllers.algoritme_version.update_new_version( - body=body, lars=lars, db=db, user=user + body=algoritme_version, lars=lars, db=db, user=user ) @@ -164,8 +147,8 @@ async def get_one_published_algorithm( lars: str = Path(alias="algorithm_id"), db: Session = Depends(middleware.get_db), user: schemas.User = Depends(get_current_user), -) -> models.AlgoritmeVersion: - return controllers.algoritme_version.get_one_published(lars=lars, db=db, user=user) +) -> schemas.AlgoritmeVersionDB: + return controllers.algoritme_version.get_one_published(lars=lars, db=db) @action_router.delete( @@ -176,12 +159,15 @@ async def get_one_published_algorithm( ) @authorized_user_only async def retract_one_published_algorithm( + background_tasks: BackgroundTasks, as_org: str = Path(alias="organization_name"), lars: str = Path(alias="algorithm_id"), db: Session = Depends(middleware.get_db), user: schemas.User = Depends(get_current_user), ) -> None: - return controllers.algoritme_version.retract_one(lars=lars, db=db, user=user) + response = controllers.algoritme_version.retract_one(lars=lars, db=db, user=user) + background_tasks.add_task(controllers.handle_retract_mail, lars, db) + return response @action_router.put( @@ -208,16 +194,20 @@ async def release_one_algorithm( responses=responses["publish"], summary=api_text["publish"]["summary"], description=api_text["publish"]["description"], + include_in_schema=False, ) @publisher_only @authorized_user_only async def publish_one_algorithm( + background_tasks: BackgroundTasks, as_org: str = Path(alias="organization_name"), lars: str = Path(alias="algorithm_id"), db: Session = Depends(middleware.get_db), user: schemas.User = Depends(get_current_user), ) -> schemas.AlgorithmActionResponse | None: - return controllers.algoritme_version.publish_one(lars=lars, db=db, user=user) + return controllers.algoritme_version.publish_one( + background_tasks=background_tasks, lars=lars, db=db, user=user + ) @action_router.delete( @@ -235,7 +225,7 @@ async def remove_one_algorithm( db: Session = Depends(middleware.get_db), user: schemas.User = Depends(get_current_user), ) -> schemas.AlgorithmActionResponse | None: - return controllers.algoritme_version.remove_one(lars=lars, db=db, user=user) + return controllers.algoritme_version.remove_one(lars=lars, db=db) api.include_router(router, tags=["Algoritmes in ontwikkeling"]) diff --git a/backend/app/routers/v0_4_0/algoritme.py b/backend/app/routers/v0_4_0/algoritme.py index 789917d4..afe0e853 100644 --- a/backend/app/routers/v0_4_0/algoritme.py +++ b/backend/app/routers/v0_4_0/algoritme.py @@ -4,8 +4,7 @@ from slowapi.middleware import SlowAPIMiddleware from slowapi.errors import RateLimitExceeded from sqlalchemy.orm import Session -from app import schemas, models, middleware, controllers -from app.controllers import generate_excel_download +from app import schemas, middleware, controllers from app.middleware.decorators import authorized_user_only, publisher_only, admin_only from app.middleware.keycloak_authenticator import get_current_user from app.config.api import api_text, responses @@ -33,19 +32,6 @@ action_router = APIRouter() -@router.get( - "/organizations/{organization_name}/algorithms/download-excel", - include_in_schema=False, -) -@authorized_user_only -async def download_excel( - db: Session = Depends(middleware.get_db), - as_org: str = Path(alias="organization_name"), - user: schemas.User = Depends(middleware.get_current_user), -): - return generate_excel_download(db, as_org) - - @router.get( "/organizations/{organization_name}/algorithms", response_model=list[schemas.AlgorithmSummary], @@ -59,10 +45,9 @@ async def get_all_algorithms( db: Session = Depends(middleware.get_db), user: schemas.User = Depends(middleware.get_current_user), ) -> list[schemas.AlgorithmSummary]: - result = controllers.algoritme_version.get_all_newest( + result = controllers.algoritme_version.get_algorithm_summary( as_org=as_org, db=db, - user=user, ) return result @@ -80,8 +65,8 @@ async def get_one_algorithm( lars: str = Path(alias="algorithm_id"), db: Session = Depends(middleware.get_db), user: schemas.User = Depends(get_current_user), -) -> models.AlgoritmeVersion: - return controllers.algoritme_version.get_one_newest(lars=lars, db=db, user=user) +) -> schemas.AlgoritmeVersionDB: + return controllers.algoritme_version.get_one_newest(lars=lars, db=db) @router.post( @@ -102,8 +87,9 @@ async def create_one_algorithm( if body.standard_version is None: # type: ignore body.standard_version = version_str + algoritme_version = schemas.AlgoritmeVersionContent(**body.dict()) return controllers.algoritme_version.post_one( - as_org=as_org, body=body, db=db, user=user + as_org=as_org, body=algoritme_version, db=db, user=user ) @@ -121,12 +107,9 @@ async def update_one_algorithm( db: Session = Depends(middleware.get_db), user: schemas.User = Depends(get_current_user), ) -> schemas.AlgorithmActionResponse | None: - # The standard_version can not be required, because it isn't according to BZK. - if body.standard_version is None: # type: ignore - body.standard_version = version_str - + algoritme_version = schemas.AlgoritmeVersionContent(**body.dict()) return controllers.algoritme_version.update_new_version( - body=body, lars=lars, db=db, user=user + body=algoritme_version, lars=lars, db=db, user=user ) @@ -164,8 +147,8 @@ async def get_one_published_algorithm( lars: str = Path(alias="algorithm_id"), db: Session = Depends(middleware.get_db), user: schemas.User = Depends(get_current_user), -) -> models.AlgoritmeVersion: - return controllers.algoritme_version.get_one_published(lars=lars, db=db, user=user) +) -> schemas.AlgoritmeVersionDB: + return controllers.algoritme_version.get_one_published(lars=lars, db=db) @action_router.delete( @@ -176,12 +159,15 @@ async def get_one_published_algorithm( ) @authorized_user_only async def retract_one_published_algorithm( + background_tasks: BackgroundTasks, as_org: str = Path(alias="organization_name"), lars: str = Path(alias="algorithm_id"), db: Session = Depends(middleware.get_db), user: schemas.User = Depends(get_current_user), ) -> None: - return controllers.algoritme_version.retract_one(lars=lars, db=db, user=user) + response = controllers.algoritme_version.retract_one(lars=lars, db=db, user=user) + background_tasks.add_task(controllers.handle_retract_mail, lars, db) + return response @action_router.put( @@ -208,16 +194,20 @@ async def release_one_algorithm( responses=responses["publish"], summary=api_text["publish"]["summary"], description=api_text["publish"]["description"], + include_in_schema=False, ) @publisher_only @authorized_user_only async def publish_one_algorithm( + background_tasks: BackgroundTasks, as_org: str = Path(alias="organization_name"), lars: str = Path(alias="algorithm_id"), db: Session = Depends(middleware.get_db), user: schemas.User = Depends(get_current_user), ) -> schemas.AlgorithmActionResponse | None: - return controllers.algoritme_version.publish_one(lars=lars, db=db, user=user) + return controllers.algoritme_version.publish_one( + background_tasks=background_tasks, lars=lars, db=db, user=user + ) @action_router.delete( @@ -235,7 +225,7 @@ async def remove_one_algorithm( db: Session = Depends(middleware.get_db), user: schemas.User = Depends(get_current_user), ) -> schemas.AlgorithmActionResponse | None: - return controllers.algoritme_version.remove_one(lars=lars, db=db, user=user) + return controllers.algoritme_version.remove_one(lars=lars, db=db) api.include_router(router, tags=["Algoritmes in ontwikkeling"]) diff --git a/backend/app/routers/v1_0_0/__init__.py b/backend/app/routers/v1_0_0/__init__.py new file mode 100644 index 00000000..735560ed --- /dev/null +++ b/backend/app/routers/v1_0_0/__init__.py @@ -0,0 +1 @@ +from .algoritme import api # noqa diff --git a/backend/app/routers/v1_0_0/algoritme.py b/backend/app/routers/v1_0_0/algoritme.py new file mode 100644 index 00000000..afe0e853 --- /dev/null +++ b/backend/app/routers/v1_0_0/algoritme.py @@ -0,0 +1,238 @@ +from fastapi import Depends, Path, FastAPI, APIRouter, BackgroundTasks, routing +from slowapi import Limiter, _rate_limit_exceeded_handler +from slowapi.util import get_remote_address +from slowapi.middleware import SlowAPIMiddleware +from slowapi.errors import RateLimitExceeded +from sqlalchemy.orm import Session +from app import schemas, middleware, controllers +from app.middleware.decorators import authorized_user_only, publisher_only, admin_only +from app.middleware.keycloak_authenticator import get_current_user +from app.config.api import api_text, responses + +version = __name__.split(".")[-2] +input_schema = schemas.create_algorithm_in_schema(version) +output_schemas = schemas.get_all_output_schemas_union() + +version_str = version[1:].replace("_", ".") +api = FastAPI( + docs_url="/api-docs", + title=f"Algoritmeregister aanlevering API, versie {version_str} ", + swagger_ui_parameters={ + "displayRequestDuration": True, + "defaultModelsExpandDepth": -1, + }, +) +limiter = Limiter(key_func=get_remote_address, default_limits=["15/minute"]) +api.state.limiter = limiter +api.add_exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler) +api.add_middleware(SlowAPIMiddleware) + +router = APIRouter() +published_router = APIRouter() +action_router = APIRouter() + + +@router.get( + "/organizations/{organization_name}/algorithms", + response_model=list[schemas.AlgorithmSummary], + responses=responses["get_all"], + summary=api_text["get_all"]["summary"], + description=api_text["get_all"]["description"], +) +@authorized_user_only +async def get_all_algorithms( + as_org: str = Path(alias="organization_name"), + db: Session = Depends(middleware.get_db), + user: schemas.User = Depends(middleware.get_current_user), +) -> list[schemas.AlgorithmSummary]: + result = controllers.algoritme_version.get_algorithm_summary( + as_org=as_org, + db=db, + ) + return result + + +@router.get( + "/organizations/{organization_name}/algorithms/{algorithm_id}", + response_model=output_schemas | None, + responses=responses["get_one"], + summary=api_text["get_one"]["summary"], + description=api_text["get_one"]["description"], +) +@authorized_user_only +async def get_one_algorithm( + as_org: str = Path(alias="organization_name"), + lars: str = Path(alias="algorithm_id"), + db: Session = Depends(middleware.get_db), + user: schemas.User = Depends(get_current_user), +) -> schemas.AlgoritmeVersionDB: + return controllers.algoritme_version.get_one_newest(lars=lars, db=db) + + +@router.post( + "/organizations/{organization_name}/algorithms", + response_model=schemas.NewAlgorithmResponse, + responses=responses["post"], + summary=api_text["post"]["summary"], + description=api_text["post"]["description"], +) +@authorized_user_only +async def create_one_algorithm( + body: input_schema, + as_org: str = Path(alias="organization_name"), + db: Session = Depends(middleware.get_db), + user: schemas.User = Depends(get_current_user), +) -> schemas.NewAlgorithmResponse: + # The standard_version can not be required, because it isn't according to BZK. + if body.standard_version is None: # type: ignore + body.standard_version = version_str + + algoritme_version = schemas.AlgoritmeVersionContent(**body.dict()) + return controllers.algoritme_version.post_one( + as_org=as_org, body=algoritme_version, db=db, user=user + ) + + +@router.put( + "/organizations/{organization_name}/algorithms/{algorithm_id}", + responses=responses["put"], + summary=api_text["put"]["summary"], + description=api_text["put"]["description"], +) +@authorized_user_only +async def update_one_algorithm( + body: input_schema, + as_org: str = Path(alias="organization_name"), + lars: str = Path(alias="algorithm_id"), + db: Session = Depends(middleware.get_db), + user: schemas.User = Depends(get_current_user), +) -> schemas.AlgorithmActionResponse | None: + algoritme_version = schemas.AlgoritmeVersionContent(**body.dict()) + return controllers.algoritme_version.update_new_version( + body=algoritme_version, lars=lars, db=db, user=user + ) + + +@action_router.get( + "/organizations/{organization_name}/algorithms/{algorithm_id}/preview", + response_model=schemas.PreviewUrl, + responses=responses["preview"], + summary=api_text["preview"]["summary"], + description=api_text["preview"]["description"], +) +@authorized_user_only +async def get_one_preview_url( + background_tasks: BackgroundTasks, + as_org: str = Path(alias="organization_name"), + lars: str = Path(alias="algorithm_id"), + db: Session = Depends(middleware.get_db), + user: schemas.User = Depends(get_current_user), +) -> schemas.PreviewUrl: + background_tasks.add_task( + controllers.algoritme_version.wait_then_disable_preview, lars=lars, db=db + ) + return controllers.algoritme_version.get_preview_link(lars=lars, db=db, user=user) + + +@published_router.get( + "/organizations/{organization_name}/published-algorithms/{algorithm_id}", + response_model=output_schemas | None, + responses=responses["get_one_published"], + summary=api_text["get_one_published"]["summary"], + description=api_text["get_one_published"]["description"], +) +@authorized_user_only +async def get_one_published_algorithm( + as_org: str = Path(alias="organization_name"), + lars: str = Path(alias="algorithm_id"), + db: Session = Depends(middleware.get_db), + user: schemas.User = Depends(get_current_user), +) -> schemas.AlgoritmeVersionDB: + return controllers.algoritme_version.get_one_published(lars=lars, db=db) + + +@action_router.delete( + "/organizations/{organization_name}/published-algorithms/{algorithm_id}/retract", + responses=responses["delete"], + summary=api_text["delete"]["summary"], + description=api_text["delete"]["description"], +) +@authorized_user_only +async def retract_one_published_algorithm( + background_tasks: BackgroundTasks, + as_org: str = Path(alias="organization_name"), + lars: str = Path(alias="algorithm_id"), + db: Session = Depends(middleware.get_db), + user: schemas.User = Depends(get_current_user), +) -> None: + response = controllers.algoritme_version.retract_one(lars=lars, db=db, user=user) + background_tasks.add_task(controllers.handle_retract_mail, lars, db) + return response + + +@action_router.put( + "/organizations/{organization_name}/algorithms/{algorithm_id}/release", + responses=responses["release"], + summary=api_text["release"]["summary"], + description=api_text["release"]["description"], +) +@authorized_user_only +async def release_one_algorithm( + background_tasks: BackgroundTasks, + as_org: str = Path(alias="organization_name"), + lars: str = Path(alias="algorithm_id"), + db: Session = Depends(middleware.get_db), + user: schemas.User = Depends(get_current_user), +) -> schemas.AlgorithmActionResponse | None: + response = controllers.algoritme_version.release_one(lars=lars, db=db, user=user) + background_tasks.add_task(controllers.handle_release_mail, lars, db) + return response + + +@action_router.put( + "/organizations/{organization_name}/algorithms/{algorithm_id}/publish", + responses=responses["publish"], + summary=api_text["publish"]["summary"], + description=api_text["publish"]["description"], + include_in_schema=False, +) +@publisher_only +@authorized_user_only +async def publish_one_algorithm( + background_tasks: BackgroundTasks, + as_org: str = Path(alias="organization_name"), + lars: str = Path(alias="algorithm_id"), + db: Session = Depends(middleware.get_db), + user: schemas.User = Depends(get_current_user), +) -> schemas.AlgorithmActionResponse | None: + return controllers.algoritme_version.publish_one( + background_tasks=background_tasks, lars=lars, db=db, user=user + ) + + +@action_router.delete( + "/organizations/{organization_name}/algorithms/{algorithm_id}/remove", + responses=responses["remove"], + summary=api_text["remove"]["summary"], + description=api_text["remove"]["description"], + include_in_schema=False, +) +@admin_only +@authorized_user_only +async def remove_one_algorithm( + as_org: str = Path(alias="organization_name"), + lars: str = Path(alias="algorithm_id"), + db: Session = Depends(middleware.get_db), + user: schemas.User = Depends(get_current_user), +) -> schemas.AlgorithmActionResponse | None: + return controllers.algoritme_version.remove_one(lars=lars, db=db) + + +api.include_router(router, tags=["Algoritmes in ontwikkeling"]) +api.include_router(published_router, tags=["Gepubliceerde algoritmes"]) +api.include_router(action_router, tags=["Acties"]) + +# Rename all the operation_id's in the schema to the name of the corresponding route. +for route in api.routes: + if isinstance(route, routing.APIRoute): + route.operation_id = route.name diff --git a/backend/app/schemas/__init__.py b/backend/app/schemas/__init__.py index 48bea4c2..56e2f268 100644 --- a/backend/app/schemas/__init__.py +++ b/backend/app/schemas/__init__.py @@ -1,4 +1,12 @@ +from .misc import * # noqa from .versions import * # noqa from .algoritme_version import * # noqa -from .misc import * # noqa from .util import * # noqa +from .c3po.reponse_in import * # noqa +from .c3po.response_out import * # noqa +from .c3po.request_in import * # noqa +from .c3po.request_out import * # noqa +from .organization import * # noqa +from .algoritme import * # noqa +from .action_history import * # noqa +from .templates import * # noqa diff --git a/backend/app/schemas/action_history.py b/backend/app/schemas/action_history.py new file mode 100644 index 00000000..5aaa5eca --- /dev/null +++ b/backend/app/schemas/action_history.py @@ -0,0 +1,17 @@ +from .misc import OperationEnum +from pydantic import BaseModel +import datetime + + +class ActionHistoryIn(BaseModel): + algoritme_version_id: int + operation: OperationEnum + user_id: str + + +class ActionHistoryDB(ActionHistoryIn): + id: int + create_dt: datetime.datetime + + class Config: + orm_mode = True diff --git a/backend/app/schemas/algoritme.py b/backend/app/schemas/algoritme.py new file mode 100644 index 00000000..7908c06b --- /dev/null +++ b/backend/app/schemas/algoritme.py @@ -0,0 +1,15 @@ +import datetime +from pydantic import BaseModel + + +class AlgoritmeIn(BaseModel): + lars: str + organisation_id: int + + +class AlgoritmeDB(AlgoritmeIn): + id: int + create_dt: datetime.datetime + + class Config: + orm_mode = True diff --git a/backend/app/schemas/algoritme_version.py b/backend/app/schemas/algoritme_version.py index 67253b15..ebe31d2a 100644 --- a/backend/app/schemas/algoritme_version.py +++ b/backend/app/schemas/algoritme_version.py @@ -1,7 +1,12 @@ from pydantic import BaseModel from datetime import datetime -from typing import TypedDict -from .util import get_all_output_schemas_union +from .misc import ( + Language, + OrgType, + ImpacttoetsenGrouping, + SourceDataGrouping, + LawfulBasisGrouping, +) # api @@ -20,6 +25,15 @@ class Config: orm_mode = True +class HighlightedAlgorithmResponse(BaseModel): + name: str + lars: str + organization: str + + class Config: + orm_mode = True + + class NewAlgorithmResponse(BaseModel): lars_code: str @@ -28,36 +42,159 @@ class AlgorithmActionResponse(BaseModel): message: str | None -# burgerwebsite -output_schemas = get_all_output_schemas_union() +class AlgoritmeVersionContent(BaseModel): + name: str | None + organization: str | None + department: str | None + description_short: str | None + type: str | None + category: str | list[str] | None + website: str | None + status: str | None + goal: str | None + impact: str | None + proportionality: str | None + decision_making_process: str | None + documentation: str | None + competent_authority: str | None + lawful_basis: str | None + iama: str | None + iama_description: str | None + dpia: str | None + dpia_description: str | None + objection_procedure: str | None + standard_version: str | None + uuid: str | None + url: str | None + contact_email: str | None + area: str | None + lang: str | None + revision_date: str | None + description: str | None + application_url: str | None + publiccode: str | None + mprd: str | None + source_data: str | None + methods_and_models: str | None + monitoring: str | None + human_intervention: str | None + risks: str | None + performance_standard: str | None + provider: str | None + process_index_url: str | None + tags: str | None + source_id: str | None + begin_date: str | None + end_date: str | None + lawful_basis_link: str | None + impacttoetsen: str | list[str] | None + source_data_link: str | None + publication_category: str | None + lawful_basis_grouping: list[LawfulBasisGrouping] | None + impacttoetsen_grouping: list[ImpacttoetsenGrouping] | None + source_data_grouping: list[SourceDataGrouping] | None + + class Config: + orm_mode = True + + +class AlgoritmeVersionIn(AlgoritmeVersionContent): + algoritme_id: int + language: Language + + published: bool | None + released: bool | None + preview_active: bool | None + create_dt: datetime | None + + +class AlgoritmeVersionDB(AlgoritmeVersionContent): + algoritme_id: int + language: Language + id: int + published: bool + released: bool + preview_active: bool + create_dt: datetime + + lars: str + owner: str + + class Config: + orm_mode = True + + +class AlgoritmeVersionTemplate(AlgoritmeVersionContent): + id: str + name: str -class AlgoritmeFilters(BaseModel): - attribute: str - value: str | list[str] +class AlgoritmeVersionDownload(AlgoritmeVersionContent): + lars: str + + +class AlgoritmeVersionDownloadJson(AlgoritmeVersionContent): + published: bool + released: bool + create_dt: datetime + owner: str + + +class AlgoritmeVersionQuery(AlgoritmeVersionContent): + lars: str + language: Language + create_dt: datetime + + +class AlgoritmeVersionGetOne(AlgoritmeVersionContent): + lars: str + create_dt: datetime + released: bool + published: bool + language: Language class AlgoritmeQuery(BaseModel): - filters: list[AlgoritmeFilters] = [] page: int = 1 limit: int = 10 - search: str = "" + searchtext: str = "" + organisation: str | None = None -class AlgoritmeAggregation(BaseModel): - aggregation_value: str | None - count: int | None +class OrganisationPresenceCount(BaseModel): + name: str + count: int + + +class OrganisationFilterGroup(BaseModel): + type: OrgType + organisations: list[OrganisationPresenceCount] - class Config: - orm_mode = True +class FilterData(BaseModel): + organisation: list[OrganisationFilterGroup] -class AggregatedAttribute(TypedDict): - values: list[AlgoritmeAggregation] - aggregation_attribute: str + +class SelectedFilters(BaseModel): + name: str + value: str | None class AlgoritmeQueryResponse(BaseModel): - results: list[output_schemas] # type: ignore + results: list[AlgoritmeVersionQuery] total_count: int - aggregations: list[AggregatedAttribute] + filter_data: FilterData + selected_filters: list[SelectedFilters] + + +class SearchSuggestionAlgorithms(BaseModel): + name: str + organization: str + lars: str + + class Config: + orm_mode = True + + +class SearchSuggestionResponse(BaseModel): + algorithms: list[SearchSuggestionAlgorithms] diff --git a/backend/app/schemas/c3po/reponse_in.py b/backend/app/schemas/c3po/reponse_in.py new file mode 100644 index 00000000..ef13fee0 --- /dev/null +++ b/backend/app/schemas/c3po/reponse_in.py @@ -0,0 +1,44 @@ +from pydantic import BaseModel +from enum import Enum +import datetime + + +class TaskStatus(str, Enum): + NEW = "new" + PENDING = "pending" + FINISHED = "finished" + ERROR = "error" + + +class SeverityLevel(str, Enum): + INFO = "info" + WARNING = "warning" + ERROR = "error" + + +class Rule(BaseModel): + rule_id: int + rule_code: str + rule_variant: str + description: str + python_reference: str + severity_level: SeverityLevel + created_at: datetime.datetime + + +class Task(BaseModel): + task_id: int + processing_request_id: int + feedback_message: str | None + result: bool | None + status: TaskStatus | None + created_at: datetime.datetime + rule: Rule + + +class ProcessingRequest(BaseModel): + processing_request_id: int + payload: str + tasks: list[Task] + created_at: datetime.datetime + updated_at: datetime.datetime diff --git a/backend/app/schemas/c3po/request_in.py b/backend/app/schemas/c3po/request_in.py new file mode 100644 index 00000000..74b7ed13 --- /dev/null +++ b/backend/app/schemas/c3po/request_in.py @@ -0,0 +1,6 @@ +from pydantic import BaseModel, Field + + +class C3poRequest(BaseModel): + text: str + ruleSet: str = Field(default=..., example="ar_v0_4_0_short_description") diff --git a/backend/app/schemas/c3po/request_out.py b/backend/app/schemas/c3po/request_out.py new file mode 100644 index 00000000..eefbaa63 --- /dev/null +++ b/backend/app/schemas/c3po/request_out.py @@ -0,0 +1,6 @@ +from typing import TypedDict + + +class ProcessingRequestOut(TypedDict): + payload: str + rule_codes: list[str] diff --git a/backend/app/schemas/c3po/response_out.py b/backend/app/schemas/c3po/response_out.py new file mode 100644 index 00000000..2a1259f0 --- /dev/null +++ b/backend/app/schemas/c3po/response_out.py @@ -0,0 +1,24 @@ +from pydantic import BaseModel + + +class RuleResults(BaseModel): + rule_code: str + description: str + feedback_message: str + result: bool | None + + +class C3poResults(BaseModel): + rules: list[RuleResults] + + +class Rule(BaseModel): + rule_code: str + rule_variant: str + description: str + severity_level: str + + +class RuleSetOut(BaseModel): + code: str + rules: list[Rule] diff --git a/backend/app/schemas/config/types.py b/backend/app/schemas/config/types.py new file mode 100644 index 00000000..df0429d4 --- /dev/null +++ b/backend/app/schemas/config/types.py @@ -0,0 +1,21 @@ +from pydantic import BaseModel + + +class SchemaProperty(BaseModel): + title: str + type: str + max_length: int | None + max_items: int | None + show_always: bool | None + help_text: str | None + instructions: str | None + example: str | list[str] | None + required: bool + permitted_values: list[str] | None + recommended_items: list[str] | None + allowed_html_tags: list[str] | None + items: dict[str, "SchemaProperty"] | None + + +class SchemaJson(BaseModel): + properties: dict[str, SchemaProperty] diff --git a/backend/app/schemas/config/v0_2_3.json b/backend/app/schemas/config/v0_2_3.json index 65a11a46..41335b9f 100644 --- a/backend/app/schemas/config/v0_2_3.json +++ b/backend/app/schemas/config/v0_2_3.json @@ -38,11 +38,7 @@ "help_text": "Een korte, abstracte beschrijving van het algoritme.", "instructions": "Een korte, abstracte beschrijving van het algoritme. Bij voorkeur in één of twee zinnen. Vul dit veld in op B1-taalniveau.", "example": "Dit algoritme optimaliseert de doorstroom van verkeer bij kruispunten op basis van sensoren in het wegdek.", - "required": false, - "permitted_values": [ - "Regelgebaseerd", - "Zelflerend" - ] + "required": false }, "type": { "type": "enum", diff --git a/backend/app/schemas/config/v0_4_0.json b/backend/app/schemas/config/v0_4_0.json index 506601ac..c0d5e6df 100644 --- a/backend/app/schemas/config/v0_4_0.json +++ b/backend/app/schemas/config/v0_4_0.json @@ -55,6 +55,8 @@ ], "required": false, "permitted_values": [ + "Organisatie en bedrijfsvoering", + "Dienstverlening", "Bestuur", "Cultuur en recreatie", "Economie", @@ -104,7 +106,7 @@ "max_length": 7, "show_always": true, "help_text": "Maand waarin het algoritme in gebruik is genomen.", - "instructions": "Maand en jaar waarin het algoritme in gebruik is genomen.", + "instructions": "Maand en jaar waarin het algoritme in gebruik is genomen. Schrijf de datum op zoals in dit voorbeeld: 01-1970", "example": "2023-01", "required": false }, @@ -114,7 +116,7 @@ "max_length": 7, "show_always": false, "help_text": "Maand waarin het algoritme buiten gebruik is genomen.", - "instructions": "Maand en jaar waarin het algoritme buiten gebruik is genomen. Als het algoritme nog in gebruik is, moet dit veld leegblijven. ", + "instructions": "Maand en jaar waarin het algoritme buiten gebruik is genomen. Als het algoritme nog in gebruik is, moet dit veld leegblijven. Schrijf de datum zoals in dit voorbeeld: 01-1970", "example": "2023-05", "required": false }, @@ -126,7 +128,15 @@ "help_text": "Het doel waarvoor het algoritme ontwikkeld is en wat voor impact de inzet heeft op burgers en bedrijven. ", "instructions": "Het doel waarvoor het algoritme ontwikkeld is en wat voor impact de inzet heeft op burgers en bedrijven. Vul dit veld in op B1-taalniveau. ", "example": "", - "required": false + "required": false, + "allowed_html_tags": [ + "div", + "br", + "p", + "ul", + "ol", + "li" + ] }, "proportionality": { "type": "string", @@ -136,7 +146,15 @@ "help_text": "Een afweging van de voor- en nadelen van de inzet van het algoritme en waarom dit redelijk gerechtvaardigd is.", "instructions": "Een afweging van de voor- en nadelen van de inzet van het algoritme en waarom dit redelijk gerechtvaardigd is. Benoem daarbij ook welke andere alternatieven overwogen zijn. Neem ook de ethische afwegingen mee in het invullen. Voor het invullen van dit veld kan gebruik gemaakt worden van de antwoorden uit het IAMA en de DPIA. Vul dit veld in op B1-taalniveau.", "example": "De voordelen van de inzet van dit algoritme zijn bewezen door het gebruik ervan over de hele wereld. Op plekken waar dit algoritme gebruikt wordt, is de verkeersdoorstroming aanzienlijk beter dan op plekken waar dit niet gedaan wordt. Het alternatief is een standaardvolgorde aanhouden, wat bewezen trager is voor weggebruikers.", - "required": false + "required": false, + "allowed_html_tags": [ + "div", + "br", + "p", + "ul", + "ol", + "li" + ] }, "provider": { "type": "string", @@ -144,7 +162,7 @@ "max_length": 200, "show_always": false, "help_text": "Indien van toepassing, de externe leverancier van het algoritme.", - "instructions": "Naam van de externe leverancier van het algoritme. Als het intern ontwikkeld is, noteer dan ‘Intern ontwikkeld’. Het gaat hierbij bijvoorbeeld niet om het gebruik van open source packages die gebruikt worden in een groter algoritme. Indien u zelf het algoritme hebt ontwikkeld, dient dit veld leeg te blijven. ", + "instructions": "Naam van de externe leverancier van het algoritme. Als het intern ontwikkeld is, noteer dan ‘Intern ontwikkeld’. Het gaat hierbij bijvoorbeeld niet om het gebruik van open source packages die gebruikt worden in een groter algoritme.", "example": "Haaks softwarebedrijf", "required": false }, @@ -156,12 +174,20 @@ "help_text": "Een omschrijving van de wettelijke basis voor het proces waarin het algoritme ingezet wordt ", "instructions": "Een omschrijving van de wettelijke basis voor het proces waarin het algoritme ingezet wordt ", "example": "", - "required": false + "required": false, + "allowed_html_tags": [ + "div", + "br", + "p", + "ul", + "ol", + "li" + ] }, "lawful_basis_link": { "type": "string", "title": "Link naar wettelijke basis", - "max_length": 200, + "max_length": 500, "show_always": false, "help_text": "Een link naar de wettelijke grondslag(en) voor het proces waarin het algoritme ingezet wordt.", "instructions": "Een link naar de wettelijke grondslag(en) voor het proces waarin het algoritme ingezet wordt. Bijvoorbeeld: een wet, een verordening of een formeel besluit.", @@ -173,7 +199,7 @@ "title": "Impacttoetsen", "show_always": true, "help_text": "Welke impacttoetsen zijn gebruikt, zoals Data Protection Impact Asssesment (DPIA) of Impact Assessment Mensenrechten en Algoritmes (IAMA)? ", - "instructions": "Naam/namen van uitgevoerde impacttoetsen.", + "instructions": "Naam/namen van uitgevoerde impacttoetsen. Dit veld is vrij in te vullen. De gegeven waardes zijn alleen suggesties.", "example": [ "Impact Assessment Mensenrechten en Algoritmes (IAMA)" ], @@ -185,13 +211,21 @@ }, "iama_description": { "type": "string", - "title": "Link naar Mensenrechtentoets", + "title": "Link naar impacttoetsen", "max_length": 500, "show_always": false, "help_text": "Link naar de resultaten van een uitgevoerde impacttoets, zoals een DPIA IAMA.", - "instructions": "Link naar de resultaten van een impacttoets, indien deze is uitgevoerd en publiek beschikbaar is. Een voorbeeld hiervan is het impact assessment mensenrechten en algoritmes (IAMA) of het data protection impact assessment (DPIA). Formateer het dusdanig dat de naam van de toets gevold wordt door een dubbele punt en de URL. Als er meerdere zijn, kunnen deze gescheiden worden door komma's. Begin een URL met https://", + "instructions": "Link naar de resultaten van een impacttoets, indien deze is uitgevoerd en publiek beschikbaar is. Een voorbeeld hiervan is het impact assessment mensenrechten en algoritmes (IAMA) of het data protection impact assessment (DPIA). Formatteer het in een lijst en dusdanig dat de naam van de toets gevolgd wordt door een dubbele punt en de URL. Begin een URL met https://", "example": "DPIA: https://link.com, IAMA: https://link.nl", - "required": false + "required": false, + "allowed_html_tags": [ + "div", + "br", + "p", + "ul", + "ol", + "li" + ] }, "url": { "type": "string", @@ -209,7 +243,7 @@ "max_length": 500, "show_always": true, "help_text": "De contactgegevens voor deze registratie ", - "instructions": "Het e-mailadres voor contact over deze registratie. Dit moet een geldig mailadres zijn waar burgers, media of andere betrokkenen vragen kunnen stellen over het algoritme zelf of over de gevolgen op basis van uitkomsten van het algoritme. Begin een URL met https:// ", + "instructions": "Het e-mailadres voor contact over deze registratie. Dit kan een geldig mailadres zijn waar burgers, media of andere betrokkenen vragen kunnen stellen over het algoritme zelf of over de gevolgen op basis van uitkomsten van het algoritme. Het alternatief is een extern webformulier die op dezelfde manier gebruikt kan worden. Begin een URL met https://.", "example": "algoritmes@gemeentenoorderhaaks.nl", "required": false }, @@ -263,7 +297,15 @@ "help_text": "Trefwoorden over het algoritme, om de vindbaarheid van een algoritmeregistratie te vergroten.", "instructions": "Termen gerelateerd aan dit algoritme. Gescheiden door komma's. Dit veld wordt niet weergegeven op de website en kan worden gebruikt om de vindbaarheid van de registratie te verbeteren. Zo kan bijvoorbeeld de naam van het relevante ministerie worden toegevoegd om als uitvoerorganisatie beter vindbaar te zijn met de zoekfunctie.", "example": "Verkeer, Mobiliteit, VRI, Infrastructuur, Waddengebied", - "required": false + "required": false, + "allowed_html_tags": [ + "div", + "br", + "p", + "ul", + "ol", + "li" + ] }, "source_data": { "type": "string", @@ -273,7 +315,15 @@ "help_text": "Een overzicht van de gegevens die gebruikt worden door het algoritme en/of in het begin gebruikt zijn bij het maken van het algoritme.", "instructions": "Een overzicht van de gegevens die gebruikt worden door het algoritme en/of in het begin gebruikt zijn bij het maken van het algoritme.", "example": "Sensordata van de verkeersregelinstallaties bij kruispunten op de ringweg van gemeente Noorderhaaks.", - "required": false + "required": false, + "allowed_html_tags": [ + "div", + "br", + "p", + "ul", + "ol", + "li" + ] }, "source_data_link": { "type": "string", @@ -293,7 +343,15 @@ "help_text": "Uitleg van hoe het algoritme werkt.", "instructions": "Een technische uitleg van hoe het algoritme werkt en uitkomsten genereert. Indien beschikbaar, komt een URL naar een schematisch overzicht van het model (zoals een stroomdiagram van een beslisboom) goed van pas. Indien complexe machine learning modellen worden gebruikt (zoals Neurale Netwerken), komen URL’s naar extra documentatie of wetenschappelijke publicaties goed van pas. Dit veld is hoofdzakelijk bedoeld voor de lezer met technische expertise, en mag daarom complexere concepten en taal bevatten.", "example": "Het model maakt gebruik van een eenvoudige beslisboom zodra een nieuwe bezette voorsorteerstrook zich voordoet (= wanneer de sensor een weggebruiker ontdekt). De beslisboom loopt als volgt: Eerst wordt er gekeken of er al andere partijen staan te wachten, en vervolgens of er op dat moment een andere voorsorteerstrook op groen licht staat. Zo niet, dan springt het stoplicht van de betreffende strook meteen op groen. Zo wel, dan wacht het tot er geen verkeer meer wordt waargenomen bij de andere voorsorteerstrook. Als er andere weggebruikers op andere stroken staan te wachten, sluit de betreffende strook achteraan in de wachtrij. Een grafische weergave van dit model is te vinden op https://algoritmes.gemeentenoorderhaaks.nl/VRI", - "required": false + "required": false, + "allowed_html_tags": [ + "div", + "br", + "p", + "ul", + "ol", + "li" + ] }, "publiccode": { "type": "string", @@ -313,17 +371,33 @@ "help_text": "Een omschrijving van hoe uitkomsten van het algoritme door een mens gebruikt worden, en op welke wijze deze gebruikt, gecontroleerd en bijgesteld (kunnen) worden.", "instructions": "Een omschrijving van hoe uitkomsten van het algoritme door een mens gebruikt worden, en op welke wijze deze gebruikt, gecontroleerd en bijgesteld (kunnen) worden. Vul dit veld in op B1-taalniveau. ", "example": "Bij het maken van fouten door het algoritme zou een medewerker van de afdeling handmatig de verkeersregeling aan kunnen passen en stoplichten op groen kunnen zetten. Buiten normale werktijden is er 24/7 toezicht.", - "required": false + "required": false, + "allowed_html_tags": [ + "div", + "br", + "p", + "ul", + "ol", + "li" + ] }, "risks": { "type": "string", "title": "Risicobeheer", "max_length": 2500, "show_always": true, - "help_text": "Een overzicht van de voorziene risico's bij de inzet van het algoritme", - "instructions": "Een overzicht van de voorziene risico's bij de inzet van het algoritme", + "help_text": "Een overzicht van de voorziene risico's bij de inzet van het algoritme en hoe deze, mits van toepassing, gemitigeerd zijn", + "instructions": "Een overzicht van de voorziene risico's bij de inzet van het algoritme en hoe deze, mits van toepassing, gemitigeerd zijn", "example": "", - "required": false + "required": false, + "allowed_html_tags": [ + "div", + "br", + "p", + "ul", + "ol", + "li" + ] } } } \ No newline at end of file diff --git a/backend/app/schemas/config/v1_0_0.json b/backend/app/schemas/config/v1_0_0.json new file mode 100644 index 00000000..a5a5b836 --- /dev/null +++ b/backend/app/schemas/config/v1_0_0.json @@ -0,0 +1,455 @@ +{ + "properties": { + "name": { + "type": "string", + "title": "Naam", + "max_length": 100, + "show_always": true, + "help_text": "De naam die gebruikt wordt om het algoritme aan te duiden", + "instructions": "Gebruik een naam, bij voorkeur met een werkwoord, die aangeeft wat het algoritme doet. Dit kan de algemeen gehanteerde naam zijn van het algoritme binnen de organisatie, mits begrijpelijk voor externen die niet bekend zijn met het algoritme.", + "example": "Automatische Verkeersregeling Ringweg", + "required": true + }, + "description_short": { + "type": "string", + "title": "Korte omschrijving", + "max_length": 350, + "show_always": true, + "help_text": "Een korte beschrijving van het algoritme.", + "instructions": "Een korte, duidelijke beschrijving van het algoritme en het proces waarin deze gebruikt wordt. Bij voorkeur in twee of drie zinnen. Doel van dit veld is om snel begrip te krijgen van wat het algoritme doet. Het veld wordt weergegeven in het zoekoverzicht. Vul dit veld in op B1-taalniveau.", + "example": "Dit algoritme zorgt met sensoren in het wegdek ervoor dat het verkeer zo makkelijk mogelijk doorstroomt.", + "required": true + }, + "organization": { + "type": "string", + "title": "Organisatie", + "max_length": 100, + "show_always": true, + "help_text": "De volledige naam van de organisatie waar het algoritme ingezet wordt.", + "instructions": "De volledige naam van de organisatie waar het algoritme ingezet wordt. Deze wordt gebaseerd op de TOOI-waardelijst: standaarden.overheid.nl. Eén registratie kan maar over één organisatie gaan. Er kunnen dus niet meerdere waarden ingevuld worden. Indien een algoritme bij meerdere organisaties wordt ingezet, zijn aparte registraties vereist.", + "example": "Gemeente Noorderhaaks", + "required": true + }, + "category": { + "type": "array", + "title": "Thema", + "max_items": 3, + "show_always": true, + "help_text": "Het beleidsterrein waarin het algoritme wordt ingezet", + "instructions": "Beleidsterrein(en) waarin het algoritme wordt ingezet.", + "example": [ + "Verkeer" + ], + "required": false, + "permitted_values": [ + "Organisatie en bedrijfsvoering", + "Cultuur en recreatie", + "Economie", + "Overheidsfinanciën", + "Wonen", + "Internationaal", + "Migratie en integratie", + "Natuur en milieu", + "Onderwijs en wetenschap", + "Openbare orde en veiligheid", + "Recht", + "Ruimte en infrastructuur", + "Sociale zekerheid", + "Verkeer", + "Werk", + "Zorg en gezondheid" + ] + }, + "status": { + "type": "enum", + "title": "Status", + "show_always": true, + "help_text": "De status van het algoritme: in ontwikkeling, in gebruik, of buiten gebruik.", + "instructions": "De huidige status van het algoritme: In ontwikkeling, In gebruik, Buiten gebruik. Indien het algoritme zowel in ontwikkeling als in gebruik is, kies voor ‘In gebruik’. Ten behoeve van de websitefunctionaliteit is het noodzakelijk om geen andere informatie in dit veld op te nemen dan een van de keuzes hierboven. Het is niet verplicht algoritmes in ontwikkeling of buiten gebruik te vermelden in het Algoritmeregister. De mogelijkheid wordt wel geboden voor organisaties die burgers willen betrekken al tijdens de ontwikkelingen van algoritmes. ", + "example": "In gebruik", + "required": true, + "permitted_values": [ + "In ontwikkeling", + "In gebruik", + "Buiten gebruik" + ] + }, + "begin_date": { + "type": "string", + "title": "Begindatum", + "max_length": 7, + "show_always": true, + "help_text": "Maand waarin het algoritme in gebruik is genomen.", + "instructions": "Maand en jaar waarin het algoritme in gebruik is genomen. Schrijf de datum op zoals in dit voorbeeld: 2023-01.", + "example": "2023-01", + "required": false + }, + "end_date": { + "type": "string", + "title": "Einddatum", + "max_length": 7, + "show_always": false, + "help_text": "Maand waarin het algoritme buiten gebruik is genomen.", + "instructions": "Maand en jaar waarin het algoritme buiten gebruik is genomen. Als het algoritme nog in gebruik is, moet dit veld leegblijven. Schrijf de datum zoals in dit voorbeeld: 2023-01.", + "example": "2023-05", + "required": false + }, + "contact_email": { + "type": "string", + "title": "Contactgegevens", + "max_length": 500, + "show_always": true, + "help_text": "De contactgegevens voor deze registratie ", + "instructions": "Het e-mailadres of de website voor contact over deze registratie. Dit moet een geldig mailadres of website zijn waar burgers, media of andere betrokkenen vragen kunnen stellen over het algoritme zelf of over de gevolgen op basis van uitkomsten van het algoritme. Begin een website-URL met https://", + "example": "algoritmes@gemeentenoorderhaaks.nl", + "required": true + }, + "website": { + "type": "string", + "title": "Link naar publiekspagina", + "max_length": 500, + "show_always": false, + "help_text": "Een URL naar een publiekspagina van de organisatie zelf. Op deze pagina kunt u meer vinden over de inzet van het algoritme binnen de organisatie.", + "instructions": "Een URL naar een publiekspagina over het algoritme van uw organisatie. Op deze pagina kan iemand meer vinden over het proces waarin het algoritme ingezet wordt. Dit kan bijvoorbeeld een pagina zijn waar de voorwaarden voor het toekennen van subsidies wordt toegelicht. Dit is een andere pagina dan de link naar het decentrale register. Begin een URL met https://", + "example": "https://gemeentenoorderhaaks/hoe-werkt-een-VRI", + "required": false + }, + "publication_category": { + "type": "enum", + "title": "Publicatiecategorie", + "show_always": true, + "help_text": "Om te bepalen welke algoritmes gepubliceerd moeten worden, is onderscheid gemaakt tussen impactvolle en overige algoritmes. Ook definieert de AI-verordening ‘Hoog-risico AI-systemen'. ", + "instructions": "Tot welke categorie een algoritme behoort volgens de handreiking: Hoog-risico AI-systeem (Categorie A), Impactvolle algoritmes (Categorie B), Overige algoritmes (Categorie C)", + "example": "Impactvolle algoritmes", + "required": true, + "permitted_values": [ + "Hoog-risico AI-systeem", + "Impactvolle algoritmes", + "Overige algoritmes" + ] + }, + "url": { + "type": "string", + "title": "Link naar bronregistratie", + "max_length": 500, + "show_always": false, + "help_text": "De URL van de locatie waar dit algoritme eerder al is vastgelegd; in machine leesbaar formaat.", + "instructions": "Als de organisatie zelf ook een Algoritmeregister gepubliceerd heeft , dan kan vanaf hiernaar verwezen worden. Decentrale registers kunnen gewenst zijn, bijvoorbeeld om de eigen doelgroep aan te spreken. Begin een URL met https:// ", + "example": "https://algoritmes.gemeentenoorderhaaks.nl/", + "required": false + }, + "goal": { + "type": "string", + "title": "Doel en impact", + "max_length": 2500, + "show_always": true, + "help_text": "Het doel waarvoor het algoritme ontwikkeld is en hoe burgers en bedrijven ermee in aanraking komen.", + "instructions": "Het doel waarvoor het algoritme ontwikkeld is, geeft aan wat je ermee wilt bereiken. Zo is het doel van een parkeerscanauto om sneller foutparkeerders op te sporen. De impact beschrijft hoe burgers en bedrijven ermee in aanraking komen. Het gaat hierbij om wat de impact is als het naar behoren werkt. Risico's worden behandeld in een apart veld. In het geval van de parkeerscanauto kunnen geparkeerde auto's gescand worden. Er wordt dan gekeken of zij betaald hebben met een direct resultaat. Vul dit veld in op B1-taalniveau.", + "example": "Het doel van dit algoritme is om de doorstroom van het verkeer binnen de gemeente te verbeteren. De impact is dat weggebruikers sneller van A naar B kunnen komen door kortere wachttijden.", + "required": false, + "allowed_html_tags": [ + "div", + "br", + "p", + "ul", + "ol", + "li" + ] + }, + "proportionality": { + "type": "string", + "title": "Afwegingen", + "max_length": 2500, + "show_always": true, + "help_text": "Een afweging van de voor- en nadelen van de inzet van het algoritme en waarom dit redelijk gerechtvaardigd is.", + "instructions": "Een afweging van de voor- en nadelen van de inzet van het algoritme en waarom dit redelijk gerechtvaardigd is. Benoem daarbij ook welke andere alternatieven overwogen zijn. Neem de eventuele ethische afwegingen mee in het invullen. Zo kan hier worden vermeld dat de inzet van een parkeerscanauto sneller en effectiever is vergeleken met menselijke controle. In dezelfde tijd kunnen meer auto's worden gecontroleerd. De besparing in mensen kan voor andere taken worden ingezet. De verhoogde kans op een foute boete wordt hierdoor gerechtvaardigd. Bovendien kunnen burgers altijd bezwaar aantekenen wat goed te controleren is. Voor het invullen van dit veld kan gebruik gemaakt worden van de antwoorden uit het IAMA en de DPIA. Vul dit veld in op B1-taalniveau. ", + "example": "De voordelen van de inzet van dit algoritme zijn bewezen door het gebruik ervan over de hele wereld. Op plekken waar dit algoritme gebruikt wordt, is de verkeersdoorstroming aanzienlijk beter dan op plekken waar dit niet gedaan wordt. Het alternatief is een standaardvolgorde aanhouden, wat bewezen trager is voor weggebruikers.", + "required": false, + "allowed_html_tags": [ + "div", + "br", + "p", + "ul", + "ol", + "li" + ] + }, + "human_intervention": { + "type": "string", + "title": "Menselijke tussenkomst", + "max_length": 2500, + "show_always": true, + "help_text": "Een omschrijving van hoe uitkomsten van het algoritme door een mens gebruikt worden, en op welke wijze deze gebruikt, gecontroleerd en bijgesteld (kunnen) worden.", + "instructions": "Een omschrijving van hoe uitkomsten van het algoritme door een mens gebruikt worden, en op welke wijze deze gebruikt, gecontroleerd en bijgesteld (kunnen) worden. Geef het ook aan indien er geen menselijke tussenkomst (nodig) is. Bijvoorbeeld bij slimme zoekopdrachten in grote databases. Hier is veelal geen menselijke controle of de gevonden waarden de juiste zijn. Vul dit veld in op B1-taalniveau.", + "example": "Bij het maken van fouten door het algoritme zou een medewerker van de afdeling handmatig de verkeersregeling aan kunnen passen en stoplichten op groen kunnen zetten. Buiten normale werktijden is er 24/7 toezicht.", + "required": false, + "allowed_html_tags": [ + "div", + "br", + "p", + "ul", + "ol", + "li" + ] + }, + "risks": { + "type": "string", + "title": "Risicobeheer", + "max_length": 2500, + "show_always": true, + "help_text": "Een overzicht van hoe omgegaan wordt met geïdentificeerde risico's.", + "instructions": "Een overzicht van hoe omgegaan wordt met risico's. Risico’s kunnen onder andere zijn technische, juridische, financiële en ethische risico’s. De risico's kunnen divers zijn en verschillen sterk per algoritme. Maar denk bijvoorbeeld aan discriminatie en uitlegbaarheid. Beschrijf ook hoe met die risico's wordt omgegaan, bijvoorbeeld door periodieke monitoring.", + "example": "Er is sprake van constante monitoring. Daardoor kan snel opgemerkt worden als een sensor defect is, waardoor weggebruikers lang stil moeten blijven staan. Dit kan dan snel verholpen worden om de nadelige gevolgen te beperken. Met enige regelmaat wordt ook in de praktijk gekeken naar of de sensoren voldoende reageren op de auto's en of de wachttijden eerlijk verdeeld zijn.", + "required": false, + "allowed_html_tags": [ + "div", + "br", + "p", + "ul", + "ol", + "li" + ] + }, + "lawful_basis": { + "type": "string", + "title": "Wettelijke basis", + "max_length": 2500, + "show_always": false, + "help_text": "Een omschrijving van de wettelijke basis voor het proces waarin het algoritme ingezet wordt ", + "instructions": "Een omschrijving van de wettelijke basis voor het proces waarin het algoritme ingezet wordt. Geef waar mogelijk in het kort aan wat het doel is van deze wet, zodat dit ook voor niet-juristen begrijpelijk is.", + "example": "Het algoritme wordt ingezet voor taken uit de Wegenverkeerswet. Een van de taken is het waarborgen van verkeersveiligheid.", + "required": false, + "allowed_html_tags": [ + "div", + "br", + "p", + "ul", + "ol", + "li" + ] + }, + "lawful_basis_grouping": { + "type": "array", + "title": "Verwijzingen wettelijke basis", + "required": false, + "show_always": false, + "help_text": "De wettelijke basis (links), gekoppeld aan hun referentie op het internet (rechts).", + "instructions": "De wettelijke basis, gekoppeld aan hun referentie op het internet.", + "items": { + "title": { + "type": "string", + "title": "Titel van wettelijke basis", + "max_length": 100, + "help_text": "De titel van de wettelijke grondslag waar middels een URL naar verwezen wordt.", + "instructions": "De titel van de wettelijke grondslag waar middels een URL naar verwezen wordt.", + "example": "Wegenverkeerswet 1994", + "required": true + }, + "link": { + "type": "string", + "title": "Link naar wettelijke basis", + "max_length": 500, + "help_text": "Een link naar de wettelijke grondslag(en) voor het proces waarin het algoritme ingezet wordt.", + "instructions": "Een link naar de wettelijke grondslag(en) voor het proces waarin het algoritme ingezet wordt. Bijvoorbeeld: een wet, een verordening of een formeel besluit.", + "example": "https://wetten.overheid.nl/BWBR0006622", + "required": true + } + } + }, + "process_index_url": { + "type": "string", + "title": "Link naar verwerkingsregister", + "max_length": 500, + "show_always": false, + "help_text": "Link naar een openbaar deel van een verwerkingsregister die betrekking heeft op een algoritme. Daar kan meer gelezen worden over verwerkingen.", + "instructions": "Link naar een openbaar deel van een verwerkingsregister die betrekking heeft op een algoritme. Daar kan meer gelezen worden over verwerkingen. Bijvoorbeeld een verwerking op https://www.avgregisterrijksoverheid.nl/", + "example": "", + "required": false + }, + "impacttoetsen_grouping": { + "type": "array", + "title": "Verwijzingen impacttoetsen", + "required": false, + "show_always": false, + "help_text": "De impacttoetsen (links), gekoppeld aan hun referentie op het internet (rechts).", + "instructions": "De impacttoetsen, gekoppeld aan hun referentie op het internet.", + "items": { + "title": { + "type": "string", + "title": "Titel van impacttoets", + "help_text": "Welke impacttoets is gebruikt, zoals Data Protection Impact Asssesment (DPIA) of Impact Assessment Mensenrechten en Algoritmes (IAMA)?", + "instructions": "Naam van uitgevoerde impacttoets. Indien er andere toetsen zijn uitgevoerd dan de DPIA of IAMA, geef hiervan de naam aan.", + "example": "Impact Assessment Mensenrechten en Algoritmes (IAMA)", + "required": true, + "recommended_items": [ + "Data Protection Impact Asssesment (DPIA)", + "Impact Assessment Mensenrechten en Algoritmes (IAMA)" + ] + }, + "link": { + "type": "string", + "title": "Link naar impacttoets", + "max_length": 500, + "help_text": "Link naar de resultaten van een uitgevoerde impacttoets, zoals een DPIA of IAMA.", + "instructions": "Link naar de resultaten van een impacttoets, indien deze is uitgevoerd en publiek beschikbaar is. Een voorbeeld hiervan is het impact assessment mensenrechten en algoritmes (IAMA) of het data protection impact assessment (DPIA). Begin een URL met https://", + "example": "https://gemeentenoorderhaaks.nl/Archief/toetsen/AVR-IAMA", + "required": true + } + } + }, + "impacttoetsen": { + "type": "string", + "title": "Toelichting op impacttoetsen", + "max_length": 2500, + "show_always": false, + "help_text": "Toelichting waarom bepaalde impacttoetsen niet gedaan zijn.", + "instructions": "Het is mogelijk dat er geen impacttoets nodig was voor het algoritme. In het geval van de DPIA bijvoorbeeld als er geen sprake is van persoonsgegevens. Met dit veld kan toegelicht worden waarom bepaalde impacttoetsen niet gedaan zijn.", + "example": "", + "required": false, + "allowed_html_tags": [ + "div", + "br", + "p", + "ul", + "ol", + "li" + ] + }, + "source_data": { + "type": "string", + "title": "Gegevens", + "max_length": 2500, + "show_always": true, + "help_text": "Een overzicht van de gegevens die gebruikt worden door het algoritme en/of in het begin gebruikt zijn bij het maken van het algoritme.", + "instructions": "Een overzicht van de gegevens die gebruikt worden door het algoritme en/of in het begin gebruikt zijn bij het maken van het algoritme. Waar mogelijk, wees specifiek. Met name voor wat betreft persoonsgegevens is het belangrijk te weten om welk type gegevens het gaat (bijvoorbeeld adres, geboorteplaats, leeftijd). Benoem waar mogelijk ook de bron zoals BRP of BKR of organisatie eigen klantgegevens.", + "example": "Sensordata van de verkeersregelinstallaties bij kruispunten op de ringweg van gemeente Noorderhaaks.", + "required": false, + "allowed_html_tags": [ + "div", + "br", + "p", + "ul", + "ol", + "li" + ] + }, + "source_data_grouping": { + "type": "array", + "title": "Verwijzingen gegevensbronnen", + "required": "false", + "show_always": false, + "help_text": "De gegevensbronnen (links), gekoppeld aan hun referentie op het internet (rechts).", + "instructions": "De gegevensbronnen, gekoppeld aan hun referentie op het internet.", + "items": { + "title": { + "type": "string", + "title": "Titel van gegevensbron", + "max_length": 500, + "help_text": "Titel van gelinkte gegevensbron", + "instructions": "De titel van een gelinkte gegevensbron.", + "example": "", + "required": true + }, + "link": { + "type": "string", + "title": "Link naar gegevensbron", + "max_length": 500, + "help_text": "Links naar aanvullende informatie over de gebruikte gegevensbron", + "instructions": "Een link naar een beschrijving van gegevens die gebruikt worden door het algoritme en/of in het begin gebruikt zijn bij het maken van het algoritme. Hierbij kan bijvoorbeeld gelinkt worden naar metadata in publieke datacatalogi of naar sensorenregistraties.", + "example": "", + "required": true + } + } + }, + "methods_and_models": { + "type": "string", + "title": "Technische werking", + "max_length": 5000, + "show_always": false, + "help_text": "Uitleg van hoe het algoritme werkt.", + "instructions": "Uitleg van hoe het algoritme werkt. Beschrijf de input, werking en output van het algoritme. Indien beschikbaar, komt een URL naar een schematisch overzicht van het model (zoals een stroomdiagram van een beslisboom) goed van pas. Indien complexe machine learning modellen worden gebruikt (zoals Neurale Netwerken), komen URL’s naar extra documentatie of wetenschappelijke publicaties goed van pas. Dit veld is hoofdzakelijk bedoeld voor de lezer met technische expertise, en mag daarom complexere concepten en taal bevatten. Geef tenminste aan of het zelflerend is of niet.", + "example": "Het model maakt gebruik van een eenvoudige beslisboom zodra een nieuwe bezette voorsorteerstrook zich voordoet (= wanneer de sensor een weggebruiker ontdekt). De beslisboom loopt als volgt: Eerst wordt er gekeken of er al andere partijen staan te wachten, en vervolgens of er op dat moment een andere voorsorteerstrook op groen licht staat. Zo niet, dan springt het stoplicht van de betreffende strook meteen op groen. Zo wel, dan wacht het tot er geen verkeer meer wordt waargenomen bij de andere voorsorteerstrook. Als er andere weggebruikers op andere stroken staan te wachten, sluit de betreffende strook achteraan in de wachtrij. Een grafische weergave van dit model is te vinden op https://algoritmes.gemeentenoorderhaaks.nl/VRI", + "required": false, + "allowed_html_tags": [ + "div", + "br", + "p", + "ul", + "ol", + "li" + ] + }, + "provider": { + "type": "string", + "title": "Leverancier", + "max_length": 200, + "show_always": false, + "help_text": "Indien van toepassing, de externe leverancier van het algoritme.", + "instructions": "Naam van de externe leverancier van het algoritme. Als het intern ontwikkeld is, noteer dan ‘Intern ontwikkeld’. Het gaat hierbij bijvoorbeeld niet om het gebruik van open source packages die gebruikt worden in een groter algoritme.", + "example": "Haaks softwarebedrijf", + "required": false + }, + "publiccode": { + "type": "string", + "title": "Link naar broncode", + "max_length": 500, + "show_always": false, + "help_text": "Een URL naar de codepagina van de ontwikkelaar. Op deze pagina kunt u meer vinden over de code van het algoritme zelf.", + "instructions": "Een URL naar de codepagina van de ontwikkelaar. Op deze pagina is de code van het algoritme te vinden. Indien er geen codebase publiekelijk beschikbaar is, dient dit veld leeg te blijven. Begin een URL met https://", + "example": "https://github.com/haakssoftwarebedrijf.nl/vrisoftware", + "required": false + }, + "lang": { + "type": "enum", + "title": "Taal", + "show_always": false, + "help_text": "De taal waarin deze registratie is ingevoerd.", + "instructions": "De code van de taal van de registratie. Dit veld is aanwezig, omdat het Algoritmeregister meertalig aangeboden kan worden. Op dit moment wordt alleen Nederlands (nld) aangeboden. De talen zijn in ISO 639-3 code.", + "example": "nld", + "permitted_values": [ + "nld" + ], + "required": true + }, + "standard_version": { + "type": "enum", + "title": "Versie publicatiestandaard", + "show_always": false, + "help_text": "De versie van de publicatiestandaard waar dit algoritme in is geregistreed.", + "instructions": "De versie van de publicatiestandaard die gehanteerd is voor deze registratie.Op dit moment is dat '0.4.0'.", + "example": "1.0.0", + "required": false, + "permitted_values": [ + "1.0.0" + ] + }, + "source_id": { + "type": "string", + "title": "Bron-ID", + "max_length": 100, + "show_always": false, + "help_text": "De unieke code van dit algoritme in het register van de eigenaar", + "instructions": "Indien van toepassing, de unieke identificatie voor deze registratie zoals door de eigenaar wordt gehanteerd. Dit is dus de verwijzing naar het algoritme in de interne database of het interne register van uw organisatie.", + "example": "n.v.t.", + "required": false + }, + "tags": { + "type": "string", + "title": "Zoektermen", + "max_length": 2500, + "show_always": false, + "help_text": "Trefwoorden over het algoritme, om de vindbaarheid van een algoritmeregistratie te vergroten.", + "instructions": "Termen gerelateerd aan dit algoritme. Gescheiden door komma's. Dit veld wordt niet weergegeven op de website en kan worden gebruikt om de vindbaarheid van de registratie te verbeteren. Zo kan bijvoorbeeld de naam van het relevante ministerie worden toegevoegd om als uitvoerorganisatie beter vindbaar te zijn met de zoekfunctie.", + "example": "Verkeer, Mobiliteit, VRI, Infrastructuur, Waddengebied", + "required": false, + "allowed_html_tags": [ + "div", + "br", + "p", + "ul", + "ol", + "li" + ] + } + } +} \ No newline at end of file diff --git a/backend/app/schemas/misc.py b/backend/app/schemas/misc.py index e7d4ea27..262b623c 100644 --- a/backend/app/schemas/misc.py +++ b/backend/app/schemas/misc.py @@ -1,8 +1,10 @@ +from typing import TypedDict from pydantic import BaseModel +import enum class User(BaseModel): - name: str | None + name: str organizations: list[str] role: str | None @@ -13,3 +15,60 @@ class Message(BaseModel): class PreviewUrl(BaseModel): url: str + + +class Language(enum.Enum): + NLD = "NLD" + ENG = "ENG" + + +class OperationEnum(str, enum.Enum): + created = "created" + new_version = "new version" + released = "released" + published = "published" + retracted = "retracted" + preview_activated = "preview activated" + preview_used = "preview used" + preview_timeout = "preview timeout" + + +class OrgType(str, enum.Enum): + adviescollege = "Adviescollege" + agentschap = "Agentschap" + brandweer = "Brandweer" + caribisch_openbaar_lichaam = "Caribisch openbaar lichaam" + gemeente = "Gemeente" + grensoverschrijdend_regionaal_samenwerkingsorgaan = ( + "Grensoverschrijdend regionaal samenwerkingsorgaan" + ) + hoog_college_van_staat = "Hoog College van Staat" + interdepartementale_commissie = "Interdepartementale commissie" + kabinet_van_de_koning = "Kabinet van de Koning" + koepelorganisatie = "Koepelorganisatie" + ministerie = "Ministerie" + openbaar_lichaam_voor_beroep_en_bedrijf = "Openbaar lichaam voor beroep en bedrijf" + organisatie_met_overheidsbemoeienis = "Organisatie met overheidsbemoeienis" + organisatieonderdeel = "Organisatieonderdeel" + politie = "Politie" + provincie = "Provincie" + rechtspraak = "Rechtspraak" + regionaal_samenwerkingsorgaan = "Regionaal samenwerkingsorgaan" + waterschap = "Waterschap" + zelfstandig_bestuursorgaan = "Zelfstandig bestuursorgaan" + overig = "Overig" + + +class ImpacttoetsenGrouping(TypedDict): + title: str + link: str + + +class SourceDataGrouping(TypedDict): + title: str + link: str + + +class LawfulBasisGrouping(TypedDict): + title: str + link: str diff --git a/backend/app/schemas/organization.py b/backend/app/schemas/organization.py new file mode 100644 index 00000000..1d6c5f37 --- /dev/null +++ b/backend/app/schemas/organization.py @@ -0,0 +1,27 @@ +from pydantic import BaseModel +from .misc import OrgType + + +class OrganisationIn(BaseModel): + name: str + code: str + type: OrgType | None + + class Config: + orm_mode = True + + +class OrganisationDB(OrganisationIn): + id: int + + class Config: + orm_mode = True + + +class OrganisationGrouping(BaseModel): + type: OrgType | None + name: str + count: int + + class Config: + orm_mode = True diff --git a/backend/app/schemas/templates.py b/backend/app/schemas/templates.py new file mode 100644 index 00000000..12758fbb --- /dev/null +++ b/backend/app/schemas/templates.py @@ -0,0 +1,11 @@ +from pydantic import BaseModel + + +class TemplateSummary(BaseModel): + name: str + id: str + + +class StandardSupplier(BaseModel): + name: str + algorithm_descriptions: list[TemplateSummary] diff --git a/backend/app/schemas/util.py b/backend/app/schemas/util.py index 2543e63c..72de55a5 100644 --- a/backend/app/schemas/util.py +++ b/backend/app/schemas/util.py @@ -1,9 +1,10 @@ from pydantic import BaseModel, create_model from typing import Union from functools import lru_cache -from sqlalchemy import Integer, Boolean, VARCHAR, DateTime +from sqlalchemy import JSON, Integer, Boolean, VARCHAR, DateTime from datetime import datetime import os +import re from app import schemas, models @@ -13,16 +14,18 @@ class Config: def _translate_type(type_class): - if type(type_class) == VARCHAR: + if isinstance(type_class, VARCHAR): return str - elif type(type_class) == Boolean: + elif isinstance(type_class, Boolean): return bool - elif type(type_class) == Integer: + elif isinstance(type_class, Integer): return int - elif type(type_class) == DateTime: + elif isinstance(type_class, DateTime): return datetime + elif isinstance(type_class, JSON): + return list[dict] else: - raise TypeError + raise TypeError(type_class) @lru_cache(maxsize=2) @@ -33,12 +36,10 @@ def get_algorithm_export_schema(truncated: bool): "id", "algoritme_id", "preview_active", + "language", + "vector", ] - ignore_on_trunc = [ - "create_dt", - "published", - "released", - ] + ignore_on_trunc = ["create_dt", "published", "released"] fields = {} for c in columns: if c.key in always_ignore: @@ -58,8 +59,9 @@ def get_algorithm_export_schema(truncated: bool): @lru_cache(maxsize=1) def get_all_output_schemas_union(): - file_names = os.listdir(os.path.dirname(schemas.__file__) + "/config") - version_names = [f.replace(".json", "") for f in file_names] + file_names = os.listdir("app/schemas/config") + version_pattern = re.compile(r"v\d_\d_\d[a-z]?") + version_names = [item[:-5] for item in file_names if version_pattern.match(item)] output_schemas = [] for v in version_names: diff --git a/backend/app/schemas/versions.py b/backend/app/schemas/versions.py index 073a9cdc..045c5c4e 100644 --- a/backend/app/schemas/versions.py +++ b/backend/app/schemas/versions.py @@ -1,25 +1,14 @@ -from pydantic import BaseModel, Field, create_model +from pydantic import BaseModel, Field, create_model, validator from functools import lru_cache import re import enum from datetime import datetime +from app.util.logger import get_logger +from app.schemas.config.types import SchemaJson, SchemaProperty +from . import Language +from app.util.html import strip_html, validate_html - -class JsonSchemaProperty(BaseModel): - title: str - type: str - max_length: int | None - show_always: bool - help_text: str - instructions: str - example: str | list[str] - required: bool - permitted_values: list[str] | None - recommended_items: list[str] | None - - -class JsonSchema(BaseModel): - properties: dict[str, JsonSchemaProperty] +logger = get_logger(__name__) class AlgorithmBase(BaseModel): @@ -27,22 +16,42 @@ class Config: orm_mode = True +def validate_max_length(cls, value, **kwargs): + if not isinstance(value, str): + return value + + field_name = kwargs["field"].name + max_length = cls.__fields__[field_name].field_info.extra.get( + "max_length_without_html" + ) + if not max_length: + return value + + if len(strip_html(value)) > max_length: + raise ValueError( + f"{field_name} exceeds the maximum length of {max_length} characters." + ) + return value + + def _get_versioned_name(name: str, version: str): model_name = version + "__" + name return model_name def _get_schema_json(version: str): - version_pattern = re.compile("v[0-9]_[0-9]_[0-9][a-z]?") + version_pattern = re.compile(r"v\d_\d_\d[a-z]?") if not version_pattern.match(version): - raise ValueError + raise ValueError( + f"_get_schema_json: version {version} does not match version_pattern. It checks for v\\d_\\d_\\d[a-z]?" + ) file_name = f"app/schemas/config/{version}.json" - data = JsonSchema.parse_file(file_name) + data = SchemaJson.parse_file(file_name) return data -def _get_type_from_json_schema(properties: JsonSchemaProperty, key: str, version: str): +def _get_type_from_json_schema(properties: SchemaProperty, key: str, version: str): field_type = properties.type if field_type == "string": return str @@ -63,18 +72,33 @@ def _get_type_from_json_schema(properties: JsonSchemaProperty, key: str, version elif field_type == "array": return list[dynamic_enum] else: - raise ValueError - elif properties.recommended_items: - if field_type == "array": - return list[str] + raise ValueError(field_type) + elif properties.recommended_items and field_type == "array": + return list[str] + elif properties.items: + # Enter recursion, there is an object within an object. + sub_properties = properties.items + fields = _build_schema_fields( + SchemaJson(properties=sub_properties), version + ) + sub_schema_name = "Object" + "".join( + [s.capitalize() for s in key.split("_")] + ) + sub_schema = create_model( + _get_versioned_name(sub_schema_name, version), + **fields, + __base__=AlgorithmBase, + ) + return list[sub_schema] else: - raise ValueError + raise ValueError(field_type) -def _get_prop_dict(field_props: JsonSchemaProperty): +def _get_prop_dict(field_props: SchemaProperty): field_dict = { "title": field_props.title, - "max_length": field_props.max_length, + "max_length_without_html": field_props.max_length, + "max_items": field_props.max_items, "show_always": field_props.show_always, "help_text": field_props.help_text, "instructions": field_props.instructions, @@ -82,60 +106,91 @@ def _get_prop_dict(field_props: JsonSchemaProperty): "default": (...) if field_props.required else None, "type": field_props.type, "recommended_items": field_props.recommended_items, + "allowed_html_tags": field_props.allowed_html_tags, } return field_dict -def _build_schema_fields(data: JsonSchema, version: str): +def _build_schema_fields(data: SchemaJson, version: str): fields = {} for key in data.properties: prop_dict = _get_prop_dict(data.properties[key]) - field_props = Field( - **prop_dict, - ) - + field_props = Field(**prop_dict) field_type = _get_type_from_json_schema(data.properties[key], key, version) fields[key] = (field_type, field_props) return fields +def _get_algorithm_in_validators( + schema: type[AlgorithmBase], +): + validators = {} + max_length_fields = [] + html_fields = [] + for value in schema.__fields__.values(): + add_html_validator = value.type_ == str + if add_html_validator: + html_fields.append(value.name) + + add_max_length_validator = value.field_info.extra.get("max_length_without_html") + if add_max_length_validator: + max_length_fields.append(value.name) + + if len(max_length_fields) > 0: + validators["max_length_validator"] = validator( + *max_length_fields, allow_reuse=True + )(validate_max_length) + + if len(html_fields) > 0: + validators["html_validator"] = validator( + *html_fields, pre=True, allow_reuse=True + )(validate_html) + + return validators + + @lru_cache(maxsize=8) -def create_algorithm_in_schema(version: str): +def create_algorithm_base_schema(version: str): + """Expected version format: v0_1_0""" data = _get_schema_json(version) - fields = _build_schema_fields(data, version) - AlgorithmIn = create_model("AlgorithmIn", **fields, __base__=AlgorithmBase) - return AlgorithmIn + schema_algorithm_base = create_model( + "AlgorithmBase", + **fields, + __base__=AlgorithmBase, + ) + return schema_algorithm_base + + +@lru_cache(maxsize=8) +def create_algorithm_in_schema(version: str): + """Expected version format: v0_1_0""" + base = create_algorithm_base_schema(version) + validators = _get_algorithm_in_validators(base) + + schema_algorithm_in = create_model( + "AlgorithmIn", + __base__=base, + __validators__=validators, + ) + return schema_algorithm_in @lru_cache(maxsize=8) def create_algorithm_schema(version: str): - schema_version_in = create_algorithm_in_schema(version) + """Expected version format: v0_1_0""" + base = create_algorithm_base_schema(version) fields = { "lars": (str, ...), "create_dt": (datetime, ...), "released": (bool, ...), "published": (bool, ...), + "language": (Language, ...), } model_name = _get_versioned_name("Algorithm", version) - Algorithm = create_model(model_name, **fields, __base__=schema_version_in) - return Algorithm - - -@lru_cache(maxsize=8) -def create_algorithm_in_loader_schema(version: str): - schema_version_in = create_algorithm_in_schema(version) - - fields = { - "create_dt": (datetime, Field(None)), - "published": (bool, ...), - "algoritme_id": (str, Field(None)), - } - - model_name = _get_versioned_name("AlgorithmInLoader", version) - AlgorithmInLoader = create_model(model_name, **fields, __base__=schema_version_in) - return AlgorithmInLoader + algorithm = create_model(model_name, **fields, __base__=base) + return algorithm diff --git a/backend/app/services/__init__.py b/backend/app/services/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/services/algoritme_version/algoritme_version_service.py b/backend/app/services/algoritme_version/algoritme_version_service.py index e58946e8..cfec16ae 100644 --- a/backend/app/services/algoritme_version/algoritme_version_service.py +++ b/backend/app/services/algoritme_version/algoritme_version_service.py @@ -1,7 +1,36 @@ import re +from typing import TypeVar +from app.util.config_load import get_ttl_hash, collect_structure_data +from app import models, schemas +T = TypeVar("T", schemas.AlgoritmeVersionQuery, schemas.AlgoritmeVersionDB) -def db_list_to_python_list(model): + +def convert_potential_list(field: str) -> list[str] | str: + if not isinstance(field, str): + return field + # First check is to match anything like this {.....} + pattern = r"^\{(.+)\}$" + list_match = re.match(pattern, field) + if not list_match: + return field + + # # SQLAlchemy sometimes stores array entries as with double quotes, e.g. on this string: + # # DPIA: https://google.com + # # The space seems to create these additional quotes. This is handled by taking them away + # # here. Because comma's can appear in the substrings, can't do a split, but regex works. + list_entries: str = re.findall(r"(\"[^\"]+\"|[^\"{},]+)", field) + new_value: list[str] = [] + for list_entry in list_entries: + new_value.append(list_entry.replace('"', "")) + return new_value + + +def field_db_list_to_python_list(field: str) -> list[str] | str: + return convert_potential_list(field) + + +def db_list_to_python_list(model: models.AlgoritmeVersion) -> models.AlgoritmeVersion: """Converts lists found in the SQLAlchemy model (=sql data) into python lists. There are certain columns which store a list of values. These columns do not have an @@ -12,22 +41,55 @@ def db_list_to_python_list(model): "{a, b}" as str -> ["a", "b"] as list[str] """ - pattern = r"^\{([^{}]+)\}$" - for c in model.__table__.columns: - column_value = str(getattr(model, c.key)) - list_match = re.match(pattern, column_value) - if list_match: - new_value = list_match.group(1).split(",") - - # SQLAlchemy sometimes stores array entries as with double quotes, e.g. on this string: - # DPIA: https://google.com - # The space seems to create these additional quotes. This is handled by taking them away - # here. - quote_pattern = r"^\"([^\"]+)\"$" - for i, v in enumerate(new_value): - quote_match = re.match(quote_pattern, v) - if quote_match: - new_value[i] = quote_match.group(1) + standards, _ = collect_structure_data(get_ttl_hash()) + schema = standards[model.standard_version] + for c in model.__table__.columns: # type: ignore + # Check if the field is eligible for conversion. Don't want to convert lists where it is not allowed + # (by Pydantic).' + if not (c.key in schema): + continue + if schema[c.key].type != "array": + continue + column_value = getattr(model, c.key) + + # Catch; if for some reason the column that should be an array is an empty string. + if column_value == "": + setattr(model, c.key, []) + continue + if column_value: + new_value = convert_potential_list(column_value) setattr(model, c.key, new_value) return model + + +def db_list_to_python_list_schema( + schema: T, +) -> T: + """Converts lists found in the SQLAlchemy model (=sql data) into python lists. + + There are certain columns which store a list of values. These columns do not have an + enumeration type, as legacy Publication Standards did not have the enumeration restriction. + Because of this the column has to be a free field format -- varchar. + + Still, it needs to be converted to a python format. This conversion looks as follows: + + "{a, b}" as str -> ["a", "b"] as list[str] + """ + if not schema.standard_version: + return schema + + standards, _ = collect_structure_data(get_ttl_hash()) + standard = standards[schema.standard_version] + for c in dict(schema).keys(): # type: ignore + # Check if the field is eligible for conversion. Don't want to convert lists where it is not allowed + # (by Pydantic).' + if not (c in standard): + continue + if standard[c].type != "array": + continue + column_value = getattr(schema, c) + if column_value: + new_value = convert_potential_list(column_value) + setattr(schema, c, new_value) + return schema diff --git a/backend/app/services/translation/__init__.py b/backend/app/services/translation/__init__.py new file mode 100644 index 00000000..36bad46f --- /dev/null +++ b/backend/app/services/translation/__init__.py @@ -0,0 +1,5 @@ +from .preprocessor import Preprocessor # noqa +from .auto_translator import AutoTranslator # noqa +from .default_values_translator import DefaultValuesTranslator # noqa +from .list_values_translator import ListValuesTranslator # noqa +from .base_translator import LanguageCode # noqa diff --git a/backend/app/services/translation/auto_translator.py b/backend/app/services/translation/auto_translator.py new file mode 100644 index 00000000..97cd707a --- /dev/null +++ b/backend/app/services/translation/auto_translator.py @@ -0,0 +1,20 @@ +from .base_translator import Translator + + +class AutoTranslator(Translator): + _PUNCTUATION_MARKS = ".,;:!?" + + def translate(self): + translated_texts = self._cloud_translate(self.text_list, html=True) + translated_texts = self.__fix_anchor_punctuation(translated_texts) + translated_fields = self.handle_response(translated_texts) + return translated_fields + + def __fix_anchor_punctuation(self, translations: list[str]) -> list[str]: + """ + Removes spaces between anchor tags and punctuation marks. + """ + for mark in self._PUNCTUATION_MARKS: + for i, sentence in enumerate(translations): + translations[i] = sentence.replace(f" {mark}", f"{mark}") + return translations diff --git a/backend/app/services/translation/base_translator.py b/backend/app/services/translation/base_translator.py new file mode 100644 index 00000000..33397241 --- /dev/null +++ b/backend/app/services/translation/base_translator.py @@ -0,0 +1,100 @@ +from abc import ABC, abstractmethod +from datetime import datetime +from typing import Any +from enum import Enum + +from pydantic import BaseModel +from deepl import DeepLException + +from app.services.translation import cloud_translators + + +class LanguageCode(str, Enum): + DUTCH = "nl" + ENGLISH = "en" + FRYSIAN = "fy" + + +class TranslationResult(BaseModel): + error: str | None + fields: dict[str, int | str | list | bool | None | datetime] | None + used_service: str + + +class Translator(ABC): + """ + Abstract base class for translation services. + + Subclasses must implement the translate() method. + """ + + _SERVICE_RELATED_EXCEPTIONS = (DeepLException,) + + def __init__( + self, + field_dict: dict[str, Any], + source_lang: LanguageCode = LanguageCode.DUTCH, + target_lang: LanguageCode = LanguageCode.ENGLISH, + ) -> None: + self.field_dict = field_dict + self.source_lang = source_lang + self.target_lang = target_lang + self.client = None + self.text_list = list(self.field_dict.values()) + self.text_list = [text if text else "" for text in self.text_list] + + @abstractmethod + def translate(self, *args, **kwargs) -> TranslationResult: + """ + Apply the translation service to the text list. + """ + ... + + def _cloud_translate(self, original_values: str | list, html=False) -> str | list: + """ + Fallback to cloud translation API if the original value is not found in the default_translations dict. + """ + return cloud_translators.deepl_translate( + original_values, self.source_lang.value, self.target_lang.value, html + ) + + @classmethod + def _handle_exceptions(self, error: Exception) -> str: + """ + Generate an informative error message. + + Distinct messages are returned for service related exceptions and unknown exceptions. + """ + if isinstance(error, tuple(Translator._SERVICE_RELATED_EXCEPTIONS)): + return ( + f"Bij het aanroepen van de {self.__class__.__name__} service is een fout opgetreden" + f" van het type '{type(error).__name__}'." + ) + + return "Er is een onbekende fout opgetreden bij het vertalen van de tekst, zie logging voor details." + + def handle_response(self, response: list | dict[str, Any]) -> TranslationResult: + """ + Decorator for the translate() method for automatic response and exception handling. + + Exception handling is applied on service related exceptions only. + """ + class_name = self.__class__.__name__ + try: + if isinstance(response, dict): + result = TranslationResult( + error=None, fields=response, used_service=class_name + ) + elif isinstance(response, list): + fields = dict(zip(list(self.field_dict.keys()), response)) + result = TranslationResult( + error=None, fields=fields, used_service=class_name + ) + else: + raise TypeError( + f"Expected response to be a dict or list, got {type(response)} instead." + ) + return result + except Exception as error: + error = self._handle_exceptions(error) + return TranslationResult(error=error, fields=None, used_service=class_name) diff --git a/backend/app/services/translation/cloud_translators.py b/backend/app/services/translation/cloud_translators.py new file mode 100644 index 00000000..e9e52347 --- /dev/null +++ b/backend/app/services/translation/cloud_translators.py @@ -0,0 +1,103 @@ +import time +import uuid + +import requests +import deepl + +from app.config import settings +from app.util.logger import get_logger + +logger = get_logger(__name__) + + +def azure_translate( + original_values: list | str, source_lang: str, target_lang: str, html=False +) -> str | list: + azure_translate_settings = settings.AzureTranslation() + api_key = azure_translate_settings.api_key + endpoint = azure_translate_settings.endpoint + region = azure_translate_settings.region + + params = { + "api-version": "3.0", + "from": source_lang, + "to": [target_lang], + "textType": "html" if html else "plain", + } + + headers = { + "Ocp-Apim-Subscription-Key": api_key, + "Ocp-Apim-Subscription-Region": region, + "Content-type": "application/json", + "X-ClientTraceId": str(uuid.uuid4()), + } + + # You can pass more than one object in body. + if isinstance(original_values, list): + if not original_values: + return [] + body = [{"text": val} for val in original_values] + else: + body = [{"text": original_values}] + + response = requests.post(endpoint, params=params, headers=headers, json=body) + if response.status_code == 429: + # pause for a minute + logger.info( + "Azure Translator API rate limit reached. Pausing for 60 seconds..." + ) + time.sleep(60) + logger.info("Resuming translation.") + response = requests.post(endpoint, params=params, headers=headers, json=body) + + response_obj = response.json() + translations = [obj["translations"][0]["text"] for obj in response_obj] + if isinstance(original_values, list): + return translations + return translations[0] + + +def deepl_translate( + original_values: list | str, source_lang: str, target_lang: str, html=False +) -> str | list: + if target_lang == "en": + target_lang = "EN-GB" + + if isinstance(original_values, list): + return _handle_list_translation(original_values, source_lang, target_lang, html) + else: + return _handle_string_translation( + original_values, source_lang, target_lang, html + ) + + +def _handle_string_translation( + original_values: str, source_lang: str, target_lang: str, html: bool +) -> str: + if not original_values: + return "" + deepl_api_key = settings.DeepLSettings().api_key + translator = deepl.Translator(deepl_api_key) + response = translator.translate_text( + original_values, + source_lang=source_lang, + target_lang=target_lang, + tag_handling="html" if html else None, + ) + return response.text + + +def _handle_list_translation( + original_values: list, source_lang: str, target_lang: str, html: bool +) -> list: + if not original_values: + return [] + deepl_api_key = settings.DeepLSettings().api_key + translator = deepl.Translator(deepl_api_key) + response = translator.translate_text( + original_values, + source_lang=source_lang, + target_lang=target_lang, + tag_handling="html" if html else None, + ) + return [translation.text for translation in response] diff --git a/backend/app/services/translation/default_values_translator.py b/backend/app/services/translation/default_values_translator.py new file mode 100644 index 00000000..70a1c68d --- /dev/null +++ b/backend/app/services/translation/default_values_translator.py @@ -0,0 +1,22 @@ +from .base_translator import Translator + + +class DefaultValuesTranslator(Translator): + def translate(self, translation_spec: dict[str, dict]): + raw_result = self.apply_default_translations(translation_spec) + return self.handle_response(raw_result) + + def apply_default_translations( + self, default_translations: dict[str, dict] + ) -> dict[str, str]: + new_field_dict = self.field_dict.copy() + for field_key, original_value in new_field_dict.items(): + original_value = original_value.strip() + if original_value in default_translations[field_key].keys(): + new_value = default_translations[field_key][original_value] + new_field_dict[field_key] = new_value + else: + fallback_translation = self._cloud_translate(original_value) + new_field_dict[field_key] = fallback_translation + + return new_field_dict diff --git a/backend/app/services/translation/list_values_translator.py b/backend/app/services/translation/list_values_translator.py new file mode 100644 index 00000000..4f257d00 --- /dev/null +++ b/backend/app/services/translation/list_values_translator.py @@ -0,0 +1,36 @@ +from .base_translator import Translator + + +class ListValuesTranslator(Translator): + def translate(self, translation_spec: dict[str, dict]): + new_field_dict = self.field_dict.copy() + for field_key, original_list in new_field_dict.items(): + translated_list = self.translate_list( + field_key, original_list, translation_spec + ) + new_field_dict[field_key] = translated_list + + return self.handle_response(new_field_dict) + + def translate_list( + self, field_key: str, original_list: list, default_translations: dict[str, dict] + ) -> list[str]: + """ + Translate a list of strings. + + If a string is not found in the default_translations dict, the original string is kept. + """ + + new_list = [] + for original_value in original_list: + if type(original_value) is not str: + new_list.append(original_value) + continue + original_value = original_value.strip() + if original_value in default_translations[field_key].keys(): + new_value = default_translations[field_key][original_value] + new_list.append(new_value) + else: + fallback_translation = self._cloud_translate(original_value) + new_list.append(fallback_translation) + return new_list diff --git a/backend/app/services/translation/preprocessor.py b/backend/app/services/translation/preprocessor.py new file mode 100644 index 00000000..efa236a7 --- /dev/null +++ b/backend/app/services/translation/preprocessor.py @@ -0,0 +1,136 @@ +import json +from typing import Any + +from sqlalchemy import inspect, VARCHAR +from app.database.database import Base as SQLAlchemyModel + + +class Preprocessor: + """ + A class for preprocessing a model instance before translation. + + Assumed order of translation: + 1. Non-translatable fields + 4. List fields + 2. Default translate fields + 3. Auto translate fields + """ + + TRANSLATION_SPEC_FILE = "app/services/translation/translation_spec.json" + + def __init__( + self, model_instance: SQLAlchemyModel, attrs_to_delete: list[str] = None + ): + self.model_instance = model_instance + self.attrs_to_delete = set(attrs_to_delete) if attrs_to_delete else set() + self.model_attrs = ( + set(inspect(self.model_instance).attrs.keys()) - self.attrs_to_delete + ) + self.translation_spec = self._load_translation_spec() + self.passed = set() + + @classmethod + def _load_translation_spec(cls) -> dict: + """ + Load the translation specifications from a file. + + Defines the way fields should be translated (automatically or with default values) + """ + with open(cls.TRANSLATION_SPEC_FILE, "r") as file: + return json.load(file) + + def _get_none_fields(self) -> set[str]: + """ + Get the fields that have None as value and keep them. + """ + none_fields = { + field + for field in self.model_attrs + if getattr(self.model_instance, field) is None + } + return none_fields + + def get_non_translatable_fields(self) -> dict[str, Any]: + """ + Get fields that don't need translation. + """ + excluded_field_keys = set.union( + set(self.translation_spec["auto_translate_fields"]), + self.translation_spec["default_translations"].keys(), + self._get_list_field_keys(), + ) + non_translatable_field_keys = ( + self.model_attrs - excluded_field_keys + ) | self._get_none_fields() + return self.filter_fields(non_translatable_field_keys) + + def _get_list_field_keys(self) -> set[str]: + return { + field + for field in self.model_attrs + if isinstance(getattr(self.model_instance, field), list) + } + + def get_list_fields(self) -> dict[str, list[str]]: + """ + Get fields that have a list as values. + + List fields are computed by inspecting model attrs that are of type list. + """ + list_fields = self._get_list_field_keys() + return self.filter_fields(list_fields) + + def get_default_translate_fields(self) -> dict[str, Any]: + """ + Get the fields that need default translation. + + Avoid translating fields that have None or a list as value. + These are already handled by other translation methods. + """ + default_translations = self.translation_spec["default_translations"] + default_translate_fields = set(default_translations.keys()) + return self.filter_fields(default_translate_fields) + + def get_auto_translate_fields(self) -> dict[str, str]: + """ + Get the fields that need translation. + """ + auto_translate_fields = set(self.translation_spec["auto_translate_fields"]) + return self.filter_fields(auto_translate_fields) + + def filter_fields(self, field_set: set) -> dict[str, str | list]: + """ + Utility function for returning filtered fields. + """ + field_set = field_set - self.passed + self.passed.update(field_set) + fields_dict = {} + valid_fields = self.model_attrs & field_set + for field in valid_fields: + value = getattr(self.model_instance, field) + fields_dict[field] = value + + return fields_dict + + def __get_max_lengths(self) -> dict[str, int | None]: + """ + Get the maximum lengths of the fields. + """ + column_max_lengths = {} + columns = self.model_instance.__table__.columns + for column in columns: + if isinstance(column.type, VARCHAR): + column_max_lengths[column.name] = column.type.length + else: + column_max_lengths[column.name] = None + + return column_max_lengths + + def truncate_fields(self, translated_dict: dict[str, Any]): + for field_key, value in translated_dict.items(): + max_length = self.__get_max_lengths().get(field_key) + exceeds_max_length = ( + isinstance(value, str) and max_length and len(value) > max_length + ) + if exceeds_max_length: + translated_dict[field_key] = value[: max_length - 3] + "..." diff --git a/backend/app/services/translation/translation_spec.json b/backend/app/services/translation/translation_spec.json new file mode 100644 index 00000000..ccff8425 --- /dev/null +++ b/backend/app/services/translation/translation_spec.json @@ -0,0 +1,116 @@ +{ + "auto_translate_fields": [ + "name", + "description_short", + "goal", + "impact", + "proportionality", + "decision_making_process", + "lawful_basis", + "iama_description", + "dpia_description", + "objection_procedure", + "area", + "description", + "source_data", + "methods_and_models", + "monitoring", + "human_intervention", + "risks", + "performance_standard", + "tags", + "competent_authority", + "lang", + "provider" + ], + "default_translations": { + "organization": { + "Autoriteit Persoonsgegevens": "Dutch Data Protection Authority", + "Belastingdienst": "Dutch Tax and Customs Administration", + "Centraal Bureau Rijvaardigheidsbewijzen": "Central Office for Motor Vehicle Driver Testing", + "Centraal Justitieel Incassobureau": "Central Judicial Collection Agency", + "DCMR Milieudienst Rijnmond": "Environmental Protection Agency Rijnmond", + "Inspectie van het Onderwijs (OCW)": "Inspectorate of Education", + "Justitiële Informatiedienst": "Judicial Information Service", + "Kadaster": "Land Registry", + "Ministerie van Binnenlandse Zaken en Koninkrijksrelaties": "Ministry of the Interior and Kingdom Relations", + "Ministerie van Justitie en Veiligheid": "Ministry of Justice and Security", + "Nederlands Forensisch Instituut": "Netherlands Forensic Institute", + "Omgevingsdienst Midden-Holland": "Regional Environment Agency Middle Holland", + "Omgevingsdienst Noordzeekanaalgebied": "Regional Environment Agency North Sea Canal Area", + "Rijksdienst Voor Identiteitsgegevens": "National Office for Identity Data", + "Rijksdienst voor Ondernemend Nederland": "Netherlands Enterprise Agency", + "SED Organisatie (Gemeente Stede Broec, Enkhuizen, Drechterland)": "SED Organization (Municipalities Stede Broec, Enkhuizen, Drechterland)", + "Sociale Verzekeringsbank (SVB)": "Social Insurance Bank", + "Toeslagen": "Allowances", + "Uitvoeringsinstituut Werknemersverzekeringen": "Employee Insurance Agency", + "Waterschap Drents Overijsselse Delta": "Water Board Drents Overijsselse Delta", + "Waterschap Hollandse Delta": "Water Board Hollandse Delta", + "Gemeente Amersfoort": "Municipality of Amersfoort", + "Gemeente Amsterdam": "Municipality of Amsterdam", + "Gemeente Assen": "Municipality of Assen", + "Gemeente Bergen Op Zoom": "Municipality of Bergen Op Zoom", + "Gemeente Den Haag": "Municipality of The Hague", + "Gemeente Eindhoven": "Municipality of Eindhoven", + "Gemeente Emmen": "Municipality of Emmen", + "Gemeente Goeree-Overflakkee": "Municipality of Goeree-Overflakkee", + "Gemeente Lochem": "Municipality of Lochem", + "Gemeente Oirschot": "Municipality of Oirschot", + "Gemeente Rotterdam": "Municipality of Rotterdam", + "Gemeente Stichtse Vecht": "Municipality of Stichtse Vecht", + "Gemeente Súdwest-Fryslân": "Municipality of Súdwest-Fryslân", + "Gemeente Utrecht": "Municipality of Utrecht", + "Provincie Noord-Brabant": "Province of North Brabant", + "Provincie Zuid-Holland": "Province of South Holland" + }, + "category": { + "Organisatie en bedrijfsvoering" : "Organization and business operations", + "Dienstverlening" : "Service delivery", + "Bestuur": "Board", + "Cultuur en recreatie": "Culture and Recreation", + "Economie": "Economy", + "Financiën": "Finance", + "Huisvesting": "Housing", + "Internationaal": "International", + "Landbouw": "Agriculture", + "Migratie en integratie": "Migration and Integration", + "Natuur en milieu": "Nature and Environment", + "Onderwijs en wetenschap": "Education and Science", + "Openbare orde en veiligheid": "Public Order and Safety", + "Recht": "Law", + "Ruimte en infrastructuur": "Space and Infrastructure", + "Sociale zekerheid": "Social Security", + "Verkeer": "Traffic", + "Werk": "Work", + "Zorg en gezondheid": "Health and Healthcare", + "Zorg en Welzijn": "Care and Health" + }, + "type": { + "Ja": "Yes", + "Nee": "No", + "Regelgebaseerd": "Rule-based", + "Zelflerend": "Self-learning" + }, + "iama": { + "Ja": "Yes", + "Nee": "No" + }, + "dpia": { + "Ja": "Yes", + "Nee": "No" + }, + "mprd": { + "Ja": "Yes", + "Nee": "No" + }, + "impacttoetsen": { + "Data Protection Impact Assessment (DPIA)": "Data Protection Impact Assessment (DPIA)", + "Impact Assessment Mensenrechten en Algoritmes (IAMA)": "Human Rights and Algorithms Impact Assessment (IAMA)" + }, + "status": { + "In gebruik": "In use", + "In ontwikkeling": "In development", + "Buiten gebruik": "Out of use" + } + } +} \ No newline at end of file diff --git a/backend/app/util/config_load.py b/backend/app/util/config_load.py new file mode 100644 index 00000000..96eda0c3 --- /dev/null +++ b/backend/app/util/config_load.py @@ -0,0 +1,43 @@ +from functools import lru_cache +import json +import os +import re +import time +from typing import Any, Tuple +from app.schemas.config.types import SchemaProperty, SchemaJson +from app.config.layouts.types import LayoutJson + + +def get_ttl_hash(seconds=3600): + """Returns a new value for each interval in `seconds`. Allows resetting of cache, giving an effective TTL of + `seconds`""" + return round(time.time() / seconds) + + +@lru_cache(maxsize=1) +def collect_structure_data( + ttl_hash=None, +) -> Tuple[dict[str, dict[str, SchemaProperty]], dict[str, LayoutJson]]: + del ttl_hash + + version_pattern = re.compile(r"v\d_\d_\d[a-z]?") + filenames = [ + item for item in os.listdir("app/schemas/config") if version_pattern.match(item) + ] + + versions = [f[1:-5].replace("_", ".") for f in filenames] + + schemas: dict[str, dict[str, SchemaProperty]] = {} + layouts: dict[str, LayoutJson] = {} + for v, f in zip(versions, filenames): + filename = f"app/schemas/config/{f}" + with open(filename) as file: + schema: dict[str, Any] = json.load(file) + schemas[v] = SchemaJson(**schema).properties + + filename = f"app/config/layouts/{f}" + with open(filename) as file: + layout: dict[str, Any] = json.load(file) + layouts[v] = LayoutJson(**layout) + + return schemas, layouts diff --git a/backend/app/util/html.py b/backend/app/util/html.py new file mode 100644 index 00000000..bf813d4b --- /dev/null +++ b/backend/app/util/html.py @@ -0,0 +1,39 @@ +from lxml import etree +from lxml.html import document_fromstring +from lxml.html.clean import Cleaner + + +def strip_html(value: str) -> str: + if not value: + return value + html = document_fromstring(value) + plain_text = " ".join(etree.XPath("//text()")(html)) + return plain_text + + +def validate_html(cls, value, **kwargs): + """Preprocess html fields by sanitization.""" + if not isinstance(value, str) or not value: + return value + + field_name = kwargs["field"].name + if field_name not in cls.__fields__: + return value + + allowed_tags = cls.__fields__[field_name].field_info.extra.get("allowed_html_tags") + if not allowed_tags: + return strip_html(value) + + return sanitize_html(value, allowed_tags) + + +def sanitize_html(value: str, allowed_tags: list[str]): + cleaner = Cleaner( + allow_tags=allowed_tags, + style=True, + kill_tags=["script", "style"], + safe_attrs_only=True, + safe_attrs=[], + ) + result = cleaner.clean_html(value) + return result diff --git a/backend/app/util/stringify.py b/backend/app/util/stringify.py new file mode 100644 index 00000000..37c25df8 --- /dev/null +++ b/backend/app/util/stringify.py @@ -0,0 +1,25 @@ +from typing import Any +from enum import Enum + + +def stringify(value: Any) -> str | None: + # Handles list[str] | list[dict] | number | str + if not value: + return None + if isinstance(value, list): + if len(value) == 0: + return None + if isinstance(value[0], Enum): + return ", ".join([str(v.value) for v in value]) + if isinstance(value[0], str): + return ", ".join(list[str](value)) + elif isinstance(value[0], dict): + listified_dicts = [] + for n, cell in enumerate(list[dict](value)): + stringified_dict = ", ".join(cell.values()) + listified_dicts.append(f"{n+1}: {stringified_dict}") + return ". ".join(listified_dicts) + if isinstance(value, Enum): + return str(value.value) + + return str(value) diff --git a/backend/app/util/upc.py b/backend/app/util/upc.py index e927443e..f87bf667 100644 --- a/backend/app/util/upc.py +++ b/backend/app/util/upc.py @@ -27,7 +27,7 @@ def generate_upc() -> str: This can be used to generate ID's for distinct objects. It then reduces the chance of accidentally accessing another entry due to typing errors. """ - rl: list[int] = [random.randint(1, 9) for each in range(0, 7)] + rl: list[int] = [random.randint(1, 9) for _ in range(0, 7)] e: int = rl[0] + rl[2] + rl[4] + rl[6] o: int = rl[1] + rl[3] + rl[5] diff --git a/backend/base_image/Dockerfile b/backend/base_image/Dockerfile new file mode 100644 index 00000000..843d1440 --- /dev/null +++ b/backend/base_image/Dockerfile @@ -0,0 +1,32 @@ +# Run this Dockerfile from the parent directory +FROM python:3.11.3-slim + +ENV YOUR_ENV=production \ + PYTHONFAULTHANDLER=1 \ + PYTHONUNBUFFERED=1 \ + PYTHONHASHSEED=random \ + PIP_NO_CACHE_DIR=off \ + PIP_DISABLE_PIP_VERSION_CHECK=on \ + PIP_DEFAULT_TIMEOUT=100 \ + POETRY_VERSION=1.2.2 + +WORKDIR /backend + +# Expensive operations first +RUN apt-get update +RUN apt-get -y install sudo +RUN sudo apt-get -y install gcc g++ python3-dev +RUN pip install "poetry==$POETRY_VERSION" + +# Dynamic operations last +COPY ./poetry.lock /backend/poetry.lock +COPY ./pyproject.toml /backend/pyproject.toml +RUN poetry config virtualenvs.create false +RUN poetry install --without dev --no-interaction --no-ansi + +# Cleans up cache -> Reduces size for download. +RUN sudo apt-get clean + + + + diff --git a/backend/base_image/README.md b/backend/base_image/README.md new file mode 100644 index 00000000..7a4aa7b6 --- /dev/null +++ b/backend/base_image/README.md @@ -0,0 +1,14 @@ +Does the base image need refreshing? + +Navigate to the parent directory (/backend). + +Follow the steps below. It automatically uses your current poetry.lock for packages: + +`docker build --file=base_image/Dockerfile -t algreg_base . ` +`docker tag algreg_base harbor.cicd.s15m.nl/ictu-devops-pub/algreg_base` +`docker login harbor.cicd.s15m.nl` +`docker push harbor.cicd.s15m.nl/ictu-devops-pub/algreg_base` + +or as a one-liner: + +`docker build --file=base_image/Dockerfile -t algreg_base . && docker tag algreg_base harbor-gn2.cicd.s15m.nl/ictu-devops-pub/algreg_base && docker login harbor-gn2.cicd.s15m.nl && docker push harbor-gn2.cicd.s15m.nl/ictu-devops-pub/algreg_base` diff --git a/backend/docker-compose.yml b/backend/docker-compose.yml index bf05c285..0518c901 100644 --- a/backend/docker-compose.yml +++ b/backend/docker-compose.yml @@ -1,41 +1,82 @@ -version: "3.4" +version: '3.7' services: db: - image: postgres:14-alpine - container_name: ${DEV_DOCKER_CONTAINER_NAME_PREFIX}_postgres_db + image: harbor-gn2.cicd.s15m.nl/ictu-devops-pub/cloudnative-pg/postgresql:15.2.3 + container_name: ${POSTGRES_DB_NAME} restart: always volumes: - ./dev_db/init.sql:/docker-entrypoint-initdb.d/init.sql - - postgres:/var/lib/postgresql/data + - db:/var/lib/postgresql/data ports: - ${POSTGRES_PORT}:${POSTGRES_PORT} environment: - POSTGRES_USER: ${POSTGRES_USER} - POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + PGPORT: ${POSTGRES_PORT} command: -p ${POSTGRES_PORT} + backend: + build: + context: ../ + dockerfile: backend/Dockerfile + ports: + - ${BACKEND_PORT}:${BACKEND_PORT} + volumes: + - ./:/backend + depends_on: + - db + environment: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + POSTGRES_SERVER: ${POSTGRES_DB_NAME} + POSTGRES_DB: ${POSTGRES_DB} + POSTGRES_PORT: ${POSTGRES_PORT} + C3PO_URL: ${C3PO_URL} + + restart: on-failure:10 + command: /bin/bash -c " + echo 'allow postgres to start' && sleep 3 && + alembic -c alembic.ini upgrade head && + uvicorn app.main:app --reload --host 0.0.0.0 --port ${BACKEND_PORT}" + dbgate: image: dbgate/dbgate:alpine - container_name: ${DEV_DOCKER_CONTAINER_NAME_PREFIX}_dbgate + container_name: algreg_dbgate volumes: - dbgate:/root/.dbgate depends_on: - db ports: - - 8093:3000 + - ${DBGATE_PORT}:3000 environment: # docs: https://dbgate.org/docs/env-variables.html CONNECTIONS: 'CON1' LABEL_CON1: 'Postgres' SERVER_CON1: 'db' - USER_CON1: ${POSTGRES_USER} - PASSWORD_CON1: ${POSTGRES_PASSWORD} + USER_CON1: postgres + PASSWORD_CON1: postgres PORT_CON1: ${POSTGRES_PORT} ENGINE_CON1: postgres@dbgate-plugin-postgres + etl: + build: + context: ../ + dockerfile: etl/Dockerfile + ports: + - ${ETL_PORT}:${ETL_PORT} + volumes: + - ../etl:/etl + environment: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + POSTGRES_SERVER: ${POSTGRES_DB_NAME} + POSTGRES_PORT: ${POSTGRES_PORT} + POSTGRES_DB: ${POSTGRES_DB} + command: /bin/bash -c "uvicorn app.main:app --reload --host 0.0.0.0 --port ${ETL_PORT}" + volumes: dbgate: - name: ${DEV_DOCKER_CONTAINER_NAME_PREFIX}_dbgate - postgres: - name: ${DEV_DOCKER_CONTAINER_NAME_PREFIX}_postgres + name: algreg_dbgate + db: + name: algreg_db diff --git a/backend/misc/parse-css.ipynb b/backend/misc/parse-css.ipynb index 76da38cc..1b73b475 100644 --- a/backend/misc/parse-css.ipynb +++ b/backend/misc/parse-css.ipynb @@ -10,19 +10,23 @@ "import ssl\n", "\n", "lines = []\n", - "with open('../../frontend/assets/styles/_koop_index.scss') as f:\n", + "with open(\"../../frontend/assets/styles/_koop_index.scss\") as f:\n", " lines = f.readlines()\n", "\n", - "with open('../../frontend/assets/styles/_koop_main.scss') as f:\n", - " lines = lines + f.readlines() \n", + "with open(\"../../frontend/assets/styles/_koop_main.scss\") as f:\n", + " lines = lines + f.readlines()\n", + "\n", "\n", "def get_path_from_string(x):\n", - " start_char = x.find('/icon-') + 1\n", - " end_char = x.find('.svg') + 4\n", + " start_char = x.find(\"/icon-\") + 1\n", + " end_char = x.find(\".svg\") + 4\n", " return x[start_char:end_char]\n", "\n", - "list = [l.split(\" \") for l in lines if 'icon-' in l]\n", - "flat_list = [item for sublist in list for item in sublist if '/theme-iconsicon-' in item]\n", + "\n", + "list = [l.split(\" \") for l in lines if \"icon-\" in l]\n", + "flat_list = [\n", + " item for sublist in list for item in sublist if \"/theme-iconsicon-\" in item\n", + "]\n", "parsed_icons = [get_path_from_string(x) for x in flat_list]\n", "\n", "parsed_icons\n", diff --git a/backend/poetry.lock b/backend/poetry.lock index dd03b4a8..1c14302f 100644 --- a/backend/poetry.lock +++ b/backend/poetry.lock @@ -1,32 +1,33 @@ -# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. [[package]] name = "alembic" -version = "1.8.1" +version = "1.11.3" description = "A database migration tool for SQLAlchemy." optional = false python-versions = ">=3.7" files = [ - {file = "alembic-1.8.1-py3-none-any.whl", hash = "sha256:0a024d7f2de88d738d7395ff866997314c837be6104e90c5724350313dee4da4"}, - {file = "alembic-1.8.1.tar.gz", hash = "sha256:cd0b5e45b14b706426b833f06369b9a6d5ee03f826ec3238723ce8caaf6e5ffa"}, + {file = "alembic-1.11.3-py3-none-any.whl", hash = "sha256:d6c96c2482740592777c400550a523bc7a9aada4e210cae2e733354ddae6f6f8"}, + {file = "alembic-1.11.3.tar.gz", hash = "sha256:3db4ce81a9072e1b5aa44c2d202add24553182672a12daf21608d6f62a8f9cf9"}, ] [package.dependencies] Mako = "*" SQLAlchemy = ">=1.3.0" +typing-extensions = ">=4" [package.extras] tz = ["python-dateutil"] [[package]] name = "anyio" -version = "3.6.2" +version = "3.7.1" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false -python-versions = ">=3.6.2" +python-versions = ">=3.7" files = [ - {file = "anyio-3.6.2-py3-none-any.whl", hash = "sha256:fbbe32bd270d2a2ef3ed1c5d45041250284e31fc0a4df4a5a6071842051a51e3"}, - {file = "anyio-3.6.2.tar.gz", hash = "sha256:25ea0d673ae30af41a0c442f81cf3b38c7e79fdc7b60335a4c14e05eb0947421"}, + {file = "anyio-3.7.1-py3-none-any.whl", hash = "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5"}, + {file = "anyio-3.7.1.tar.gz", hash = "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780"}, ] [package.dependencies] @@ -34,9 +35,9 @@ idna = ">=2.8" sniffio = ">=1.1" [package.extras] -doc = ["packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] -test = ["contextlib2", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (<0.15)", "uvloop (>=0.15)"] -trio = ["trio (>=0.16,<0.22)"] +doc = ["Sphinx", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme (>=1.2.2)", "sphinxcontrib-jquery"] +test = ["anyio[trio]", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (<0.22)"] [[package]] name = "appnope" @@ -51,38 +52,20 @@ files = [ [[package]] name = "asttokens" -version = "2.1.0" +version = "2.2.1" description = "Annotate AST trees with source code positions" optional = false python-versions = "*" files = [ - {file = "asttokens-2.1.0-py2.py3-none-any.whl", hash = "sha256:1b28ed85e254b724439afc783d4bee767f780b936c3fe8b3275332f42cf5f561"}, - {file = "asttokens-2.1.0.tar.gz", hash = "sha256:4aa76401a151c8cc572d906aad7aea2a841780834a19d780f4321c0fe1b54635"}, + {file = "asttokens-2.2.1-py2.py3-none-any.whl", hash = "sha256:6b0ac9e93fb0335014d382b8fa9b3afa7df546984258005da0b9e7095b3deb1c"}, + {file = "asttokens-2.2.1.tar.gz", hash = "sha256:4622110b2a6f30b77e1473affaa97e711bc2f07d3f10848420ff1898edbe94f3"}, ] [package.dependencies] six = "*" [package.extras] -test = ["astroid (<=2.5.3)", "pytest"] - -[[package]] -name = "attrs" -version = "22.2.0" -description = "Classes Without Boilerplate" -optional = false -python-versions = ">=3.6" -files = [ - {file = "attrs-22.2.0-py3-none-any.whl", hash = "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836"}, - {file = "attrs-22.2.0.tar.gz", hash = "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99"}, -] - -[package.extras] -cov = ["attrs[tests]", "coverage-enable-subprocess", "coverage[toml] (>=5.3)"] -dev = ["attrs[docs,tests]"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope.interface"] -tests = ["attrs[tests-no-zope]", "zope.interface"] -tests-no-zope = ["cloudpickle", "cloudpickle", "hypothesis", "hypothesis", "mypy (>=0.971,<0.990)", "mypy (>=0.971,<0.990)", "pympler", "pympler", "pytest (>=4.3.0)", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-mypy-plugins", "pytest-xdist[psutil]", "pytest-xdist[psutil]"] +test = ["astroid", "pytest"] [[package]] name = "backcall" @@ -97,32 +80,23 @@ files = [ [[package]] name = "black" -version = "22.10.0" +version = "22.12.0" description = "The uncompromising code formatter." optional = false python-versions = ">=3.7" files = [ - {file = "black-22.10.0-1fixedarch-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:5cc42ca67989e9c3cf859e84c2bf014f6633db63d1cbdf8fdb666dcd9e77e3fa"}, - {file = "black-22.10.0-1fixedarch-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:5d8f74030e67087b219b032aa33a919fae8806d49c867846bfacde57f43972ef"}, - {file = "black-22.10.0-1fixedarch-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:197df8509263b0b8614e1df1756b1dd41be6738eed2ba9e9769f3880c2b9d7b6"}, - {file = "black-22.10.0-1fixedarch-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:2644b5d63633702bc2c5f3754b1b475378fbbfb481f62319388235d0cd104c2d"}, - {file = "black-22.10.0-1fixedarch-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:e41a86c6c650bcecc6633ee3180d80a025db041a8e2398dcc059b3afa8382cd4"}, - {file = "black-22.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2039230db3c6c639bd84efe3292ec7b06e9214a2992cd9beb293d639c6402edb"}, - {file = "black-22.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14ff67aec0a47c424bc99b71005202045dc09270da44a27848d534600ac64fc7"}, - {file = "black-22.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:819dc789f4498ecc91438a7de64427c73b45035e2e3680c92e18795a839ebb66"}, - {file = "black-22.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5b9b29da4f564ba8787c119f37d174f2b69cdfdf9015b7d8c5c16121ddc054ae"}, - {file = "black-22.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b49776299fece66bffaafe357d929ca9451450f5466e997a7285ab0fe28e3b"}, - {file = "black-22.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:21199526696b8f09c3997e2b4db8d0b108d801a348414264d2eb8eb2532e540d"}, - {file = "black-22.10.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e464456d24e23d11fced2bc8c47ef66d471f845c7b7a42f3bd77bf3d1789650"}, - {file = "black-22.10.0-cp37-cp37m-win_amd64.whl", hash = "sha256:9311e99228ae10023300ecac05be5a296f60d2fd10fff31cf5c1fa4ca4b1988d"}, - {file = "black-22.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fba8a281e570adafb79f7755ac8721b6cf1bbf691186a287e990c7929c7692ff"}, - {file = "black-22.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:915ace4ff03fdfff953962fa672d44be269deb2eaf88499a0f8805221bc68c87"}, - {file = "black-22.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:444ebfb4e441254e87bad00c661fe32df9969b2bf224373a448d8aca2132b395"}, - {file = "black-22.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:974308c58d057a651d182208a484ce80a26dac0caef2895836a92dd6ebd725e0"}, - {file = "black-22.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72ef3925f30e12a184889aac03d77d031056860ccae8a1e519f6cbb742736383"}, - {file = "black-22.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:432247333090c8c5366e69627ccb363bc58514ae3e63f7fc75c54b1ea80fa7de"}, - {file = "black-22.10.0-py3-none-any.whl", hash = "sha256:c957b2b4ea88587b46cf49d1dc17681c1e672864fd7af32fc1e9664d572b3458"}, - {file = "black-22.10.0.tar.gz", hash = "sha256:f513588da599943e0cde4e32cc9879e825d58720d6557062d1098c5ad80080e1"}, + {file = "black-22.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eedd20838bd5d75b80c9f5487dbcb06836a43833a37846cf1d8c1cc01cef59d"}, + {file = "black-22.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:159a46a4947f73387b4d83e87ea006dbb2337eab6c879620a3ba52699b1f4351"}, + {file = "black-22.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d30b212bffeb1e252b31dd269dfae69dd17e06d92b87ad26e23890f3efea366f"}, + {file = "black-22.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:7412e75863aa5c5411886804678b7d083c7c28421210180d67dfd8cf1221e1f4"}, + {file = "black-22.12.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c116eed0efb9ff870ded8b62fe9f28dd61ef6e9ddd28d83d7d264a38417dcee2"}, + {file = "black-22.12.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1f58cbe16dfe8c12b7434e50ff889fa479072096d79f0a7f25e4ab8e94cd8350"}, + {file = "black-22.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77d86c9f3db9b1bf6761244bc0b3572a546f5fe37917a044e02f3166d5aafa7d"}, + {file = "black-22.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:82d9fe8fee3401e02e79767016b4907820a7dc28d70d137eb397b92ef3cc5bfc"}, + {file = "black-22.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:101c69b23df9b44247bd88e1d7e90154336ac4992502d4197bdac35dd7ee3320"}, + {file = "black-22.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:559c7a1ba9a006226f09e4916060982fd27334ae1998e7a38b3f33a37f7a2148"}, + {file = "black-22.12.0-py3-none-any.whl", hash = "sha256:436cc9167dd28040ad90d3b404aec22cedf24a6e4d7de221bec2730ec0c97bcf"}, + {file = "black-22.12.0.tar.gz", hash = "sha256:229351e5a18ca30f447bf724d007f890f97e13af070bb6ad4c0a441cd7596a2f"}, ] [package.dependencies] @@ -141,13 +115,13 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "certifi" -version = "2023.5.7" +version = "2023.7.22" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, - {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, + {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, + {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, ] [[package]] @@ -228,27 +202,97 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "2.1.1" +version = "3.2.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false -python-versions = ">=3.6.0" -files = [ - {file = "charset-normalizer-2.1.1.tar.gz", hash = "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845"}, - {file = "charset_normalizer-2.1.1-py3-none-any.whl", hash = "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"}, +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, + {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, ] -[package.extras] -unicode-backport = ["unicodedata2"] - [[package]] name = "click" -version = "8.1.3" +version = "8.1.7" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" files = [ - {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, - {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, ] [package.dependencies] @@ -265,6 +309,25 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +[[package]] +name = "comm" +version = "0.1.4" +description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." +optional = false +python-versions = ">=3.6" +files = [ + {file = "comm-0.1.4-py3-none-any.whl", hash = "sha256:6d52794cba11b36ed9860999cd10fd02d6b2eac177068fdd585e1e2f8a96e67a"}, + {file = "comm-0.1.4.tar.gz", hash = "sha256:354e40a59c9dd6db50c5cc6b4acc887d82e9603787f83b68c01a80a923984d15"}, +] + +[package.dependencies] +traitlets = ">=4" + +[package.extras] +lint = ["black (>=22.6.0)", "mdformat (>0.7)", "mdformat-gfm (>=0.3.5)", "ruff (>=0.0.156)"] +test = ["pytest"] +typing = ["mypy (>=0.990)"] + [[package]] name = "coverage" version = "6.5.0" @@ -329,34 +392,34 @@ toml = ["tomli"] [[package]] name = "cryptography" -version = "39.0.1" +version = "41.0.7" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "cryptography-39.0.1-cp36-abi3-macosx_10_12_universal2.whl", hash = "sha256:6687ef6d0a6497e2b58e7c5b852b53f62142cfa7cd1555795758934da363a965"}, - {file = "cryptography-39.0.1-cp36-abi3-macosx_10_12_x86_64.whl", hash = "sha256:706843b48f9a3f9b9911979761c91541e3d90db1ca905fd63fee540a217698bc"}, - {file = "cryptography-39.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:5d2d8b87a490bfcd407ed9d49093793d0f75198a35e6eb1a923ce1ee86c62b41"}, - {file = "cryptography-39.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83e17b26de248c33f3acffb922748151d71827d6021d98c70e6c1a25ddd78505"}, - {file = "cryptography-39.0.1-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e124352fd3db36a9d4a21c1aa27fd5d051e621845cb87fb851c08f4f75ce8be6"}, - {file = "cryptography-39.0.1-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:5aa67414fcdfa22cf052e640cb5ddc461924a045cacf325cd164e65312d99502"}, - {file = "cryptography-39.0.1-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:35f7c7d015d474f4011e859e93e789c87d21f6f4880ebdc29896a60403328f1f"}, - {file = "cryptography-39.0.1-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f24077a3b5298a5a06a8e0536e3ea9ec60e4c7ac486755e5fb6e6ea9b3500106"}, - {file = "cryptography-39.0.1-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:f0c64d1bd842ca2633e74a1a28033d139368ad959872533b1bab8c80e8240a0c"}, - {file = "cryptography-39.0.1-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:0f8da300b5c8af9f98111ffd512910bc792b4c77392a9523624680f7956a99d4"}, - {file = "cryptography-39.0.1-cp36-abi3-win32.whl", hash = "sha256:fe913f20024eb2cb2f323e42a64bdf2911bb9738a15dba7d3cce48151034e3a8"}, - {file = "cryptography-39.0.1-cp36-abi3-win_amd64.whl", hash = "sha256:ced4e447ae29ca194449a3f1ce132ded8fcab06971ef5f618605aacaa612beac"}, - {file = "cryptography-39.0.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:807ce09d4434881ca3a7594733669bd834f5b2c6d5c7e36f8c00f691887042ad"}, - {file = "cryptography-39.0.1-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c5caeb8188c24888c90b5108a441c106f7faa4c4c075a2bcae438c6e8ca73cef"}, - {file = "cryptography-39.0.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4789d1e3e257965e960232345002262ede4d094d1a19f4d3b52e48d4d8f3b885"}, - {file = "cryptography-39.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:96f1157a7c08b5b189b16b47bc9db2332269d6680a196341bf30046330d15388"}, - {file = "cryptography-39.0.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e422abdec8b5fa8462aa016786680720d78bdce7a30c652b7fadf83a4ba35336"}, - {file = "cryptography-39.0.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:b0afd054cd42f3d213bf82c629efb1ee5f22eba35bf0eec88ea9ea7304f511a2"}, - {file = "cryptography-39.0.1-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:6f8ba7f0328b79f08bdacc3e4e66fb4d7aab0c3584e0bd41328dce5262e26b2e"}, - {file = "cryptography-39.0.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:ef8b72fa70b348724ff1218267e7f7375b8de4e8194d1636ee60510aae104cd0"}, - {file = "cryptography-39.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:aec5a6c9864be7df2240c382740fcf3b96928c46604eaa7f3091f58b878c0bb6"}, - {file = "cryptography-39.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fdd188c8a6ef8769f148f88f859884507b954cc64db6b52f66ef199bb9ad660a"}, - {file = "cryptography-39.0.1.tar.gz", hash = "sha256:d1f6198ee6d9148405e49887803907fe8962a23e6c6f83ea7d98f1c0de375695"}, + {file = "cryptography-41.0.7-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:3c78451b78313fa81607fa1b3f1ae0a5ddd8014c38a02d9db0616133987b9cdf"}, + {file = "cryptography-41.0.7-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:928258ba5d6f8ae644e764d0f996d61a8777559f72dfeb2eea7e2fe0ad6e782d"}, + {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a1b41bc97f1ad230a41657d9155113c7521953869ae57ac39ac7f1bb471469a"}, + {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:841df4caa01008bad253bce2a6f7b47f86dc9f08df4b433c404def869f590a15"}, + {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5429ec739a29df2e29e15d082f1d9ad683701f0ec7709ca479b3ff2708dae65a"}, + {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:43f2552a2378b44869fe8827aa19e69512e3245a219104438692385b0ee119d1"}, + {file = "cryptography-41.0.7-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:af03b32695b24d85a75d40e1ba39ffe7db7ffcb099fe507b39fd41a565f1b157"}, + {file = "cryptography-41.0.7-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:49f0805fc0b2ac8d4882dd52f4a3b935b210935d500b6b805f321addc8177406"}, + {file = "cryptography-41.0.7-cp37-abi3-win32.whl", hash = "sha256:f983596065a18a2183e7f79ab3fd4c475205b839e02cbc0efbbf9666c4b3083d"}, + {file = "cryptography-41.0.7-cp37-abi3-win_amd64.whl", hash = "sha256:90452ba79b8788fa380dfb587cca692976ef4e757b194b093d845e8d99f612f2"}, + {file = "cryptography-41.0.7-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:079b85658ea2f59c4f43b70f8119a52414cdb7be34da5d019a77bf96d473b960"}, + {file = "cryptography-41.0.7-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:b640981bf64a3e978a56167594a0e97db71c89a479da8e175d8bb5be5178c003"}, + {file = "cryptography-41.0.7-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e3114da6d7f95d2dee7d3f4eec16dacff819740bbab931aff8648cb13c5ff5e7"}, + {file = "cryptography-41.0.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d5ec85080cce7b0513cfd233914eb8b7bbd0633f1d1703aa28d1dd5a72f678ec"}, + {file = "cryptography-41.0.7-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7a698cb1dac82c35fcf8fe3417a3aaba97de16a01ac914b89a0889d364d2f6be"}, + {file = "cryptography-41.0.7-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:37a138589b12069efb424220bf78eac59ca68b95696fc622b6ccc1c0a197204a"}, + {file = "cryptography-41.0.7-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:68a2dec79deebc5d26d617bfdf6e8aab065a4f34934b22d3b5010df3ba36612c"}, + {file = "cryptography-41.0.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:09616eeaef406f99046553b8a40fbf8b1e70795a91885ba4c96a70793de5504a"}, + {file = "cryptography-41.0.7-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48a0476626da912a44cc078f9893f292f0b3e4c739caf289268168d8f4702a39"}, + {file = "cryptography-41.0.7-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c7f3201ec47d5207841402594f1d7950879ef890c0c495052fa62f58283fde1a"}, + {file = "cryptography-41.0.7-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c5ca78485a255e03c32b513f8c2bc39fedb7f5c5f8535545bdc223a03b24f248"}, + {file = "cryptography-41.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d6c391c021ab1f7a82da5d8d0b3cee2f4b2c455ec86c8aebbc84837a631ff309"}, + {file = "cryptography-41.0.7.tar.gz", hash = "sha256:13f93ce9bea8016c253b34afc6bd6a75993e5c40672ed5405a9c832f0d4a00bc"}, ] [package.dependencies] @@ -365,38 +428,38 @@ cffi = ">=1.12" [package.extras] docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] -pep8test = ["black", "check-manifest", "mypy", "ruff", "types-pytz", "types-requests"] -sdist = ["setuptools-rust (>=0.11.4)"] +nox = ["nox"] +pep8test = ["black", "check-sdist", "mypy", "ruff"] +sdist = ["build"] ssh = ["bcrypt (>=3.1.5)"] -test = ["hypothesis (>=1.11.4,!=3.79.2)", "iso8601", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-shard (>=0.1.2)", "pytest-subtests", "pytest-xdist", "pytz"] +test = ["pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] -tox = ["tox"] [[package]] name = "debugpy" -version = "1.6.3" +version = "1.6.7.post1" description = "An implementation of the Debug Adapter Protocol for Python" optional = false python-versions = ">=3.7" files = [ - {file = "debugpy-1.6.3-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:c4b2bd5c245eeb49824bf7e539f95fb17f9a756186e51c3e513e32999d8846f3"}, - {file = "debugpy-1.6.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b8deaeb779699350deeed835322730a3efec170b88927debc9ba07a1a38e2585"}, - {file = "debugpy-1.6.3-cp310-cp310-win32.whl", hash = "sha256:fc233a0160f3b117b20216f1169e7211b83235e3cd6749bcdd8dbb72177030c7"}, - {file = "debugpy-1.6.3-cp310-cp310-win_amd64.whl", hash = "sha256:dda8652520eae3945833e061cbe2993ad94a0b545aebd62e4e6b80ee616c76b2"}, - {file = "debugpy-1.6.3-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:d5c814596a170a0a58fa6fad74947e30bfd7e192a5d2d7bd6a12156c2899e13a"}, - {file = "debugpy-1.6.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c4cd6f37e3c168080d61d698390dfe2cd9e74ebf80b448069822a15dadcda57d"}, - {file = "debugpy-1.6.3-cp37-cp37m-win32.whl", hash = "sha256:3c9f985944a30cfc9ae4306ac6a27b9c31dba72ca943214dad4a0ab3840f6161"}, - {file = "debugpy-1.6.3-cp37-cp37m-win_amd64.whl", hash = "sha256:5ad571a36cec137ae6ed951d0ff75b5e092e9af6683da084753231150cbc5b25"}, - {file = "debugpy-1.6.3-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:adcfea5ea06d55d505375995e150c06445e2b20cd12885bcae566148c076636b"}, - {file = "debugpy-1.6.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:daadab4403427abd090eccb38d8901afd8b393e01fd243048fab3f1d7132abb4"}, - {file = "debugpy-1.6.3-cp38-cp38-win32.whl", hash = "sha256:6efc30325b68e451118b795eff6fe8488253ca3958251d5158106d9c87581bc6"}, - {file = "debugpy-1.6.3-cp38-cp38-win_amd64.whl", hash = "sha256:86d784b72c5411c833af1cd45b83d80c252b77c3bfdb43db17c441d772f4c734"}, - {file = "debugpy-1.6.3-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:4e255982552b0edfe3a6264438dbd62d404baa6556a81a88f9420d3ed79b06ae"}, - {file = "debugpy-1.6.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cca23cb6161ac89698d629d892520327dd1be9321c0960e610bbcb807232b45d"}, - {file = "debugpy-1.6.3-cp39-cp39-win32.whl", hash = "sha256:7c302095a81be0d5c19f6529b600bac971440db3e226dce85347cc27e6a61908"}, - {file = "debugpy-1.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:34d2cdd3a7c87302ba5322b86e79c32c2115be396f3f09ca13306d8a04fe0f16"}, - {file = "debugpy-1.6.3-py2.py3-none-any.whl", hash = "sha256:84c39940a0cac410bf6aa4db00ba174f973eef521fbe9dd058e26bcabad89c4f"}, - {file = "debugpy-1.6.3.zip", hash = "sha256:e8922090514a890eec99cfb991bab872dd2e353ebb793164d5f01c362b9a40bf"}, + {file = "debugpy-1.6.7.post1-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:903bd61d5eb433b6c25b48eae5e23821d4c1a19e25c9610205f5aeaccae64e32"}, + {file = "debugpy-1.6.7.post1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d16882030860081e7dd5aa619f30dec3c2f9a421e69861125f83cc372c94e57d"}, + {file = "debugpy-1.6.7.post1-cp310-cp310-win32.whl", hash = "sha256:eea8d8cfb9965ac41b99a61f8e755a8f50e9a20330938ad8271530210f54e09c"}, + {file = "debugpy-1.6.7.post1-cp310-cp310-win_amd64.whl", hash = "sha256:85969d864c45f70c3996067cfa76a319bae749b04171f2cdeceebe4add316155"}, + {file = "debugpy-1.6.7.post1-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:890f7ab9a683886a0f185786ffbda3b46495c4b929dab083b8c79d6825832a52"}, + {file = "debugpy-1.6.7.post1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4ac7a4dba28801d184b7fc0e024da2635ca87d8b0a825c6087bb5168e3c0d28"}, + {file = "debugpy-1.6.7.post1-cp37-cp37m-win32.whl", hash = "sha256:3370ef1b9951d15799ef7af41f8174194f3482ee689988379763ef61a5456426"}, + {file = "debugpy-1.6.7.post1-cp37-cp37m-win_amd64.whl", hash = "sha256:65b28435a17cba4c09e739621173ff90c515f7b9e8ea469b92e3c28ef8e5cdfb"}, + {file = "debugpy-1.6.7.post1-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:92b6dae8bfbd497c90596bbb69089acf7954164aea3228a99d7e43e5267f5b36"}, + {file = "debugpy-1.6.7.post1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72f5d2ecead8125cf669e62784ef1e6300f4067b0f14d9f95ee00ae06fc7c4f7"}, + {file = "debugpy-1.6.7.post1-cp38-cp38-win32.whl", hash = "sha256:f0851403030f3975d6e2eaa4abf73232ab90b98f041e3c09ba33be2beda43fcf"}, + {file = "debugpy-1.6.7.post1-cp38-cp38-win_amd64.whl", hash = "sha256:3de5d0f97c425dc49bce4293df6a04494309eedadd2b52c22e58d95107e178d9"}, + {file = "debugpy-1.6.7.post1-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:38651c3639a4e8bbf0ca7e52d799f6abd07d622a193c406be375da4d510d968d"}, + {file = "debugpy-1.6.7.post1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:038c51268367c9c935905a90b1c2d2dbfe304037c27ba9d19fe7409f8cdc710c"}, + {file = "debugpy-1.6.7.post1-cp39-cp39-win32.whl", hash = "sha256:4b9eba71c290852f959d2cf8a03af28afd3ca639ad374d393d53d367f7f685b2"}, + {file = "debugpy-1.6.7.post1-cp39-cp39-win_amd64.whl", hash = "sha256:973a97ed3b434eab0f792719a484566c35328196540676685c975651266fccf9"}, + {file = "debugpy-1.6.7.post1-py2.py3-none-any.whl", hash = "sha256:1093a5c541af079c13ac8c70ab8b24d1d35c8cacb676306cf11e57f699c02926"}, + {file = "debugpy-1.6.7.post1.zip", hash = "sha256:fe87ec0182ef624855d05e6ed7e0b7cb1359d2ffa2a925f8ec2d22e98b75d0ca"}, ] [[package]] @@ -410,6 +473,34 @@ files = [ {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, ] +[[package]] +name = "deepl" +version = "1.16.1" +description = "Python library for the DeepL API." +optional = false +python-versions = ">=3.6.2,<4" +files = [ + {file = "deepl-1.16.1-py3-none-any.whl", hash = "sha256:17bd19a28850a10513377afc1b0e28ee907502e4a4a547d616bfa9cf65dfd4ea"}, + {file = "deepl-1.16.1.tar.gz", hash = "sha256:b34d4a8644c9e62a7a9c24acfe80a07717bd0a3b2be77b633a10d5d4fe748dcd"}, +] + +[package.dependencies] +requests = ">=2,<3" + +[package.extras] +keyring = ["keyring (>=23.4.1,<24.0.0)"] + +[[package]] +name = "delayed-assert" +version = "0.3.6" +description = "Delayed/soft assertions for python" +optional = false +python-versions = "*" +files = [ + {file = "delayed_assert-0.3.6-py3-none-any.whl", hash = "sha256:9987466c4d05c94af21151f27e58a8c13beba176e5f358d16c21b6abd3e6268b"}, + {file = "delayed_assert-0.3.6.tar.gz", hash = "sha256:0e1c65afae4bae9c57b91c76e38287562924c9964a58c309249790c725c46239"}, +] + [[package]] name = "deprecated" version = "1.2.14" @@ -427,21 +518,34 @@ wrapt = ">=1.10,<2" [package.extras] dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "sphinx (<2)", "tox"] +[[package]] +name = "deprecation" +version = "2.1.0" +description = "A library to handle automated deprecations" +optional = false +python-versions = "*" +files = [ + {file = "deprecation-2.1.0-py2.py3-none-any.whl", hash = "sha256:a10811591210e1fb0e768a8c25517cabeabcba6f0bf96564f8ff45189f90b14a"}, + {file = "deprecation-2.1.0.tar.gz", hash = "sha256:72b3bde64e5d778694b0cf68178aed03d15e15477116add3fb773e581f9518ff"}, +] + +[package.dependencies] +packaging = "*" + [[package]] name = "dnspython" -version = "2.3.0" +version = "2.4.2" description = "DNS toolkit" optional = false -python-versions = ">=3.7,<4.0" +python-versions = ">=3.8,<4.0" files = [ - {file = "dnspython-2.3.0-py3-none-any.whl", hash = "sha256:89141536394f909066cabd112e3e1a37e4e654db00a25308b0f130bc3152eb46"}, - {file = "dnspython-2.3.0.tar.gz", hash = "sha256:224e32b03eb46be70e12ef6d64e0be123a64e621ab4c0822ff6d450d52a540b9"}, + {file = "dnspython-2.4.2-py3-none-any.whl", hash = "sha256:57c6fbaaeaaf39c891292012060beb141791735dbb4004798328fc2c467402d8"}, + {file = "dnspython-2.4.2.tar.gz", hash = "sha256:8dcfae8c7460a2f84b4072e26f1c9f4101ca20c071649cb7c34e8b6a93d58984"}, ] [package.extras] -curio = ["curio (>=1.2,<2.0)", "sniffio (>=1.1,<2.0)"] -dnssec = ["cryptography (>=2.6,<40.0)"] -doh = ["h2 (>=4.1.0)", "httpx (>=0.21.1)", "requests (>=2.23.0,<3.0.0)", "requests-toolbelt (>=0.9.1,<0.11.0)"] +dnssec = ["cryptography (>=2.6,<42.0)"] +doh = ["h2 (>=4.1.0)", "httpcore (>=0.17.3)", "httpx (>=0.24.1)"] doq = ["aioquic (>=0.9.20)"] idna = ["idna (>=2.1,<4.0)"] trio = ["trio (>=0.14,<0.23)"] @@ -480,17 +584,6 @@ files = [ dnspython = ">=2.0.0" idna = ">=2.0.0" -[[package]] -name = "entrypoints" -version = "0.4" -description = "Discover and load entry points from installed packages." -optional = false -python-versions = ">=3.6" -files = [ - {file = "entrypoints-0.4-py3-none-any.whl", hash = "sha256:f174b5ff827504fd3cd97cc3f8649f3693f51538c7e4bdf3ef002c8429d42f9f"}, - {file = "entrypoints-0.4.tar.gz", hash = "sha256:b706eddaa9218a19ebcd67b56818f05bb27589b1ca9e8d797b74affad4ccacd4"}, -] - [[package]] name = "et-xmlfile" version = "1.1.0" @@ -562,168 +655,77 @@ mccabe = ">=0.7.0,<0.8.0" pycodestyle = ">=2.9.0,<2.10.0" pyflakes = ">=2.5.0,<2.6.0" -[[package]] -name = "gevent" -version = "22.10.2" -description = "Coroutine-based network library" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5" -files = [ - {file = "gevent-22.10.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:97cd42382421779f5d82ec5007199e8a84aa288114975429e4fd0a98f2290f10"}, - {file = "gevent-22.10.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:1e1286a76f15b5e15f1e898731d50529e249529095a032453f2c101af3fde71c"}, - {file = "gevent-22.10.2-cp27-cp27m-win32.whl", hash = "sha256:59b47e81b399d49a5622f0f503c59f1ce57b7705306ea0196818951dfc2f36c8"}, - {file = "gevent-22.10.2-cp27-cp27m-win_amd64.whl", hash = "sha256:1d543c9407a1e4bca11a8932916988cfb16de00366de5bf7bc9e7a3f61e60b18"}, - {file = "gevent-22.10.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:4e2f008c82dc54ec94f4de12ca6feea60e419babb48ec145456907ae61625aa4"}, - {file = "gevent-22.10.2-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:990d7069f14dc40674e0d5cb43c68fd3bad8337048613b9bb94a0c4180ffc176"}, - {file = "gevent-22.10.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f23d0997149a816a2a9045af29c66f67f405a221745b34cefeac5769ed451db8"}, - {file = "gevent-22.10.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b43d500d7d3c0e03070dee813335bb5315215aa1cf6a04c61093dfdd718640b3"}, - {file = "gevent-22.10.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b68f4c9e20e47ad49fe797f37f91d5bbeace8765ce2707f979a8d4ec197e4d"}, - {file = "gevent-22.10.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1f001cac0ba8da76abfeb392a3057f81fab3d67cc916c7df8ea977a44a2cc989"}, - {file = "gevent-22.10.2-cp310-cp310-win_amd64.whl", hash = "sha256:3b7eae8a0653ba95a224faaddf629a913ace408edb67384d3117acf42d7dcf89"}, - {file = "gevent-22.10.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8f2477e7b0a903a01485c55bacf2089110e5f767014967ba4b287ff390ae2638"}, - {file = "gevent-22.10.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ddaa3e310a8f1a45b5c42cf50b54c31003a3028e7d4e085059090ea0e7a5fddd"}, - {file = "gevent-22.10.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98bc510e80f45486ef5b806a1c305e0e89f0430688c14984b0dbdec03331f48b"}, - {file = "gevent-22.10.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:877abdb3a669576b1d51ce6a49b7260b2a96f6b2424eb93287e779a3219d20ba"}, - {file = "gevent-22.10.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d21ad79cca234cdbfa249e727500b0ddcbc7adfff6614a96e6eaa49faca3e4f2"}, - {file = "gevent-22.10.2-cp311-cp311-win_amd64.whl", hash = "sha256:1e955238f59b2947631c9782a713280dd75884e40e455313b5b6bbc20b92ff73"}, - {file = "gevent-22.10.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:5aa99e4882a9e909b4756ee799c6fa0f79eb0542779fad4cc60efa23ec1b2aa8"}, - {file = "gevent-22.10.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:d82081656a5b9a94d37c718c8646c757e1617e389cdc533ea5e6a6f0b8b78545"}, - {file = "gevent-22.10.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54f4bfd74c178351a4a05c5c7df6f8a0a279ff6f392b57608ce0e83c768207f9"}, - {file = "gevent-22.10.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ff3796692dff50fec2f381b9152438b221335f557c4f9b811f7ded51b7a25a1"}, - {file = "gevent-22.10.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f01c9adbcb605364694b11dcd0542ec468a29ac7aba2fb5665dc6caf17ba4d7e"}, - {file = "gevent-22.10.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:9d85574eb729f981fea9a78998725a06292d90a3ed50ddca74530c3148c0be41"}, - {file = "gevent-22.10.2-cp36-cp36m-win32.whl", hash = "sha256:8c192d2073e558e241f0b592c1e2b34127a4481a5be240cad4796533b88b1a98"}, - {file = "gevent-22.10.2-cp36-cp36m-win_amd64.whl", hash = "sha256:a2237451c721a0f874ef89dbb4af4fdc172b76a964befaa69deb15b8fff10f49"}, - {file = "gevent-22.10.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:53ee7f170ed42c7561fe8aff5d381dc9a4124694e70580d0c02fba6aafc0ea37"}, - {file = "gevent-22.10.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:96c56c280e3c43cfd075efd10b250350ed5ffd3c1514ec99a080b1b92d7c8374"}, - {file = "gevent-22.10.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b6c144e08dfad4106effc043a026e5d0c0eff6ad031904c70bf5090c63f3a6a7"}, - {file = "gevent-22.10.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:018f93de7d5318d2fb440f846839a4464738468c3476d5c9cf7da45bb71c18bd"}, - {file = "gevent-22.10.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7ed2346eb9dc4344f9cb0d7963ce5b74fe16fdd031a2809bb6c2b6eba7ebcd5"}, - {file = "gevent-22.10.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:84c517e33ed604fa06b7d756dc0171169cc12f7fdd68eb7b17708a62eebf4516"}, - {file = "gevent-22.10.2-cp37-cp37m-win32.whl", hash = "sha256:4114f0f439f0b547bb6f1d474fee99ddb46736944ad2207cef3771828f6aa358"}, - {file = "gevent-22.10.2-cp37-cp37m-win_amd64.whl", hash = "sha256:0d581f22a5be6281b11ad6309b38b18f0638cf896931223cbaa5adb904826ef6"}, - {file = "gevent-22.10.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2929377c8ebfb6f4d868d161cd8de2ea6b9f6c7a5fcd4f78bcd537319c16190b"}, - {file = "gevent-22.10.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:efc003b6c1481165af61f0aeac248e0a9ac8d880bb3acbe469b448674b2d5281"}, - {file = "gevent-22.10.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db562a8519838bddad0c439a2b12246bab539dd50e299ea7ff3644274a33b6a5"}, - {file = "gevent-22.10.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1472012493ca1fac103f700d309cb6ef7964dcdb9c788d1768266e77712f5e49"}, - {file = "gevent-22.10.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c04ee32c11e9fcee47c1b431834878dc987a7a2cc4fe126ddcae3bad723ce89"}, - {file = "gevent-22.10.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8729129edef2637a8084258cb9ec4e4d5ca45d97ac77aa7a6ff19ccb530ab731"}, - {file = "gevent-22.10.2-cp38-cp38-win32.whl", hash = "sha256:ae90226074a6089371a95f20288431cd4b3f6b0b096856afd862e4ac9510cddd"}, - {file = "gevent-22.10.2-cp38-cp38-win_amd64.whl", hash = "sha256:494c7f29e94df9a1c3157d67bb7edfa32a46eed786e04d9ee68d39f375e30001"}, - {file = "gevent-22.10.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:58898dbabb5b11e4d0192aae165ad286dc6742c543e1be9d30dc82753547c508"}, - {file = "gevent-22.10.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:4197d423e198265eef39a0dea286ef389da9148e070310f34455ecee8172c391"}, - {file = "gevent-22.10.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da4183f0b9d9a1e25e1758099220d32c51cc2c6340ee0dea3fd236b2b37598e4"}, - {file = "gevent-22.10.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a5488eba6a568b4d23c072113da4fc0feb1b5f5ede7381656dc913e0d82204e2"}, - {file = "gevent-22.10.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:319d8b1699b7b8134de66d656cd739b308ab9c45ace14d60ae44de7775b456c9"}, - {file = "gevent-22.10.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f3329bedbba4d3146ae58c667e0f9ac1e6f1e1e6340c7593976cdc60aa7d1a47"}, - {file = "gevent-22.10.2-cp39-cp39-win32.whl", hash = "sha256:172caa66273315f283e90a315921902cb6549762bdcb0587fd60cb712a9d6263"}, - {file = "gevent-22.10.2-cp39-cp39-win_amd64.whl", hash = "sha256:323b207b281ba0405fea042067fa1a61662e5ac0d574ede4ebbda03efd20c350"}, - {file = "gevent-22.10.2-pp27-pypy_73-win_amd64.whl", hash = "sha256:ed7f16613eebf892a6a744d7a4a8f345bc6f066a0ff3b413e2479f9c0a180193"}, - {file = "gevent-22.10.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:a47a4e77e2bc668856aad92a0b8de7ee10768258d93cd03968e6c7ba2e832f76"}, - {file = "gevent-22.10.2.tar.gz", hash = "sha256:1ca01da176ee37b3527a2702f7d40dbc9ffb8cfc7be5a03bfa4f9eec45e55c46"}, -] - -[package.dependencies] -cffi = {version = ">=1.12.2", markers = "platform_python_implementation == \"CPython\" and sys_platform == \"win32\""} -greenlet = {version = ">=2.0.0", markers = "platform_python_implementation == \"CPython\""} -setuptools = "*" -"zope.event" = "*" -"zope.interface" = "*" - -[package.extras] -dnspython = ["dnspython (>=1.16.0,<2.0)", "idna"] -docs = ["repoze.sphinx.autointerface", "sphinxcontrib-programoutput", "zope.schema"] -monitor = ["psutil (>=5.7.0)"] -recommended = ["backports.socketpair", "cffi (>=1.12.2)", "dnspython (>=1.16.0,<2.0)", "idna", "psutil (>=5.7.0)", "selectors2"] -test = ["backports.socketpair", "cffi (>=1.12.2)", "contextvars (==2.4)", "coverage (>=5.0)", "coveralls (>=1.7.0)", "dnspython (>=1.16.0,<2.0)", "futures", "idna", "mock", "objgraph", "psutil (>=5.7.0)", "requests", "selectors2"] - [[package]] name = "greenlet" -version = "2.0.1" +version = "3.0.0a1" description = "Lightweight in-process concurrent programming" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" -files = [ - {file = "greenlet-2.0.1-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:9ed358312e63bf683b9ef22c8e442ef6c5c02973f0c2a939ec1d7b50c974015c"}, - {file = "greenlet-2.0.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:4f09b0010e55bec3239278f642a8a506b91034f03a4fb28289a7d448a67f1515"}, - {file = "greenlet-2.0.1-cp27-cp27m-win32.whl", hash = "sha256:1407fe45246632d0ffb7a3f4a520ba4e6051fc2cbd61ba1f806900c27f47706a"}, - {file = "greenlet-2.0.1-cp27-cp27m-win_amd64.whl", hash = "sha256:3001d00eba6bbf084ae60ec7f4bb8ed375748f53aeaefaf2a37d9f0370558524"}, - {file = "greenlet-2.0.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d566b82e92ff2e09dd6342df7e0eb4ff6275a3f08db284888dcd98134dbd4243"}, - {file = "greenlet-2.0.1-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:0722c9be0797f544a3ed212569ca3fe3d9d1a1b13942d10dd6f0e8601e484d26"}, - {file = "greenlet-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d37990425b4687ade27810e3b1a1c37825d242ebc275066cfee8cb6b8829ccd"}, - {file = "greenlet-2.0.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be35822f35f99dcc48152c9839d0171a06186f2d71ef76dc57fa556cc9bf6b45"}, - {file = "greenlet-2.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c140e7eb5ce47249668056edf3b7e9900c6a2e22fb0eaf0513f18a1b2c14e1da"}, - {file = "greenlet-2.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d21681f09e297a5adaa73060737e3aa1279a13ecdcfcc6ef66c292cb25125b2d"}, - {file = "greenlet-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fb412b7db83fe56847df9c47b6fe3f13911b06339c2aa02dcc09dce8bbf582cd"}, - {file = "greenlet-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:c6a08799e9e88052221adca55741bf106ec7ea0710bca635c208b751f0d5b617"}, - {file = "greenlet-2.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9e112e03d37987d7b90c1e98ba5e1b59e1645226d78d73282f45b326f7bddcb9"}, - {file = "greenlet-2.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56961cfca7da2fdd178f95ca407fa330c64f33289e1804b592a77d5593d9bd94"}, - {file = "greenlet-2.0.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:13ba6e8e326e2116c954074c994da14954982ba2795aebb881c07ac5d093a58a"}, - {file = "greenlet-2.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bf633a50cc93ed17e494015897361010fc08700d92676c87931d3ea464123ce"}, - {file = "greenlet-2.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9f2c221eecb7ead00b8e3ddb913c67f75cba078fd1d326053225a3f59d850d72"}, - {file = "greenlet-2.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:13ebf93c343dd8bd010cd98e617cb4c1c1f352a0cf2524c82d3814154116aa82"}, - {file = "greenlet-2.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:6f61d71bbc9b4a3de768371b210d906726535d6ca43506737682caa754b956cd"}, - {file = "greenlet-2.0.1-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:2d0bac0385d2b43a7bd1d651621a4e0f1380abc63d6fb1012213a401cbd5bf8f"}, - {file = "greenlet-2.0.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:f6327b6907b4cb72f650a5b7b1be23a2aab395017aa6f1adb13069d66360eb3f"}, - {file = "greenlet-2.0.1-cp35-cp35m-win32.whl", hash = "sha256:81b0ea3715bf6a848d6f7149d25bf018fd24554a4be01fcbbe3fdc78e890b955"}, - {file = "greenlet-2.0.1-cp35-cp35m-win_amd64.whl", hash = "sha256:38255a3f1e8942573b067510f9611fc9e38196077b0c8eb7a8c795e105f9ce77"}, - {file = "greenlet-2.0.1-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:04957dc96669be041e0c260964cfef4c77287f07c40452e61abe19d647505581"}, - {file = "greenlet-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:4aeaebcd91d9fee9aa768c1b39cb12214b30bf36d2b7370505a9f2165fedd8d9"}, - {file = "greenlet-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:974a39bdb8c90a85982cdb78a103a32e0b1be986d411303064b28a80611f6e51"}, - {file = "greenlet-2.0.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8dca09dedf1bd8684767bc736cc20c97c29bc0c04c413e3276e0962cd7aeb148"}, - {file = "greenlet-2.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4c0757db9bd08470ff8277791795e70d0bf035a011a528ee9a5ce9454b6cba2"}, - {file = "greenlet-2.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:5067920de254f1a2dee8d3d9d7e4e03718e8fd2d2d9db962c8c9fa781ae82a39"}, - {file = "greenlet-2.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:5a8e05057fab2a365c81abc696cb753da7549d20266e8511eb6c9d9f72fe3e92"}, - {file = "greenlet-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:3d75b8d013086b08e801fbbb896f7d5c9e6ccd44f13a9241d2bf7c0df9eda928"}, - {file = "greenlet-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:097e3dae69321e9100202fc62977f687454cd0ea147d0fd5a766e57450c569fd"}, - {file = "greenlet-2.0.1-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:cb242fc2cda5a307a7698c93173d3627a2a90d00507bccf5bc228851e8304963"}, - {file = "greenlet-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:72b00a8e7c25dcea5946692a2485b1a0c0661ed93ecfedfa9b6687bd89a24ef5"}, - {file = "greenlet-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5b0ff9878333823226d270417f24f4d06f235cb3e54d1103b71ea537a6a86ce"}, - {file = "greenlet-2.0.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be9e0fb2ada7e5124f5282d6381903183ecc73ea019568d6d63d33f25b2a9000"}, - {file = "greenlet-2.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b493db84d124805865adc587532ebad30efa68f79ad68f11b336e0a51ec86c2"}, - {file = "greenlet-2.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0459d94f73265744fee4c2d5ec44c6f34aa8a31017e6e9de770f7bcf29710be9"}, - {file = "greenlet-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a20d33124935d27b80e6fdacbd34205732660e0a1d35d8b10b3328179a2b51a1"}, - {file = "greenlet-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:ea688d11707d30e212e0110a1aac7f7f3f542a259235d396f88be68b649e47d1"}, - {file = "greenlet-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:afe07421c969e259e9403c3bb658968702bc3b78ec0b6fde3ae1e73440529c23"}, - {file = "greenlet-2.0.1-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:cd4ccc364cf75d1422e66e247e52a93da6a9b73cefa8cad696f3cbbb75af179d"}, - {file = "greenlet-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:4c8b1c43e75c42a6cafcc71defa9e01ead39ae80bd733a2608b297412beede68"}, - {file = "greenlet-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:659f167f419a4609bc0516fb18ea69ed39dbb25594934bd2dd4d0401660e8a1e"}, - {file = "greenlet-2.0.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:356e4519d4dfa766d50ecc498544b44c0249b6de66426041d7f8b751de4d6b48"}, - {file = "greenlet-2.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:811e1d37d60b47cb8126e0a929b58c046251f28117cb16fcd371eed61f66b764"}, - {file = "greenlet-2.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d38ffd0e81ba8ef347d2be0772e899c289b59ff150ebbbbe05dc61b1246eb4e0"}, - {file = "greenlet-2.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0109af1138afbfb8ae647e31a2b1ab030f58b21dd8528c27beaeb0093b7938a9"}, - {file = "greenlet-2.0.1-cp38-cp38-win32.whl", hash = "sha256:88c8d517e78acdf7df8a2134a3c4b964415b575d2840a2746ddb1cc6175f8608"}, - {file = "greenlet-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:d6ee1aa7ab36475035eb48c01efae87d37936a8173fc4d7b10bb02c2d75dd8f6"}, - {file = "greenlet-2.0.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:b1992ba9d4780d9af9726bbcef6a1db12d9ab1ccc35e5773685a24b7fb2758eb"}, - {file = "greenlet-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:b5e83e4de81dcc9425598d9469a624826a0b1211380ac444c7c791d4a2137c19"}, - {file = "greenlet-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:505138d4fa69462447a562a7c2ef723c6025ba12ac04478bc1ce2fcc279a2db5"}, - {file = "greenlet-2.0.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cce1e90dd302f45716a7715517c6aa0468af0bf38e814ad4eab58e88fc09f7f7"}, - {file = "greenlet-2.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e9744c657d896c7b580455e739899e492a4a452e2dd4d2b3e459f6b244a638d"}, - {file = "greenlet-2.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:662e8f7cad915ba75d8017b3e601afc01ef20deeeabf281bd00369de196d7726"}, - {file = "greenlet-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:41b825d65f31e394b523c84db84f9383a2f7eefc13d987f308f4663794d2687e"}, - {file = "greenlet-2.0.1-cp39-cp39-win32.whl", hash = "sha256:db38f80540083ea33bdab614a9d28bcec4b54daa5aff1668d7827a9fc769ae0a"}, - {file = "greenlet-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:b23d2a46d53210b498e5b701a1913697671988f4bf8e10f935433f6e7c332fb6"}, - {file = "greenlet-2.0.1.tar.gz", hash = "sha256:42e602564460da0e8ee67cb6d7236363ee5e131aa15943b6670e44e5c2ed0f67"}, -] - -[package.extras] -docs = ["Sphinx", "docutils (<0.18)"] -test = ["faulthandler", "objgraph", "psutil"] - -[[package]] -name = "grequests" -version = "0.6.0" -description = "Requests + Gevent" -optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "grequests-0.6.0-py3-none-any.whl", hash = "sha256:6eff964416021bb1dee4182a56cc2b551bfa42d37820e6aee6f2efa00d43a061"}, - {file = "grequests-0.6.0.tar.gz", hash = "sha256:7dec890c6668e6755a1ea968565535867956639301268394d24df67b478df666"}, + {file = "greenlet-3.0.0a1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a8dd92fd76a61af2abc8ccad0c6c6069b3c4ebd4727ecc9a7c33aae37651c8c7"}, + {file = "greenlet-3.0.0a1-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:889934aa8d72b6bfc46babd1dc4b817a56c97ec0f4a10ae7551fb60ab1f96fae"}, + {file = "greenlet-3.0.0a1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b767930af686551dc96a5eb70af3736709d547ffa275c11a5e820bfb3ae61d8d"}, + {file = "greenlet-3.0.0a1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b9a1f4d256b81f59ba87bb7a29b9b38b1c018e052dba60a543cb0ddb5062d159"}, + {file = "greenlet-3.0.0a1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3fb459ced6c5e3b2a895f23f1400f93e9b24d85c30fbe2d637d4f7706a1116b"}, + {file = "greenlet-3.0.0a1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:180ec55cb127bc745669eddc9793ffab6e0cf7311e67e1592f183d6ca00d88c1"}, + {file = "greenlet-3.0.0a1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ab81f9ff3e3c2ca65e824454214c10985a846cd9bee5f4d04e15cd875d9fe13b"}, + {file = "greenlet-3.0.0a1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:21ebcb570e0d8501457d6a2695a44c5af3b6c2143dc6644ec73574beba067c90"}, + {file = "greenlet-3.0.0a1-cp310-cp310-win_amd64.whl", hash = "sha256:4d0c0ffd732466ff324ced144fad55ed5deca36f6036c1d8f04cec69b084c9d6"}, + {file = "greenlet-3.0.0a1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a4a2d6ed0515c05afd5cc435361ced0baabd9ba4536ddfe8ad9a95bcb702c8ce"}, + {file = "greenlet-3.0.0a1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ffb9f8969789771e95d3c982a36be81f0adfaa7302a1d56e29f168ca15e284b8"}, + {file = "greenlet-3.0.0a1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b3f3568478bc21b85968e8038c4f98f4bf0039a692791bc324b5e0d1522f4b1"}, + {file = "greenlet-3.0.0a1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e160a65cc6023a237be870f2072513747d512a1d018efa083acce0b673cccc0"}, + {file = "greenlet-3.0.0a1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e31d1a33dc9006b278f72cb0aacfe397606c2693aa2fdc0c2f2dcddbad9e0b53"}, + {file = "greenlet-3.0.0a1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a00550757fca1b9cbc479f8eb1cf3514dbc0103b3f76eae46341c26ddcca67a9"}, + {file = "greenlet-3.0.0a1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2840187a94e258445e62ff1545e34f0b1a14aef4d0078e5c88246688d2b6515e"}, + {file = "greenlet-3.0.0a1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:271ed380389d2f7e4c1545b6e0837986e62504ab561edbaff05da9c9f3f98f96"}, + {file = "greenlet-3.0.0a1-cp311-cp311-win_amd64.whl", hash = "sha256:4ff2a765f4861fc018827eab4df1992f7508d06c62de5d2fe8a6ac2233d4f1d0"}, + {file = "greenlet-3.0.0a1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:463d63ca5d8c236788284a9a44b9715372a64d5318a6b5eee36815df1ea0ba3d"}, + {file = "greenlet-3.0.0a1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3530c0ec1fc98c43d5b7061781a8c55bd0db44f789f8152e19d9526cbed6021"}, + {file = "greenlet-3.0.0a1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bce5cf2b0f0b29680396c5c98ab39a011bd70f2dfa8b8a6811a69ee6d920cf9f"}, + {file = "greenlet-3.0.0a1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f5672082576d0e9f52fa0fa732ff57254d65faeb4a471bc339fe54b58b3e79d2"}, + {file = "greenlet-3.0.0a1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5552d7be37d878e9b6359bbffa0512d857bb9703616a4c0656b49c10739d5971"}, + {file = "greenlet-3.0.0a1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:36cebce1f30964d5672fd956860e7e7b69772da69658d5743cb676b442eeff36"}, + {file = "greenlet-3.0.0a1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:665942d3a954c3e4c976581715f57fb3b86f4cf6bae3ac30b133f8ff777ac6c7"}, + {file = "greenlet-3.0.0a1-cp312-cp312-win_amd64.whl", hash = "sha256:ce70aa089ec589b5d5fab388af9f8c9f9dfe8fe4ad844820a92eb240d8628ddf"}, + {file = "greenlet-3.0.0a1-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:17503397bf6cbb5e364217143b6150c540020c51a3f6b08f9a20cd67c25e2ca8"}, + {file = "greenlet-3.0.0a1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:d61bad421c1f496f9fb6114dbd7c30a1dac0e9ff90e9be06f4472cbd8f7a1704"}, + {file = "greenlet-3.0.0a1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bab71f73001cd15723c4e2ca398f2f48e0a3f584c619eefddb1525e8986e06eb"}, + {file = "greenlet-3.0.0a1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5f61df4fe07864561f49b45c8bd4d2c42e3f03d2872ed05c844902a58b875028"}, + {file = "greenlet-3.0.0a1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c02e514c72e745e49a3ae7e672a1018ba9b68460c21e0361054e956e5d595bc6"}, + {file = "greenlet-3.0.0a1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd31ab223e43ac64fd23f8f5dad249addadac2a459f040546200acbf7e84e353"}, + {file = "greenlet-3.0.0a1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6aac94ff957b5dea0216af71ab59c602e1b947b394e4f5e878a5a65643090038"}, + {file = "greenlet-3.0.0a1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d7ba2e5cb119eddbc10874b41047ad99525e39e397f7aef500e6da0d6f46ab91"}, + {file = "greenlet-3.0.0a1-cp37-cp37m-win32.whl", hash = "sha256:ac10196b8cde7a082e4e371ff171407270d3337c8d57ed43030094eb01d9c95c"}, + {file = "greenlet-3.0.0a1-cp37-cp37m-win_amd64.whl", hash = "sha256:0a9dfcadc1d79696e90ccb1275c30ad4ec5fd3d1ab3ae6671286fac78ef33435"}, + {file = "greenlet-3.0.0a1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5942b1d6ba447cff1ec23a21ec525dde2288f00464950bc647f4e0f03bd537d1"}, + {file = "greenlet-3.0.0a1-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:450a7e52a515402fd110ba807f1a7d464424bfa703be4effbcb97e1dfbfcc621"}, + {file = "greenlet-3.0.0a1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:df34b52aa50a38d7a79f3abc9fda7e400791447aa0400ed895f275f6d8b0bb1f"}, + {file = "greenlet-3.0.0a1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cda110faee67613fed221f90467003f477088ef1cc84c8fc88537785a5b4de9"}, + {file = "greenlet-3.0.0a1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f313771cb8ee0a04dfdf586b7d4076180d80c94be09049daeea018089b5b957"}, + {file = "greenlet-3.0.0a1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:42bfe67824a9b53e73f568f982f0d1d4c7ac0f587d2e702a23f8a7b505d7b7c2"}, + {file = "greenlet-3.0.0a1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0fc20e6e6b298861035a5fc5dcf9fbaa0546318e8bda81112591861a7dcc28f"}, + {file = "greenlet-3.0.0a1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f34ec09702be907727fd479046193725441aaaf7ed4636ca042734f469bb7451"}, + {file = "greenlet-3.0.0a1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:270432cfdd6a50016b8259b3bbf398a3f7c06a06f2c68c7b93e49f53bc193bcf"}, + {file = "greenlet-3.0.0a1-cp38-cp38-win32.whl", hash = "sha256:d47b2e1ad1429da9aa459ef189fbcd8a74ec28a16bc4c3f5f3cf3f88e36535eb"}, + {file = "greenlet-3.0.0a1-cp38-cp38-win_amd64.whl", hash = "sha256:e7b192c3df761d0fdd17c2d42d41c28460f124f5922e8bd524018f1d35610682"}, + {file = "greenlet-3.0.0a1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e20d5e8dc76b73db9280464d6e81bea05e51a99f4d4dd29c5f78dc79f294a5d3"}, + {file = "greenlet-3.0.0a1-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:ba94c08321b5d345100fc64eb1ab235f42faf9aabba805cface55ebe677f1c2c"}, + {file = "greenlet-3.0.0a1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:24071eee113d75fedebaeb86264d94f04b5a24e311c5ba3e8003c07d00112a7e"}, + {file = "greenlet-3.0.0a1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:585810056a8adacd3152945ebfcd25deb58335d41f16ae4e0f3d768918957f9a"}, + {file = "greenlet-3.0.0a1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e3a99f890f2cc5535e1b3a90049c6ca9ff9da9ec251cc130c8d269997f9d32ee"}, + {file = "greenlet-3.0.0a1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c355c99be5bb23e85d899b059a4f22fdf8a0741c57e7029425ee63eb436f689"}, + {file = "greenlet-3.0.0a1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dde0ab052c7a1deee8d13d72c37f2afecee30ebdf6eb139790157eaddf04dd61"}, + {file = "greenlet-3.0.0a1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ed0f4fad4c3656e34d20323a789b6a2d210a6bb82647d9c86dded372f55c58a1"}, + {file = "greenlet-3.0.0a1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53abf19b7dc62795c67b8d0a3d8ef866db166b21017632fff2624cf8fbf3481c"}, + {file = "greenlet-3.0.0a1-cp39-cp39-win32.whl", hash = "sha256:2fcf7af83516db35af3d0ed5d182dea8585eddd891977adff1b74212f4bfd2fd"}, + {file = "greenlet-3.0.0a1-cp39-cp39-win_amd64.whl", hash = "sha256:68368e908f14887fb202a81960bfbe3a02d97e6d3fa62b821556463084ffb131"}, + {file = "greenlet-3.0.0a1.tar.gz", hash = "sha256:1bd4ea36f0aeb14ca335e0c9594a5aaefa1ac4e2db7d86ba38f0be96166b3102"}, ] -[package.dependencies] -gevent = "*" -requests = "*" +[package.extras] +docs = ["Sphinx"] +test = ["objgraph", "psutil"] [[package]] name = "h11" @@ -738,13 +740,13 @@ files = [ [[package]] name = "httpcore" -version = "0.17.0" +version = "0.17.3" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.7" files = [ - {file = "httpcore-0.17.0-py3-none-any.whl", hash = "sha256:0fdfea45e94f0c9fd96eab9286077f9ff788dd186635ae61b312693e4d943599"}, - {file = "httpcore-0.17.0.tar.gz", hash = "sha256:cc045a3241afbf60ce056202301b4d8b6af08845e3294055eb26b09913ef903c"}, + {file = "httpcore-0.17.3-py3-none-any.whl", hash = "sha256:c2789b767ddddfa2a5782e3199b2b7f6894540b17b16ec26b2c4d8e103510b87"}, + {file = "httpcore-0.17.3.tar.gz", hash = "sha256:a6f30213335e34c1ade7be6ec7c47f19f50c56db36abef1a9dfa3815b1cb3888"}, ] [package.dependencies] @@ -759,52 +761,46 @@ socks = ["socksio (==1.*)"] [[package]] name = "httptools" -version = "0.5.0" +version = "0.6.0" description = "A collection of framework independent HTTP protocol utils." optional = false python-versions = ">=3.5.0" files = [ - {file = "httptools-0.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8f470c79061599a126d74385623ff4744c4e0f4a0997a353a44923c0b561ee51"}, - {file = "httptools-0.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e90491a4d77d0cb82e0e7a9cb35d86284c677402e4ce7ba6b448ccc7325c5421"}, - {file = "httptools-0.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1d2357f791b12d86faced7b5736dea9ef4f5ecdc6c3f253e445ee82da579449"}, - {file = "httptools-0.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f90cd6fd97c9a1b7fe9215e60c3bd97336742a0857f00a4cb31547bc22560c2"}, - {file = "httptools-0.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5230a99e724a1bdbbf236a1b58d6e8504b912b0552721c7c6b8570925ee0ccde"}, - {file = "httptools-0.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3a47a34f6015dd52c9eb629c0f5a8a5193e47bf2a12d9a3194d231eaf1bc451a"}, - {file = "httptools-0.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:24bb4bb8ac3882f90aa95403a1cb48465de877e2d5298ad6ddcfdebec060787d"}, - {file = "httptools-0.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e67d4f8734f8054d2c4858570cc4b233bf753f56e85217de4dfb2495904cf02e"}, - {file = "httptools-0.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7e5eefc58d20e4c2da82c78d91b2906f1a947ef42bd668db05f4ab4201a99f49"}, - {file = "httptools-0.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0297822cea9f90a38df29f48e40b42ac3d48a28637368f3ec6d15eebefd182f9"}, - {file = "httptools-0.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:557be7fbf2bfa4a2ec65192c254e151684545ebab45eca5d50477d562c40f986"}, - {file = "httptools-0.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:54465401dbbec9a6a42cf737627fb0f014d50dc7365a6b6cd57753f151a86ff0"}, - {file = "httptools-0.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4d9ebac23d2de960726ce45f49d70eb5466725c0087a078866043dad115f850f"}, - {file = "httptools-0.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:e8a34e4c0ab7b1ca17b8763613783e2458e77938092c18ac919420ab8655c8c1"}, - {file = "httptools-0.5.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f659d7a48401158c59933904040085c200b4be631cb5f23a7d561fbae593ec1f"}, - {file = "httptools-0.5.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef1616b3ba965cd68e6f759eeb5d34fbf596a79e84215eeceebf34ba3f61fdc7"}, - {file = "httptools-0.5.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3625a55886257755cb15194efbf209584754e31d336e09e2ffe0685a76cb4b60"}, - {file = "httptools-0.5.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:72ad589ba5e4a87e1d404cc1cb1b5780bfcb16e2aec957b88ce15fe879cc08ca"}, - {file = "httptools-0.5.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:850fec36c48df5a790aa735417dca8ce7d4b48d59b3ebd6f83e88a8125cde324"}, - {file = "httptools-0.5.0-cp36-cp36m-win_amd64.whl", hash = "sha256:f222e1e9d3f13b68ff8a835574eda02e67277d51631d69d7cf7f8e07df678c86"}, - {file = "httptools-0.5.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3cb8acf8f951363b617a8420768a9f249099b92e703c052f9a51b66342eea89b"}, - {file = "httptools-0.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:550059885dc9c19a072ca6d6735739d879be3b5959ec218ba3e013fd2255a11b"}, - {file = "httptools-0.5.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a04fe458a4597aa559b79c7f48fe3dceabef0f69f562daf5c5e926b153817281"}, - {file = "httptools-0.5.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7d0c1044bce274ec6711f0770fd2d5544fe392591d204c68328e60a46f88843b"}, - {file = "httptools-0.5.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c6eeefd4435055a8ebb6c5cc36111b8591c192c56a95b45fe2af22d9881eee25"}, - {file = "httptools-0.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:5b65be160adcd9de7a7e6413a4966665756e263f0d5ddeffde277ffeee0576a5"}, - {file = "httptools-0.5.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fe9c766a0c35b7e3d6b6939393c8dfdd5da3ac5dec7f971ec9134f284c6c36d6"}, - {file = "httptools-0.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:85b392aba273566c3d5596a0a490978c085b79700814fb22bfd537d381dd230c"}, - {file = "httptools-0.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5e3088f4ed33947e16fd865b8200f9cfae1144f41b64a8cf19b599508e096bc"}, - {file = "httptools-0.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c2a56b6aad7cc8f5551d8e04ff5a319d203f9d870398b94702300de50190f63"}, - {file = "httptools-0.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9b571b281a19762adb3f48a7731f6842f920fa71108aff9be49888320ac3e24d"}, - {file = "httptools-0.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa47ffcf70ba6f7848349b8a6f9b481ee0f7637931d91a9860a1838bfc586901"}, - {file = "httptools-0.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:bede7ee075e54b9a5bde695b4fc8f569f30185891796b2e4e09e2226801d09bd"}, - {file = "httptools-0.5.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:64eba6f168803a7469866a9c9b5263a7463fa8b7a25b35e547492aa7322036b6"}, - {file = "httptools-0.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4b098e4bb1174096a93f48f6193e7d9aa7071506a5877da09a783509ca5fff42"}, - {file = "httptools-0.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9423a2de923820c7e82e18980b937893f4aa8251c43684fa1772e341f6e06887"}, - {file = "httptools-0.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca1b7becf7d9d3ccdbb2f038f665c0f4857e08e1d8481cbcc1a86a0afcfb62b2"}, - {file = "httptools-0.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:50d4613025f15f4b11f1c54bbed4761c0020f7f921b95143ad6d58c151198142"}, - {file = "httptools-0.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8ffce9d81c825ac1deaa13bc9694c0562e2840a48ba21cfc9f3b4c922c16f372"}, - {file = "httptools-0.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:1af91b3650ce518d226466f30bbba5b6376dbd3ddb1b2be8b0658c6799dd450b"}, - {file = "httptools-0.5.0.tar.gz", hash = "sha256:295874861c173f9101960bba332429bb77ed4dcd8cdf5cee9922eb00e4f6bc09"}, + {file = "httptools-0.6.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:818325afee467d483bfab1647a72054246d29f9053fd17cc4b86cda09cc60339"}, + {file = "httptools-0.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72205730bf1be875003692ca54a4a7c35fac77b4746008966061d9d41a61b0f5"}, + {file = "httptools-0.6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33eb1d4e609c835966e969a31b1dedf5ba16b38cab356c2ce4f3e33ffa94cad3"}, + {file = "httptools-0.6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bdc6675ec6cb79d27e0575750ac6e2b47032742e24eed011b8db73f2da9ed40"}, + {file = "httptools-0.6.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:463c3bc5ef64b9cf091be9ac0e0556199503f6e80456b790a917774a616aff6e"}, + {file = "httptools-0.6.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:82f228b88b0e8c6099a9c4757ce9fdbb8b45548074f8d0b1f0fc071e35655d1c"}, + {file = "httptools-0.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:0781fedc610293a2716bc7fa142d4c85e6776bc59d617a807ff91246a95dea35"}, + {file = "httptools-0.6.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:721e503245d591527cddd0f6fd771d156c509e831caa7a57929b55ac91ee2b51"}, + {file = "httptools-0.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:274bf20eeb41b0956e34f6a81f84d26ed57c84dd9253f13dcb7174b27ccd8aaf"}, + {file = "httptools-0.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:259920bbae18740a40236807915def554132ad70af5067e562f4660b62c59b90"}, + {file = "httptools-0.6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03bfd2ae8a2d532952ac54445a2fb2504c804135ed28b53fefaf03d3a93eb1fd"}, + {file = "httptools-0.6.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f959e4770b3fc8ee4dbc3578fd910fab9003e093f20ac8c621452c4d62e517cb"}, + {file = "httptools-0.6.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6e22896b42b95b3237eccc42278cd72c0df6f23247d886b7ded3163452481e38"}, + {file = "httptools-0.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:38f3cafedd6aa20ae05f81f2e616ea6f92116c8a0f8dcb79dc798df3356836e2"}, + {file = "httptools-0.6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:47043a6e0ea753f006a9d0dd076a8f8c99bc0ecae86a0888448eb3076c43d717"}, + {file = "httptools-0.6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35a541579bed0270d1ac10245a3e71e5beeb1903b5fbbc8d8b4d4e728d48ff1d"}, + {file = "httptools-0.6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65d802e7b2538a9756df5acc062300c160907b02e15ed15ba035b02bce43e89c"}, + {file = "httptools-0.6.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:26326e0a8fe56829f3af483200d914a7cd16d8d398d14e36888b56de30bec81a"}, + {file = "httptools-0.6.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e41ccac9e77cd045f3e4ee0fc62cbf3d54d7d4b375431eb855561f26ee7a9ec4"}, + {file = "httptools-0.6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4e748fc0d5c4a629988ef50ac1aef99dfb5e8996583a73a717fc2cac4ab89932"}, + {file = "httptools-0.6.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:cf8169e839a0d740f3d3c9c4fa630ac1a5aaf81641a34575ca6773ed7ce041a1"}, + {file = "httptools-0.6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5dcc14c090ab57b35908d4a4585ec5c0715439df07be2913405991dbb37e049d"}, + {file = "httptools-0.6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d0b0571806a5168013b8c3d180d9f9d6997365a4212cb18ea20df18b938aa0b"}, + {file = "httptools-0.6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fb4a608c631f7dcbdf986f40af7a030521a10ba6bc3d36b28c1dc9e9035a3c0"}, + {file = "httptools-0.6.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:93f89975465133619aea8b1952bc6fa0e6bad22a447c6d982fc338fbb4c89649"}, + {file = "httptools-0.6.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:73e9d66a5a28b2d5d9fbd9e197a31edd02be310186db423b28e6052472dc8201"}, + {file = "httptools-0.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:22c01fcd53648162730a71c42842f73b50f989daae36534c818b3f5050b54589"}, + {file = "httptools-0.6.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3f96d2a351b5625a9fd9133c95744e8ca06f7a4f8f0b8231e4bbaae2c485046a"}, + {file = "httptools-0.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:72ec7c70bd9f95ef1083d14a755f321d181f046ca685b6358676737a5fecd26a"}, + {file = "httptools-0.6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b703d15dbe082cc23266bf5d9448e764c7cb3fcfe7cb358d79d3fd8248673ef9"}, + {file = "httptools-0.6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82c723ed5982f8ead00f8e7605c53e55ffe47c47465d878305ebe0082b6a1755"}, + {file = "httptools-0.6.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b0a816bb425c116a160fbc6f34cece097fd22ece15059d68932af686520966bd"}, + {file = "httptools-0.6.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:dea66d94e5a3f68c5e9d86e0894653b87d952e624845e0b0e3ad1c733c6cc75d"}, + {file = "httptools-0.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:23b09537086a5a611fad5696fc8963d67c7e7f98cb329d38ee114d588b0b74cd"}, + {file = "httptools-0.6.0.tar.gz", hash = "sha256:9fc6e409ad38cbd68b177cd5158fc4042c796b82ca88d99ec78f07bed6c6b796"}, ] [package.extras] @@ -812,13 +808,13 @@ test = ["Cython (>=0.29.24,<0.30.0)"] [[package]] name = "httpx" -version = "0.24.0" +version = "0.24.1" description = "The next generation HTTP client." optional = false python-versions = ">=3.7" files = [ - {file = "httpx-0.24.0-py3-none-any.whl", hash = "sha256:447556b50c1921c351ea54b4fe79d91b724ed2b027462ab9a329465d147d5a4e"}, - {file = "httpx-0.24.0.tar.gz", hash = "sha256:507d676fc3e26110d41df7d35ebd8b3b8585052450f4097401c9be59d928c63e"}, + {file = "httpx-0.24.1-py3-none-any.whl", hash = "sha256:06781eb9ac53cde990577af654bd990a4949de37a28bdb4a230d434f3a30b9bd"}, + {file = "httpx-0.24.1.tar.gz", hash = "sha256:5853a43053df830c20f8110c5e69fe44d035d850b2dfe795e196f00fdb774bdd"}, ] [package.dependencies] @@ -846,18 +842,18 @@ files = [ [[package]] name = "importlib-resources" -version = "5.12.0" +version = "6.0.1" description = "Read resources from Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "importlib_resources-5.12.0-py3-none-any.whl", hash = "sha256:7b1deeebbf351c7578e09bf2f63fa2ce8b5ffec296e0d349139d43cca061a81a"}, - {file = "importlib_resources-5.12.0.tar.gz", hash = "sha256:4be82589bf5c1d7999aedf2a45159d10cb3ca4f19b2271f8792bc8e6da7b22f6"}, + {file = "importlib_resources-6.0.1-py3-none-any.whl", hash = "sha256:134832a506243891221b88b4ae1213327eea96ceb4e407a00d790bb0626f45cf"}, + {file = "importlib_resources-6.0.1.tar.gz", hash = "sha256:4359457e42708462b9626a04657c6208ad799ceb41e5c58c57ffa0e6a098a5d4"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff"] [[package]] name = "iniconfig" @@ -872,41 +868,46 @@ files = [ [[package]] name = "ipykernel" -version = "6.17.1" +version = "6.25.1" description = "IPython Kernel for Jupyter" optional = false python-versions = ">=3.8" files = [ - {file = "ipykernel-6.17.1-py3-none-any.whl", hash = "sha256:3a9a1b2ad6dbbd5879855aabb4557f08e63fa2208bffed897f03070e2bb436f6"}, - {file = "ipykernel-6.17.1.tar.gz", hash = "sha256:e178c1788399f93a459c241fe07c3b810771c607b1fb064a99d2c5d40c90c5d4"}, + {file = "ipykernel-6.25.1-py3-none-any.whl", hash = "sha256:c8a2430b357073b37c76c21c52184db42f6b4b0e438e1eb7df3c4440d120497c"}, + {file = "ipykernel-6.25.1.tar.gz", hash = "sha256:050391364c0977e768e354bdb60cbbfbee7cbb943b1af1618382021136ffd42f"}, ] [package.dependencies] appnope = {version = "*", markers = "platform_system == \"Darwin\""} -debugpy = ">=1.0" +comm = ">=0.1.1" +debugpy = ">=1.6.5" ipython = ">=7.23.1" jupyter-client = ">=6.1.12" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" matplotlib-inline = ">=0.1" nest-asyncio = "*" packaging = "*" psutil = "*" -pyzmq = ">=17" +pyzmq = ">=20" tornado = ">=6.1" -traitlets = ">=5.1.0" +traitlets = ">=5.4.0" [package.extras] -docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinxcontrib-github-alt"] -test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-cov", "pytest-timeout"] +cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] +pyqt5 = ["pyqt5"] +pyside6 = ["pyside6"] +test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov", "pytest-timeout"] [[package]] name = "ipython" -version = "8.6.0" +version = "8.14.0" description = "IPython: Productive Interactive Computing" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "ipython-8.6.0-py3-none-any.whl", hash = "sha256:91ef03016bcf72dd17190f863476e7c799c6126ec7e8be97719d1bc9a78a59a4"}, - {file = "ipython-8.6.0.tar.gz", hash = "sha256:7c959e3dedbf7ed81f9b9d8833df252c430610e2a4a6464ec13cd20975ce20a5"}, + {file = "ipython-8.14.0-py3-none-any.whl", hash = "sha256:248aca623f5c99a6635bc3857677b7320b9b8039f99f070ee0d20a5ca5a8e6bf"}, + {file = "ipython-8.14.0.tar.gz", hash = "sha256:1d197b907b6ba441b692c48cf2a3a2de280dc0ac91a3405b39349a50272ca0a1"}, ] [package.dependencies] @@ -918,13 +919,13 @@ jedi = ">=0.16" matplotlib-inline = "*" pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} pickleshare = "*" -prompt-toolkit = ">3.0.1,<3.1.0" +prompt-toolkit = ">=3.0.30,<3.0.37 || >3.0.37,<3.1.0" pygments = ">=2.4.0" stack-data = "*" traitlets = ">=5" [package.extras] -all = ["black", "curio", "docrepr", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.20)", "pandas", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] +all = ["black", "curio", "docrepr", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.21)", "pandas", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] black = ["black"] doc = ["docrepr", "ipykernel", "matplotlib", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] kernel = ["ipykernel"] @@ -934,7 +935,7 @@ notebook = ["ipywidgets", "notebook"] parallel = ["ipyparallel"] qtconsole = ["qtconsole"] test = ["pytest (<7.1)", "pytest-asyncio", "testpath"] -test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.20)", "pandas", "pytest (<7.1)", "pytest-asyncio", "testpath", "trio"] +test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pandas", "pytest (<7.1)", "pytest-asyncio", "testpath", "trio"] [[package]] name = "itsdangerous" @@ -949,21 +950,22 @@ files = [ [[package]] name = "jedi" -version = "0.18.1" +version = "0.19.0" description = "An autocompletion tool for Python that can be used for text editors." optional = false python-versions = ">=3.6" files = [ - {file = "jedi-0.18.1-py2.py3-none-any.whl", hash = "sha256:637c9635fcf47945ceb91cd7f320234a7be540ded6f3e99a50cb6febdfd1ba8d"}, - {file = "jedi-0.18.1.tar.gz", hash = "sha256:74137626a64a99c8eb6ae5832d99b3bdd7d29a3850fe2aa80a4126b2a7d949ab"}, + {file = "jedi-0.19.0-py2.py3-none-any.whl", hash = "sha256:cb8ce23fbccff0025e9386b5cf85e892f94c9b822378f8da49970471335ac64e"}, + {file = "jedi-0.19.0.tar.gz", hash = "sha256:bcf9894f1753969cbac8022a8c2eaee06bfa3724e4192470aaffe7eb6272b0c4"}, ] [package.dependencies] -parso = ">=0.8.0,<0.9.0" +parso = ">=0.8.3,<0.9.0" [package.extras] -qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] -testing = ["Django (<3.1)", "colorama", "docopt", "pytest (<7.0.0)"] +docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] [[package]] name = "jinja2" @@ -984,45 +986,44 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "jupyter-client" -version = "7.4.7" +version = "8.3.0" description = "Jupyter protocol implementation and client libraries" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "jupyter_client-7.4.7-py3-none-any.whl", hash = "sha256:df56ae23b8e1da1b66f89dee1368e948b24a7f780fa822c5735187589fc4c157"}, - {file = "jupyter_client-7.4.7.tar.gz", hash = "sha256:330f6b627e0b4bf2f54a3a0dd9e4a22d2b649c8518168afedce2c96a1ceb2860"}, + {file = "jupyter_client-8.3.0-py3-none-any.whl", hash = "sha256:7441af0c0672edc5d28035e92ba5e32fadcfa8a4e608a434c228836a89df6158"}, + {file = "jupyter_client-8.3.0.tar.gz", hash = "sha256:3af69921fe99617be1670399a0b857ad67275eefcfa291e2c81a160b7b650f5f"}, ] [package.dependencies] -entrypoints = "*" -jupyter-core = ">=4.9.2" -nest-asyncio = ">=1.5.4" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" python-dateutil = ">=2.8.2" pyzmq = ">=23.0" tornado = ">=6.2" -traitlets = "*" +traitlets = ">=5.3" [package.extras] -doc = ["ipykernel", "myst-parser", "sphinx (>=1.3.6)", "sphinx-rtd-theme", "sphinxcontrib-github-alt"] -test = ["codecov", "coverage", "ipykernel (>=6.12)", "ipython", "mypy", "pre-commit", "pytest", "pytest-asyncio (>=0.18)", "pytest-cov", "pytest-timeout"] +docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] [[package]] name = "jupyter-core" -version = "5.0.0" +version = "5.3.1" description = "Jupyter core package. A base package on which Jupyter projects rely." optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_core-5.0.0-py3-none-any.whl", hash = "sha256:6da1fae48190da8551e1b5dbbb19d51d00b079d59a073c7030407ecaf96dbb1e"}, - {file = "jupyter_core-5.0.0.tar.gz", hash = "sha256:4ed68b7c606197c7e344a24b7195eef57898157075a69655a886074b6beb7043"}, + {file = "jupyter_core-5.3.1-py3-none-any.whl", hash = "sha256:ae9036db959a71ec1cac33081eeb040a79e681f08ab68b0883e9a676c7a90dce"}, + {file = "jupyter_core-5.3.1.tar.gz", hash = "sha256:5ba5c7938a7f97a6b0481463f7ff0dbac7c15ba48cf46fa4035ca6e838aa1aba"}, ] [package.dependencies] -platformdirs = "*" -pywin32 = {version = ">=1.0", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} -traitlets = "*" +platformdirs = ">=2.5" +pywin32 = {version = ">=300", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} +traitlets = ">=5.3" [package.extras] +docs = ["myst-parser", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] [[package]] @@ -1055,6 +1056,113 @@ mongodb = ["pymongo (>4.1,<5)"] redis = ["redis (>3,!=4.5.2,!=4.5.3,<5.0.0)"] rediscluster = ["redis (>=4.2.0,!=4.5.2,!=4.5.3)"] +[[package]] +name = "lxml" +version = "4.9.3" +description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" +files = [ + {file = "lxml-4.9.3-cp27-cp27m-macosx_11_0_x86_64.whl", hash = "sha256:b0a545b46b526d418eb91754565ba5b63b1c0b12f9bd2f808c852d9b4b2f9b5c"}, + {file = "lxml-4.9.3-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:075b731ddd9e7f68ad24c635374211376aa05a281673ede86cbe1d1b3455279d"}, + {file = "lxml-4.9.3-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1e224d5755dba2f4a9498e150c43792392ac9b5380aa1b845f98a1618c94eeef"}, + {file = "lxml-4.9.3-cp27-cp27m-win32.whl", hash = "sha256:2c74524e179f2ad6d2a4f7caf70e2d96639c0954c943ad601a9e146c76408ed7"}, + {file = "lxml-4.9.3-cp27-cp27m-win_amd64.whl", hash = "sha256:4f1026bc732b6a7f96369f7bfe1a4f2290fb34dce00d8644bc3036fb351a4ca1"}, + {file = "lxml-4.9.3-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c0781a98ff5e6586926293e59480b64ddd46282953203c76ae15dbbbf302e8bb"}, + {file = "lxml-4.9.3-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cef2502e7e8a96fe5ad686d60b49e1ab03e438bd9123987994528febd569868e"}, + {file = "lxml-4.9.3-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:b86164d2cff4d3aaa1f04a14685cbc072efd0b4f99ca5708b2ad1b9b5988a991"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:42871176e7896d5d45138f6d28751053c711ed4d48d8e30b498da155af39aebd"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:ae8b9c6deb1e634ba4f1930eb67ef6e6bf6a44b6eb5ad605642b2d6d5ed9ce3c"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:411007c0d88188d9f621b11d252cce90c4a2d1a49db6c068e3c16422f306eab8"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:cd47b4a0d41d2afa3e58e5bf1f62069255aa2fd6ff5ee41604418ca925911d76"}, + {file = "lxml-4.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e2cb47860da1f7e9a5256254b74ae331687b9672dfa780eed355c4c9c3dbd23"}, + {file = "lxml-4.9.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1247694b26342a7bf47c02e513d32225ededd18045264d40758abeb3c838a51f"}, + {file = "lxml-4.9.3-cp310-cp310-win32.whl", hash = "sha256:cdb650fc86227eba20de1a29d4b2c1bfe139dc75a0669270033cb2ea3d391b85"}, + {file = "lxml-4.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:97047f0d25cd4bcae81f9ec9dc290ca3e15927c192df17331b53bebe0e3ff96d"}, + {file = "lxml-4.9.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:1f447ea5429b54f9582d4b955f5f1985f278ce5cf169f72eea8afd9502973dd5"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:57d6ba0ca2b0c462f339640d22882acc711de224d769edf29962b09f77129cbf"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:9767e79108424fb6c3edf8f81e6730666a50feb01a328f4a016464a5893f835a"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:71c52db65e4b56b8ddc5bb89fb2e66c558ed9d1a74a45ceb7dcb20c191c3df2f"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d73d8ecf8ecf10a3bd007f2192725a34bd62898e8da27eb9d32a58084f93962b"}, + {file = "lxml-4.9.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0a3d3487f07c1d7f150894c238299934a2a074ef590b583103a45002035be120"}, + {file = "lxml-4.9.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e28c51fa0ce5674be9f560c6761c1b441631901993f76700b1b30ca6c8378d6"}, + {file = "lxml-4.9.3-cp311-cp311-win32.whl", hash = "sha256:0bfd0767c5c1de2551a120673b72e5d4b628737cb05414f03c3277bf9bed3305"}, + {file = "lxml-4.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:25f32acefac14ef7bd53e4218fe93b804ef6f6b92ffdb4322bb6d49d94cad2bc"}, + {file = "lxml-4.9.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:d3ff32724f98fbbbfa9f49d82852b159e9784d6094983d9a8b7f2ddaebb063d4"}, + {file = "lxml-4.9.3-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:48d6ed886b343d11493129e019da91d4039826794a3e3027321c56d9e71505be"}, + {file = "lxml-4.9.3-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9a92d3faef50658dd2c5470af249985782bf754c4e18e15afb67d3ab06233f13"}, + {file = "lxml-4.9.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b4e4bc18382088514ebde9328da057775055940a1f2e18f6ad2d78aa0f3ec5b9"}, + {file = "lxml-4.9.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fc9b106a1bf918db68619fdcd6d5ad4f972fdd19c01d19bdb6bf63f3589a9ec5"}, + {file = "lxml-4.9.3-cp312-cp312-win_amd64.whl", hash = "sha256:d37017287a7adb6ab77e1c5bee9bcf9660f90ff445042b790402a654d2ad81d8"}, + {file = "lxml-4.9.3-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:56dc1f1ebccc656d1b3ed288f11e27172a01503fc016bcabdcbc0978b19352b7"}, + {file = "lxml-4.9.3-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:578695735c5a3f51569810dfebd05dd6f888147a34f0f98d4bb27e92b76e05c2"}, + {file = "lxml-4.9.3-cp35-cp35m-win32.whl", hash = "sha256:704f61ba8c1283c71b16135caf697557f5ecf3e74d9e453233e4771d68a1f42d"}, + {file = "lxml-4.9.3-cp35-cp35m-win_amd64.whl", hash = "sha256:c41bfca0bd3532d53d16fd34d20806d5c2b1ace22a2f2e4c0008570bf2c58833"}, + {file = "lxml-4.9.3-cp36-cp36m-macosx_11_0_x86_64.whl", hash = "sha256:64f479d719dc9f4c813ad9bb6b28f8390360660b73b2e4beb4cb0ae7104f1c12"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:dd708cf4ee4408cf46a48b108fb9427bfa00b9b85812a9262b5c668af2533ea5"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c31c7462abdf8f2ac0577d9f05279727e698f97ecbb02f17939ea99ae8daa98"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:e3cd95e10c2610c360154afdc2f1480aea394f4a4f1ea0a5eacce49640c9b190"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:4930be26af26ac545c3dffb662521d4e6268352866956672231887d18f0eaab2"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4aec80cde9197340bc353d2768e2a75f5f60bacda2bab72ab1dc499589b3878c"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:14e019fd83b831b2e61baed40cab76222139926b1fb5ed0e79225bc0cae14584"}, + {file = "lxml-4.9.3-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0c0850c8b02c298d3c7006b23e98249515ac57430e16a166873fc47a5d549287"}, + {file = "lxml-4.9.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:aca086dc5f9ef98c512bac8efea4483eb84abbf926eaeedf7b91479feb092458"}, + {file = "lxml-4.9.3-cp36-cp36m-win32.whl", hash = "sha256:50baa9c1c47efcaef189f31e3d00d697c6d4afda5c3cde0302d063492ff9b477"}, + {file = "lxml-4.9.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bef4e656f7d98aaa3486d2627e7d2df1157d7e88e7efd43a65aa5dd4714916cf"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:46f409a2d60f634fe550f7133ed30ad5321ae2e6630f13657fb9479506b00601"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:4c28a9144688aef80d6ea666c809b4b0e50010a2aca784c97f5e6bf143d9f129"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:141f1d1a9b663c679dc524af3ea1773e618907e96075262726c7612c02b149a4"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:53ace1c1fd5a74ef662f844a0413446c0629d151055340e9893da958a374f70d"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17a753023436a18e27dd7769e798ce302963c236bc4114ceee5b25c18c52c693"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7d298a1bd60c067ea75d9f684f5f3992c9d6766fadbc0bcedd39750bf344c2f4"}, + {file = "lxml-4.9.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:081d32421db5df44c41b7f08a334a090a545c54ba977e47fd7cc2deece78809a"}, + {file = "lxml-4.9.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:23eed6d7b1a3336ad92d8e39d4bfe09073c31bfe502f20ca5116b2a334f8ec02"}, + {file = "lxml-4.9.3-cp37-cp37m-win32.whl", hash = "sha256:1509dd12b773c02acd154582088820893109f6ca27ef7291b003d0e81666109f"}, + {file = "lxml-4.9.3-cp37-cp37m-win_amd64.whl", hash = "sha256:120fa9349a24c7043854c53cae8cec227e1f79195a7493e09e0c12e29f918e52"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:4d2d1edbca80b510443f51afd8496be95529db04a509bc8faee49c7b0fb6d2cc"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8d7e43bd40f65f7d97ad8ef5c9b1778943d02f04febef12def25f7583d19baac"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:71d66ee82e7417828af6ecd7db817913cb0cf9d4e61aa0ac1fde0583d84358db"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:6fc3c450eaa0b56f815c7b62f2b7fba7266c4779adcf1cece9e6deb1de7305ce"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:65299ea57d82fb91c7f019300d24050c4ddeb7c5a190e076b5f48a2b43d19c42"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:eadfbbbfb41b44034a4c757fd5d70baccd43296fb894dba0295606a7cf3124aa"}, + {file = "lxml-4.9.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3e9bdd30efde2b9ccfa9cb5768ba04fe71b018a25ea093379c857c9dad262c40"}, + {file = "lxml-4.9.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fcdd00edfd0a3001e0181eab3e63bd5c74ad3e67152c84f93f13769a40e073a7"}, + {file = "lxml-4.9.3-cp38-cp38-win32.whl", hash = "sha256:57aba1bbdf450b726d58b2aea5fe47c7875f5afb2c4a23784ed78f19a0462574"}, + {file = "lxml-4.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:92af161ecbdb2883c4593d5ed4815ea71b31fafd7fd05789b23100d081ecac96"}, + {file = "lxml-4.9.3-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:9bb6ad405121241e99a86efff22d3ef469024ce22875a7ae045896ad23ba2340"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:8ed74706b26ad100433da4b9d807eae371efaa266ffc3e9191ea436087a9d6a7"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:fbf521479bcac1e25a663df882c46a641a9bff6b56dc8b0fafaebd2f66fb231b"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:303bf1edce6ced16bf67a18a1cf8339d0db79577eec5d9a6d4a80f0fb10aa2da"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:5515edd2a6d1a5a70bfcdee23b42ec33425e405c5b351478ab7dc9347228f96e"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:690dafd0b187ed38583a648076865d8c229661ed20e48f2335d68e2cf7dc829d"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b6420a005548ad52154c8ceab4a1290ff78d757f9e5cbc68f8c77089acd3c432"}, + {file = "lxml-4.9.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bb3bb49c7a6ad9d981d734ef7c7193bc349ac338776a0360cc671eaee89bcf69"}, + {file = "lxml-4.9.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d27be7405547d1f958b60837dc4c1007da90b8b23f54ba1f8b728c78fdb19d50"}, + {file = "lxml-4.9.3-cp39-cp39-win32.whl", hash = "sha256:8df133a2ea5e74eef5e8fc6f19b9e085f758768a16e9877a60aec455ed2609b2"}, + {file = "lxml-4.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:4dd9a263e845a72eacb60d12401e37c616438ea2e5442885f65082c276dfb2b2"}, + {file = "lxml-4.9.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6689a3d7fd13dc687e9102a27e98ef33730ac4fe37795d5036d18b4d527abd35"}, + {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:f6bdac493b949141b733c5345b6ba8f87a226029cbabc7e9e121a413e49441e0"}, + {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:05186a0f1346ae12553d66df1cfce6f251589fea3ad3da4f3ef4e34b2d58c6a3"}, + {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c2006f5c8d28dee289f7020f721354362fa304acbaaf9745751ac4006650254b"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-macosx_11_0_x86_64.whl", hash = "sha256:5c245b783db29c4e4fbbbfc9c5a78be496c9fea25517f90606aa1f6b2b3d5f7b"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:4fb960a632a49f2f089d522f70496640fdf1218f1243889da3822e0a9f5f3ba7"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:50670615eaf97227d5dc60de2dc99fb134a7130d310d783314e7724bf163f75d"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9719fe17307a9e814580af1f5c6e05ca593b12fb7e44fe62450a5384dbf61b4b"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:3331bece23c9ee066e0fb3f96c61322b9e0f54d775fccefff4c38ca488de283a"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-macosx_11_0_x86_64.whl", hash = "sha256:ed667f49b11360951e201453fc3967344d0d0263aa415e1619e85ae7fd17b4e0"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:8b77946fd508cbf0fccd8e400a7f71d4ac0e1595812e66025bac475a8e811694"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:e4da8ca0c0c0aea88fd46be8e44bd49716772358d648cce45fe387f7b92374a7"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fe4bda6bd4340caa6e5cf95e73f8fea5c4bfc55763dd42f1b50a94c1b4a2fbd4"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:f3df3db1d336b9356dd3112eae5f5c2b8b377f3bc826848567f10bfddfee77e9"}, + {file = "lxml-4.9.3.tar.gz", hash = "sha256:48628bd53a426c9eb9bc066a923acaa0878d1e86129fd5359aee99285f4eed9c"}, +] + +[package.extras] +cssselect = ["cssselect (>=0.7)"] +html5 = ["html5lib"] +htmlsoup = ["BeautifulSoup4"] +source = ["Cython (>=0.29.35)"] + [[package]] name = "mako" version = "1.2.4" @@ -1076,51 +1184,71 @@ testing = ["pytest"] [[package]] name = "markupsafe" -version = "2.1.1" +version = "2.1.3" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.7" files = [ - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, - {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, + {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, ] [[package]] @@ -1150,72 +1278,69 @@ files = [ [[package]] name = "mypy-extensions" -version = "0.4.3" -description = "Experimental type system extensions for programs checked with the mypy typechecker." +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." optional = false -python-versions = "*" +python-versions = ">=3.5" files = [ - {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, - {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, ] [[package]] name = "nest-asyncio" -version = "1.5.6" +version = "1.5.7" description = "Patch asyncio to allow nested event loops" optional = false python-versions = ">=3.5" files = [ - {file = "nest_asyncio-1.5.6-py3-none-any.whl", hash = "sha256:b9a953fb40dceaa587d109609098db21900182b16440652454a146cffb06e8b8"}, - {file = "nest_asyncio-1.5.6.tar.gz", hash = "sha256:d267cc1ff794403f7df692964d1d2a3fa9418ffea2a3f6859a439ff482fef290"}, + {file = "nest_asyncio-1.5.7-py3-none-any.whl", hash = "sha256:5301c82941b550b3123a1ea772ba9a1c80bad3a182be8c1a5ae6ad3be57a9657"}, + {file = "nest_asyncio-1.5.7.tar.gz", hash = "sha256:6a80f7b98f24d9083ed24608977c09dd608d83f91cccc24c9d2cba6d10e01c10"}, ] [[package]] name = "numpy" -version = "1.23.5" -description = "NumPy is the fundamental package for array computing with Python." -optional = false -python-versions = ">=3.8" -files = [ - {file = "numpy-1.23.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9c88793f78fca17da0145455f0d7826bcb9f37da4764af27ac945488116efe63"}, - {file = "numpy-1.23.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e9f4c4e51567b616be64e05d517c79a8a22f3606499941d97bb76f2ca59f982d"}, - {file = "numpy-1.23.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7903ba8ab592b82014713c491f6c5d3a1cde5b4a3bf116404e08f5b52f6daf43"}, - {file = "numpy-1.23.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e05b1c973a9f858c74367553e236f287e749465f773328c8ef31abe18f691e1"}, - {file = "numpy-1.23.5-cp310-cp310-win32.whl", hash = "sha256:522e26bbf6377e4d76403826ed689c295b0b238f46c28a7251ab94716da0b280"}, - {file = "numpy-1.23.5-cp310-cp310-win_amd64.whl", hash = "sha256:dbee87b469018961d1ad79b1a5d50c0ae850000b639bcb1b694e9981083243b6"}, - {file = "numpy-1.23.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ce571367b6dfe60af04e04a1834ca2dc5f46004ac1cc756fb95319f64c095a96"}, - {file = "numpy-1.23.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56e454c7833e94ec9769fa0f86e6ff8e42ee38ce0ce1fa4cbb747ea7e06d56aa"}, - {file = "numpy-1.23.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5039f55555e1eab31124a5768898c9e22c25a65c1e0037f4d7c495a45778c9f2"}, - {file = "numpy-1.23.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58f545efd1108e647604a1b5aa809591ccd2540f468a880bedb97247e72db387"}, - {file = "numpy-1.23.5-cp311-cp311-win32.whl", hash = "sha256:b2a9ab7c279c91974f756c84c365a669a887efa287365a8e2c418f8b3ba73fb0"}, - {file = "numpy-1.23.5-cp311-cp311-win_amd64.whl", hash = "sha256:0cbe9848fad08baf71de1a39e12d1b6310f1d5b2d0ea4de051058e6e1076852d"}, - {file = "numpy-1.23.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f063b69b090c9d918f9df0a12116029e274daf0181df392839661c4c7ec9018a"}, - {file = "numpy-1.23.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0aaee12d8883552fadfc41e96b4c82ee7d794949e2a7c3b3a7201e968c7ecab9"}, - {file = "numpy-1.23.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92c8c1e89a1f5028a4c6d9e3ccbe311b6ba53694811269b992c0b224269e2398"}, - {file = "numpy-1.23.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d208a0f8729f3fb790ed18a003f3a57895b989b40ea4dce4717e9cf4af62c6bb"}, - {file = "numpy-1.23.5-cp38-cp38-win32.whl", hash = "sha256:06005a2ef6014e9956c09ba07654f9837d9e26696a0470e42beedadb78c11b07"}, - {file = "numpy-1.23.5-cp38-cp38-win_amd64.whl", hash = "sha256:ca51fcfcc5f9354c45f400059e88bc09215fb71a48d3768fb80e357f3b457e1e"}, - {file = "numpy-1.23.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8969bfd28e85c81f3f94eb4a66bc2cf1dbdc5c18efc320af34bffc54d6b1e38f"}, - {file = "numpy-1.23.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a7ac231a08bb37f852849bbb387a20a57574a97cfc7b6cabb488a4fc8be176de"}, - {file = "numpy-1.23.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf837dc63ba5c06dc8797c398db1e223a466c7ece27a1f7b5232ba3466aafe3d"}, - {file = "numpy-1.23.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33161613d2269025873025b33e879825ec7b1d831317e68f4f2f0f84ed14c719"}, - {file = "numpy-1.23.5-cp39-cp39-win32.whl", hash = "sha256:af1da88f6bc3d2338ebbf0e22fe487821ea4d8e89053e25fa59d1d79786e7481"}, - {file = "numpy-1.23.5-cp39-cp39-win_amd64.whl", hash = "sha256:09b7847f7e83ca37c6e627682f145856de331049013853f344f37b0c9690e3df"}, - {file = "numpy-1.23.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:abdde9f795cf292fb9651ed48185503a2ff29be87770c3b8e2a14b0cd7aa16f8"}, - {file = "numpy-1.23.5-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9a909a8bae284d46bbfdefbdd4a262ba19d3bc9921b1e76126b1d21c3c34135"}, - {file = "numpy-1.23.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:01dd17cbb340bf0fc23981e52e1d18a9d4050792e8fb8363cecbf066a84b827d"}, - {file = "numpy-1.23.5.tar.gz", hash = "sha256:1b1766d6f397c18153d40015ddfc79ddb715cabadc04d2d228d4e5a8bc4ded1a"}, +version = "1.25.2" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numpy-1.25.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:db3ccc4e37a6873045580d413fe79b68e47a681af8db2e046f1dacfa11f86eb3"}, + {file = "numpy-1.25.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:90319e4f002795ccfc9050110bbbaa16c944b1c37c0baeea43c5fb881693ae1f"}, + {file = "numpy-1.25.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfe4a913e29b418d096e696ddd422d8a5d13ffba4ea91f9f60440a3b759b0187"}, + {file = "numpy-1.25.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f08f2e037bba04e707eebf4bc934f1972a315c883a9e0ebfa8a7756eabf9e357"}, + {file = "numpy-1.25.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bec1e7213c7cb00d67093247f8c4db156fd03075f49876957dca4711306d39c9"}, + {file = "numpy-1.25.2-cp310-cp310-win32.whl", hash = "sha256:7dc869c0c75988e1c693d0e2d5b26034644399dd929bc049db55395b1379e044"}, + {file = "numpy-1.25.2-cp310-cp310-win_amd64.whl", hash = "sha256:834b386f2b8210dca38c71a6e0f4fd6922f7d3fcff935dbe3a570945acb1b545"}, + {file = "numpy-1.25.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c5462d19336db4560041517dbb7759c21d181a67cb01b36ca109b2ae37d32418"}, + {file = "numpy-1.25.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c5652ea24d33585ea39eb6a6a15dac87a1206a692719ff45d53c5282e66d4a8f"}, + {file = "numpy-1.25.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d60fbae8e0019865fc4784745814cff1c421df5afee233db6d88ab4f14655a2"}, + {file = "numpy-1.25.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60e7f0f7f6d0eee8364b9a6304c2845b9c491ac706048c7e8cf47b83123b8dbf"}, + {file = "numpy-1.25.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bb33d5a1cf360304754913a350edda36d5b8c5331a8237268c48f91253c3a364"}, + {file = "numpy-1.25.2-cp311-cp311-win32.whl", hash = "sha256:5883c06bb92f2e6c8181df7b39971a5fb436288db58b5a1c3967702d4278691d"}, + {file = "numpy-1.25.2-cp311-cp311-win_amd64.whl", hash = "sha256:5c97325a0ba6f9d041feb9390924614b60b99209a71a69c876f71052521d42a4"}, + {file = "numpy-1.25.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b79e513d7aac42ae918db3ad1341a015488530d0bb2a6abcbdd10a3a829ccfd3"}, + {file = "numpy-1.25.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:eb942bfb6f84df5ce05dbf4b46673ffed0d3da59f13635ea9b926af3deb76926"}, + {file = "numpy-1.25.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e0746410e73384e70d286f93abf2520035250aad8c5714240b0492a7302fdca"}, + {file = "numpy-1.25.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7806500e4f5bdd04095e849265e55de20d8cc4b661b038957354327f6d9b295"}, + {file = "numpy-1.25.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8b77775f4b7df768967a7c8b3567e309f617dd5e99aeb886fa14dc1a0791141f"}, + {file = "numpy-1.25.2-cp39-cp39-win32.whl", hash = "sha256:2792d23d62ec51e50ce4d4b7d73de8f67a2fd3ea710dcbc8563a51a03fb07b01"}, + {file = "numpy-1.25.2-cp39-cp39-win_amd64.whl", hash = "sha256:76b4115d42a7dfc5d485d358728cdd8719be33cc5ec6ec08632a5d6fca2ed380"}, + {file = "numpy-1.25.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1a1329e26f46230bf77b02cc19e900db9b52f398d6722ca853349a782d4cff55"}, + {file = "numpy-1.25.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c3abc71e8b6edba80a01a52e66d83c5d14433cbcd26a40c329ec7ed09f37901"}, + {file = "numpy-1.25.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1b9735c27cea5d995496f46a8b1cd7b408b3f34b6d50459d9ac8fe3a20cc17bf"}, + {file = "numpy-1.25.2.tar.gz", hash = "sha256:fd608e19c8d7c55021dffd43bfe5492fab8cc105cc8986f813f8c3c048b38760"}, ] [[package]] name = "openpyxl" -version = "3.0.10" +version = "3.1.2" description = "A Python library to read/write Excel 2010 xlsx/xlsm files" optional = false python-versions = ">=3.6" files = [ - {file = "openpyxl-3.0.10-py2.py3-none-any.whl", hash = "sha256:0ab6d25d01799f97a9464630abacbb34aafecdcaa0ef3cba6d6b3499867d0355"}, - {file = "openpyxl-3.0.10.tar.gz", hash = "sha256:e47805627aebcf860edb4edf7987b1309c1b3632f3750538ed962bbcc3bd7449"}, + {file = "openpyxl-3.1.2-py2.py3-none-any.whl", hash = "sha256:f91456ead12ab3c6c2e9491cf33ba6d08357d802192379bb482f1033ade496f5"}, + {file = "openpyxl-3.1.2.tar.gz", hash = "sha256:a6f5977418eff3b2d5500d54d9db50c8277a368436f4e4f8ddb1be3422870184"}, ] [package.dependencies] @@ -1223,116 +1348,122 @@ et-xmlfile = "*" [[package]] name = "orjson" -version = "3.8.11" +version = "3.9.5" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" optional = false -python-versions = ">= 3.7" -files = [ - {file = "orjson-3.8.11-cp310-cp310-macosx_11_0_x86_64.macosx_11_0_arm64.macosx_11_0_universal2.whl", hash = "sha256:9fa900bdd84b4576c8dd6f3e2a00b35797f29283af328c6e3d70addfa4c2d599"}, - {file = "orjson-3.8.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1103e597c16f82c241e1b02beadc9c91cecd93e60433ca73cb6464dcc235f37c"}, - {file = "orjson-3.8.11-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d70b6db9d4e1e6057829cd7fe119c217cebaf989f88d14b2445fa69fc568d03e"}, - {file = "orjson-3.8.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3afccf7f8684dca7f017837a315de0a1ab5c095de22a4eed206d079f9325ed72"}, - {file = "orjson-3.8.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1fedcc428416e23a6c9de62a000c22ae33bbe0108302ad5d5935e29ea739bf37"}, - {file = "orjson-3.8.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf48ed8d4b6ab9f23b7ee642462369d7133412d72824bad89f9bf4311c06c6a1"}, - {file = "orjson-3.8.11-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:3c55065bc2075a5ea6ffb30462d84fd3aa5bbb7ae600855c325ee5753feec715"}, - {file = "orjson-3.8.11-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:08729e339ff3146e6de56c1166f014c3d2ec3e79ffb76d6c55d52cc892e5e477"}, - {file = "orjson-3.8.11-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:358e515b8b19a275b259f5ee1e0efa2859b1d976b5ed5d016ac59f9e6c8788a3"}, - {file = "orjson-3.8.11-cp310-none-win_amd64.whl", hash = "sha256:62eb8bdcf6f4cdbe12743e88ad98696277a75f91a35e8fb93a7ea2b9f4a7000c"}, - {file = "orjson-3.8.11-cp311-cp311-macosx_11_0_x86_64.macosx_11_0_arm64.macosx_11_0_universal2.whl", hash = "sha256:982ab319b7a5ece4199caf2a2b3a28e62a8e289cb6418548ef98bced7e2a6cfe"}, - {file = "orjson-3.8.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e14903bfeb591a9117b7d40d81e3ebca9700b4e77bd829d6f22ea57941bb0ebf"}, - {file = "orjson-3.8.11-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:58c068f93d701f9466f667bf3b5cb4e4946aee940df2b07ca5101f1cf1b60ce4"}, - {file = "orjson-3.8.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9486963d2e65482c565dacb366adb36d22aa22acf7274b61490244c3d87fa631"}, - {file = "orjson-3.8.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c3b5405edc3a5f9e34516ee1a729f6c46aecf6de960ae07a7b3e95ebdd0e1d9"}, - {file = "orjson-3.8.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b65424ceee82b94e3613233b67ef110dc58f9d83b0076ec47a506289552a861"}, - {file = "orjson-3.8.11-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:173b8f8c750590f432757292cfb197582e5c14347b913b4017561d47af0e759b"}, - {file = "orjson-3.8.11-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:37f38c8194ce086e6a9816b4b8dde5e7f383feeed92feec0385d99baf64f9b6e"}, - {file = "orjson-3.8.11-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:553fdaf9f4b5060a0dcc517ae0c511c289c184a83d6719d03c5602ed0eef0390"}, - {file = "orjson-3.8.11-cp311-none-win_amd64.whl", hash = "sha256:12f647d4da0aab1997e25bed4fa2b76782b5b9d2d1bf3066b5f0a57d34d833c4"}, - {file = "orjson-3.8.11-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:71a656f1c62e84c69060093e20cedff6a92e472d53ff5b8b9026b1b298542a68"}, - {file = "orjson-3.8.11-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:176d742f53434541e50a5e659694073aa51dcbd8f29a1708a4fa1a320193c615"}, - {file = "orjson-3.8.11-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b369019e597b59c4b97e9f925a3b725321fa1481c129d76c74c6ea3823f5d1e8"}, - {file = "orjson-3.8.11-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0a53b3c02a38aadc5302661c2ca18645093971488992df77ce14fef16f598b2e"}, - {file = "orjson-3.8.11-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6d7b050135669d2335e40120215ad4120e29958c139f8bab68ce06a1cb1a1b2c"}, - {file = "orjson-3.8.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66f0c9e4e8f6641497a7dc50591af3704b11468e9fc90cfb5874f28b0a61edb5"}, - {file = "orjson-3.8.11-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:235926b38ed9b76ab2bca99ff26ece79c1c46bc10079b06e660b087aecffbe69"}, - {file = "orjson-3.8.11-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c2d3e6b65458ed71b6797f321d6e8bfeeadee9d3d31cac47806a608ea745edd7"}, - {file = "orjson-3.8.11-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4118dcd2b5a27a22af5ad92414073f25d93bca1868f1f580056003c84841062f"}, - {file = "orjson-3.8.11-cp37-none-win_amd64.whl", hash = "sha256:b68a07794834b7bd53ae2a8b4fe4bf010734cae3f0917d434c83b97acf8e5bce"}, - {file = "orjson-3.8.11-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:98befa717efaab7ddb847ebe47d473f6bd6f0cb53e98e6c3d487c7c58ba2e174"}, - {file = "orjson-3.8.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f9415b86ef154bf247fa78a6918aac50089c296e26fb6cf15bc9d7e6402a1f8"}, - {file = "orjson-3.8.11-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f7aeefac55848aeb29f20b91fa55f9e488f446201bb1bb31dc17480d113d8955"}, - {file = "orjson-3.8.11-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d47f97b99beb9bcac6e288a76b559543a61e0187443d8089204b757726b1d000"}, - {file = "orjson-3.8.11-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d7d5aecccfaf2052cd07ed5bec8efba9ddfea055682fcd346047b1a3e9da3034"}, - {file = "orjson-3.8.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:04b60dfc1251742e79bb075d7a7c4e37078b932a02e6f005c45761bd90c69189"}, - {file = "orjson-3.8.11-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:ef52f1d5a2f89ef9049781c90ea35d5edf74374ed6ed515c286a706d1b290267"}, - {file = "orjson-3.8.11-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7c7b4fae3b8fc69c8e76f1c0694f3decfe8a57f87e7ac7779ebb59cd71135438"}, - {file = "orjson-3.8.11-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f4e4a1001933166fd1c257b920b241b35322bef99ed7329338bf266ac053abe7"}, - {file = "orjson-3.8.11-cp38-none-win_amd64.whl", hash = "sha256:5ff10789cbc08a9fd94507c907ba55b9315e99f20345ff8ef34fac432dacd948"}, - {file = "orjson-3.8.11-cp39-cp39-macosx_11_0_x86_64.macosx_11_0_arm64.macosx_11_0_universal2.whl", hash = "sha256:c67ac094a4dde914297543af19f22532d7124f3a35245580d8b756c4ff2f5884"}, - {file = "orjson-3.8.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdf201e77d3fac9d8d6f68d872ef45dccfe46f30b268bb88b6c5af5065b433aa"}, - {file = "orjson-3.8.11-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3485c458670c0edb79ca149fe201f199dd9ccfe7ca3acbdef617e3c683e7b97f"}, - {file = "orjson-3.8.11-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e97fdbb779a3b8f5d9fc7dfddef5325f81ee45897eb7cb4638d5d9734d42514"}, - {file = "orjson-3.8.11-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2fc050f8e7f2e4061c8c9968ad0be745b11b03913b77ffa8ceca65914696886c"}, - {file = "orjson-3.8.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2ef933da50b31c112b252be03d1ef59e0d0552c1a08e48295bd529ce42aaab8"}, - {file = "orjson-3.8.11-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:714c3e2be6ed7e4ff6e887926d6e171bfd94fdee76d7d3bfa74ee19237a2d49d"}, - {file = "orjson-3.8.11-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7e4ded77ac7432a155d1d27a83bcadf722750aea3b9e6c4d47f2a92054ab71cb"}, - {file = "orjson-3.8.11-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:382f15861a4bf447ab9d07106010e61b217ef6d4245c6cf64af0c12c4c5e2346"}, - {file = "orjson-3.8.11-cp39-none-win_amd64.whl", hash = "sha256:0bc3d1b93a73b46a698c054697eb2d27bdedbc5ea0d11ec5f1a6bfbec36346b5"}, - {file = "orjson-3.8.11.tar.gz", hash = "sha256:882c77126c42dd93bb35288632d69b1e393863a2b752de3e5fe0112833609496"}, +python-versions = ">=3.7" +files = [ + {file = "orjson-3.9.5-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:ad6845912a71adcc65df7c8a7f2155eba2096cf03ad2c061c93857de70d699ad"}, + {file = "orjson-3.9.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e298e0aacfcc14ef4476c3f409e85475031de24e5b23605a465e9bf4b2156273"}, + {file = "orjson-3.9.5-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:83c9939073281ef7dd7c5ca7f54cceccb840b440cec4b8a326bda507ff88a0a6"}, + {file = "orjson-3.9.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e174cc579904a48ee1ea3acb7045e8a6c5d52c17688dfcb00e0e842ec378cabf"}, + {file = "orjson-3.9.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f8d51702f42c785b115401e1d64a27a2ea767ae7cf1fb8edaa09c7cf1571c660"}, + {file = "orjson-3.9.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f13d61c0c7414ddee1ef4d0f303e2222f8cced5a2e26d9774751aecd72324c9e"}, + {file = "orjson-3.9.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d748cc48caf5a91c883d306ab648df1b29e16b488c9316852844dd0fd000d1c2"}, + {file = "orjson-3.9.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bd19bc08fa023e4c2cbf8294ad3f2b8922f4de9ba088dbc71e6b268fdf54591c"}, + {file = "orjson-3.9.5-cp310-none-win32.whl", hash = "sha256:5793a21a21bf34e1767e3d61a778a25feea8476dcc0bdf0ae1bc506dc34561ea"}, + {file = "orjson-3.9.5-cp310-none-win_amd64.whl", hash = "sha256:2bcec0b1024d0031ab3eab7a8cb260c8a4e4a5e35993878a2da639d69cdf6a65"}, + {file = "orjson-3.9.5-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:8547b95ca0e2abd17e1471973e6d676f1d8acedd5f8fb4f739e0612651602d66"}, + {file = "orjson-3.9.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87ce174d6a38d12b3327f76145acbd26f7bc808b2b458f61e94d83cd0ebb4d76"}, + {file = "orjson-3.9.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a960bb1bc9a964d16fcc2d4af5a04ce5e4dfddca84e3060c35720d0a062064fe"}, + {file = "orjson-3.9.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a7aa5573a949760d6161d826d34dc36db6011926f836851fe9ccb55b5a7d8e8"}, + {file = "orjson-3.9.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8b2852afca17d7eea85f8e200d324e38c851c96598ac7b227e4f6c4e59fbd3df"}, + {file = "orjson-3.9.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa185959c082475288da90f996a82e05e0c437216b96f2a8111caeb1d54ef926"}, + {file = "orjson-3.9.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:89c9332695b838438ea4b9a482bce8ffbfddde4df92750522d928fb00b7b8dce"}, + {file = "orjson-3.9.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2493f1351a8f0611bc26e2d3d407efb873032b4f6b8926fed8cfed39210ca4ba"}, + {file = "orjson-3.9.5-cp311-none-win32.whl", hash = "sha256:ffc544e0e24e9ae69301b9a79df87a971fa5d1c20a6b18dca885699709d01be0"}, + {file = "orjson-3.9.5-cp311-none-win_amd64.whl", hash = "sha256:89670fe2732e3c0c54406f77cad1765c4c582f67b915c74fda742286809a0cdc"}, + {file = "orjson-3.9.5-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:15df211469625fa27eced4aa08dc03e35f99c57d45a33855cc35f218ea4071b8"}, + {file = "orjson-3.9.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9f17c59fe6c02bc5f89ad29edb0253d3059fe8ba64806d789af89a45c35269a"}, + {file = "orjson-3.9.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ca6b96659c7690773d8cebb6115c631f4a259a611788463e9c41e74fa53bf33f"}, + {file = "orjson-3.9.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a26fafe966e9195b149950334bdbe9026eca17fe8ffe2d8fa87fdc30ca925d30"}, + {file = "orjson-3.9.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9006b1eb645ecf460da067e2dd17768ccbb8f39b01815a571bfcfab7e8da5e52"}, + {file = "orjson-3.9.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ebfdbf695734b1785e792a1315e41835ddf2a3e907ca0e1c87a53f23006ce01d"}, + {file = "orjson-3.9.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4a3943234342ab37d9ed78fb0a8f81cd4b9532f67bf2ac0d3aa45fa3f0a339f3"}, + {file = "orjson-3.9.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e6762755470b5c82f07b96b934af32e4d77395a11768b964aaa5eb092817bc31"}, + {file = "orjson-3.9.5-cp312-none-win_amd64.whl", hash = "sha256:c74df28749c076fd6e2157190df23d43d42b2c83e09d79b51694ee7315374ad5"}, + {file = "orjson-3.9.5-cp37-cp37m-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:88e18a74d916b74f00d0978d84e365c6bf0e7ab846792efa15756b5fb2f7d49d"}, + {file = "orjson-3.9.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d28514b5b6dfaf69097be70d0cf4f1407ec29d0f93e0b4131bf9cc8fd3f3e374"}, + {file = "orjson-3.9.5-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25b81aca8c7be61e2566246b6a0ca49f8aece70dd3f38c7f5c837f398c4cb142"}, + {file = "orjson-3.9.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:385c1c713b1e47fd92e96cf55fd88650ac6dfa0b997e8aa7ecffd8b5865078b1"}, + {file = "orjson-3.9.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9850c03a8e42fba1a508466e6a0f99472fd2b4a5f30235ea49b2a1b32c04c11"}, + {file = "orjson-3.9.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4449f84bbb13bcef493d8aa669feadfced0f7c5eea2d0d88b5cc21f812183af8"}, + {file = "orjson-3.9.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:86127bf194f3b873135e44ce5dc9212cb152b7e06798d5667a898a00f0519be4"}, + {file = "orjson-3.9.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0abcd039f05ae9ab5b0ff11624d0b9e54376253b7d3217a358d09c3edf1d36f7"}, + {file = "orjson-3.9.5-cp37-none-win32.whl", hash = "sha256:10cc8ad5ff7188efcb4bec196009d61ce525a4e09488e6d5db41218c7fe4f001"}, + {file = "orjson-3.9.5-cp37-none-win_amd64.whl", hash = "sha256:ff27e98532cb87379d1a585837d59b187907228268e7b0a87abe122b2be6968e"}, + {file = "orjson-3.9.5-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:5bfa79916ef5fef75ad1f377e54a167f0de334c1fa4ebb8d0224075f3ec3d8c0"}, + {file = "orjson-3.9.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e87dfa6ac0dae764371ab19b35eaaa46dfcb6ef2545dfca03064f21f5d08239f"}, + {file = "orjson-3.9.5-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:50ced24a7b23058b469ecdb96e36607fc611cbaee38b58e62a55c80d1b3ad4e1"}, + {file = "orjson-3.9.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b1b74ea2a3064e1375da87788897935832e806cc784de3e789fd3c4ab8eb3fa5"}, + {file = "orjson-3.9.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7cb961efe013606913d05609f014ad43edfaced82a576e8b520a5574ce3b2b9"}, + {file = "orjson-3.9.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1225d2d5ee76a786bda02f8c5e15017462f8432bb960de13d7c2619dba6f0275"}, + {file = "orjson-3.9.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f39f4b99199df05c7ecdd006086259ed25886cdbd7b14c8cdb10c7675cfcca7d"}, + {file = "orjson-3.9.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a461dc9fb60cac44f2d3218c36a0c1c01132314839a0e229d7fb1bba69b810d8"}, + {file = "orjson-3.9.5-cp38-none-win32.whl", hash = "sha256:dedf1a6173748202df223aea29de814b5836732a176b33501375c66f6ab7d822"}, + {file = "orjson-3.9.5-cp38-none-win_amd64.whl", hash = "sha256:fa504082f53efcbacb9087cc8676c163237beb6e999d43e72acb4bb6f0db11e6"}, + {file = "orjson-3.9.5-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:6900f0248edc1bec2a2a3095a78a7e3ef4e63f60f8ddc583687eed162eedfd69"}, + {file = "orjson-3.9.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17404333c40047888ac40bd8c4d49752a787e0a946e728a4e5723f111b6e55a5"}, + {file = "orjson-3.9.5-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0eefb7cfdd9c2bc65f19f974a5d1dfecbac711dae91ed635820c6b12da7a3c11"}, + {file = "orjson-3.9.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:68c78b2a3718892dc018adbc62e8bab6ef3c0d811816d21e6973dee0ca30c152"}, + {file = "orjson-3.9.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:591ad7d9e4a9f9b104486ad5d88658c79ba29b66c5557ef9edf8ca877a3f8d11"}, + {file = "orjson-3.9.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6cc2cbf302fbb2d0b2c3c142a663d028873232a434d89ce1b2604ebe5cc93ce8"}, + {file = "orjson-3.9.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b26b5aa5e9ee1bad2795b925b3adb1b1b34122cb977f30d89e0a1b3f24d18450"}, + {file = "orjson-3.9.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ef84724f7d29dcfe3aafb1fc5fc7788dca63e8ae626bb9298022866146091a3e"}, + {file = "orjson-3.9.5-cp39-none-win32.whl", hash = "sha256:664cff27f85939059472afd39acff152fbac9a091b7137092cb651cf5f7747b5"}, + {file = "orjson-3.9.5-cp39-none-win_amd64.whl", hash = "sha256:91dda66755795ac6100e303e206b636568d42ac83c156547634256a2e68de694"}, + {file = "orjson-3.9.5.tar.gz", hash = "sha256:6daf5ee0b3cf530b9978cdbf71024f1c16ed4a67d05f6ec435c6e7fe7a52724c"}, ] [[package]] name = "packaging" -version = "21.3" +version = "23.1" description = "Core utilities for Python packages" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, - {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, ] -[package.dependencies] -pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" - [[package]] name = "pandas" -version = "1.5.1" +version = "1.5.3" description = "Powerful data structures for data analysis, time series, and statistics" optional = false python-versions = ">=3.8" files = [ - {file = "pandas-1.5.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0a78e05ec09731c5b3bd7a9805927ea631fe6f6cb06f0e7c63191a9a778d52b4"}, - {file = "pandas-1.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5b0c970e2215572197b42f1cff58a908d734503ea54b326412c70d4692256391"}, - {file = "pandas-1.5.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f340331a3f411910adfb4bbe46c2ed5872d9e473a783d7f14ecf49bc0869c594"}, - {file = "pandas-1.5.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8c709f4700573deb2036d240d140934df7e852520f4a584b2a8d5443b71f54d"}, - {file = "pandas-1.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32e3d9f65606b3f6e76555bfd1d0b68d94aff0929d82010b791b6254bf5a4b96"}, - {file = "pandas-1.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:a52419d9ba5906db516109660b114faf791136c94c1a636ed6b29cbfff9187ee"}, - {file = "pandas-1.5.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:66a1ad667b56e679e06ba73bb88c7309b3f48a4c279bd3afea29f65a766e9036"}, - {file = "pandas-1.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:36aa1f8f680d7584e9b572c3203b20d22d697c31b71189322f16811d4ecfecd3"}, - {file = "pandas-1.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bcf1a82b770b8f8c1e495b19a20d8296f875a796c4fe6e91da5ef107f18c5ecb"}, - {file = "pandas-1.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c25e5c16ee5c0feb6cf9d982b869eec94a22ddfda9aa2fbed00842cbb697624"}, - {file = "pandas-1.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:932d2d7d3cab44cfa275601c982f30c2d874722ef6396bb539e41e4dc4618ed4"}, - {file = "pandas-1.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:eb7e8cf2cf11a2580088009b43de84cabbf6f5dae94ceb489f28dba01a17cb77"}, - {file = "pandas-1.5.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:cb2a9cf1150302d69bb99861c5cddc9c25aceacb0a4ef5299785d0f5389a3209"}, - {file = "pandas-1.5.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:81f0674fa50b38b6793cd84fae5d67f58f74c2d974d2cb4e476d26eee33343d0"}, - {file = "pandas-1.5.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:17da7035d9e6f9ea9cdc3a513161f8739b8f8489d31dc932bc5a29a27243f93d"}, - {file = "pandas-1.5.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:669c8605dba6c798c1863157aefde959c1796671ffb342b80fcb80a4c0bc4c26"}, - {file = "pandas-1.5.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:683779e5728ac9138406c59a11e09cd98c7d2c12f0a5fc2b9c5eecdbb4a00075"}, - {file = "pandas-1.5.1-cp38-cp38-win32.whl", hash = "sha256:ddf46b940ef815af4e542697eaf071f0531449407a7607dd731bf23d156e20a7"}, - {file = "pandas-1.5.1-cp38-cp38-win_amd64.whl", hash = "sha256:db45b94885000981522fb92349e6b76f5aee0924cc5315881239c7859883117d"}, - {file = "pandas-1.5.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:927e59c694e039c75d7023465d311277a1fc29ed7236b5746e9dddf180393113"}, - {file = "pandas-1.5.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e675f8fe9aa6c418dc8d3aac0087b5294c1a4527f1eacf9fe5ea671685285454"}, - {file = "pandas-1.5.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:04e51b01d5192499390c0015630975f57836cc95c7411415b499b599b05c0c96"}, - {file = "pandas-1.5.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cee0c74e93ed4f9d39007e439debcaadc519d7ea5c0afc3d590a3a7b2edf060"}, - {file = "pandas-1.5.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b156a971bc451c68c9e1f97567c94fd44155f073e3bceb1b0d195fd98ed12048"}, - {file = "pandas-1.5.1-cp39-cp39-win32.whl", hash = "sha256:05c527c64ee02a47a24031c880ee0ded05af0623163494173204c5b72ddce658"}, - {file = "pandas-1.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:6bb391659a747cf4f181a227c3e64b6d197100d53da98dcd766cc158bdd9ec68"}, - {file = "pandas-1.5.1.tar.gz", hash = "sha256:249cec5f2a5b22096440bd85c33106b6102e0672204abd2d5c014106459804ee"}, + {file = "pandas-1.5.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3749077d86e3a2f0ed51367f30bf5b82e131cc0f14260c4d3e499186fccc4406"}, + {file = "pandas-1.5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:972d8a45395f2a2d26733eb8d0f629b2f90bebe8e8eddbb8829b180c09639572"}, + {file = "pandas-1.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:50869a35cbb0f2e0cd5ec04b191e7b12ed688874bd05dd777c19b28cbea90996"}, + {file = "pandas-1.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3ac844a0fe00bfaeb2c9b51ab1424e5c8744f89860b138434a363b1f620f354"}, + {file = "pandas-1.5.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a0a56cef15fd1586726dace5616db75ebcfec9179a3a55e78f72c5639fa2a23"}, + {file = "pandas-1.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:478ff646ca42b20376e4ed3fa2e8d7341e8a63105586efe54fa2508ee087f328"}, + {file = "pandas-1.5.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6973549c01ca91ec96199e940495219c887ea815b2083722821f1d7abfa2b4dc"}, + {file = "pandas-1.5.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c39a8da13cede5adcd3be1182883aea1c925476f4e84b2807a46e2775306305d"}, + {file = "pandas-1.5.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f76d097d12c82a535fda9dfe5e8dd4127952b45fea9b0276cb30cca5ea313fbc"}, + {file = "pandas-1.5.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e474390e60ed609cec869b0da796ad94f420bb057d86784191eefc62b65819ae"}, + {file = "pandas-1.5.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f2b952406a1588ad4cad5b3f55f520e82e902388a6d5a4a91baa8d38d23c7f6"}, + {file = "pandas-1.5.3-cp311-cp311-win_amd64.whl", hash = "sha256:bc4c368f42b551bf72fac35c5128963a171b40dce866fb066540eeaf46faa003"}, + {file = "pandas-1.5.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:14e45300521902689a81f3f41386dc86f19b8ba8dd5ac5a3c7010ef8d2932813"}, + {file = "pandas-1.5.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9842b6f4b8479e41968eced654487258ed81df7d1c9b7b870ceea24ed9459b31"}, + {file = "pandas-1.5.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:26d9c71772c7afb9d5046e6e9cf42d83dd147b5cf5bcb9d97252077118543792"}, + {file = "pandas-1.5.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fbcb19d6fceb9e946b3e23258757c7b225ba450990d9ed63ccceeb8cae609f7"}, + {file = "pandas-1.5.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:565fa34a5434d38e9d250af3c12ff931abaf88050551d9fbcdfafca50d62babf"}, + {file = "pandas-1.5.3-cp38-cp38-win32.whl", hash = "sha256:87bd9c03da1ac870a6d2c8902a0e1fd4267ca00f13bc494c9e5a9020920e1d51"}, + {file = "pandas-1.5.3-cp38-cp38-win_amd64.whl", hash = "sha256:41179ce559943d83a9b4bbacb736b04c928b095b5f25dd2b7389eda08f46f373"}, + {file = "pandas-1.5.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c74a62747864ed568f5a82a49a23a8d7fe171d0c69038b38cedf0976831296fa"}, + {file = "pandas-1.5.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c4c00e0b0597c8e4f59e8d461f797e5d70b4d025880516a8261b2817c47759ee"}, + {file = "pandas-1.5.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a50d9a4336a9621cab7b8eb3fb11adb82de58f9b91d84c2cd526576b881a0c5a"}, + {file = "pandas-1.5.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd05f7783b3274aa206a1af06f0ceed3f9b412cf665b7247eacd83be41cf7bf0"}, + {file = "pandas-1.5.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f69c4029613de47816b1bb30ff5ac778686688751a5e9c99ad8c7031f6508e5"}, + {file = "pandas-1.5.3-cp39-cp39-win32.whl", hash = "sha256:7cec0bee9f294e5de5bbfc14d0573f65526071029d036b753ee6507d2a21480a"}, + {file = "pandas-1.5.3-cp39-cp39-win_amd64.whl", hash = "sha256:dfd681c5dc216037e0b0a2c821f5ed99ba9f03ebcf119c7dac0e9a7b960b9ec9"}, + {file = "pandas-1.5.3.tar.gz", hash = "sha256:74a3fd7e5a7ec052f183273dc7b0acd3a863edf7520f5d3a1765c04ffdb3b0b1"}, ] [package.dependencies] -numpy = {version = ">=1.21.0", markers = "python_version >= \"3.10\""} +numpy = {version = ">=1.23.2", markers = "python_version >= \"3.11\""} python-dateutil = ">=2.8.1" pytz = ">=2020.1" @@ -1373,13 +1504,13 @@ totp = ["cryptography"] [[package]] name = "pathspec" -version = "0.10.2" +version = "0.11.2" description = "Utility library for gitignore style pattern matching of file paths." optional = false python-versions = ">=3.7" files = [ - {file = "pathspec-0.10.2-py3-none-any.whl", hash = "sha256:88c2606f2c1e818b978540f73ecc908e13999c6c3a383daf3705652ae79807a5"}, - {file = "pathspec-0.10.2.tar.gz", hash = "sha256:8f6bf73e5758fd365ef5d58ce09ac7c27d2833a8d7da51712eac6e27e35141b0"}, + {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, + {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, ] [[package]] @@ -1407,30 +1538,99 @@ files = [ {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, ] +[[package]] +name = "pillow" +version = "10.0.0" +description = "Python Imaging Library (Fork)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "Pillow-10.0.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1f62406a884ae75fb2f818694469519fb685cc7eaff05d3451a9ebe55c646891"}, + {file = "Pillow-10.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d5db32e2a6ccbb3d34d87c87b432959e0db29755727afb37290e10f6e8e62614"}, + {file = "Pillow-10.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edf4392b77bdc81f36e92d3a07a5cd072f90253197f4a52a55a8cec48a12483b"}, + {file = "Pillow-10.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:520f2a520dc040512699f20fa1c363eed506e94248d71f85412b625026f6142c"}, + {file = "Pillow-10.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:8c11160913e3dd06c8ffdb5f233a4f254cb449f4dfc0f8f4549eda9e542c93d1"}, + {file = "Pillow-10.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a74ba0c356aaa3bb8e3eb79606a87669e7ec6444be352870623025d75a14a2bf"}, + {file = "Pillow-10.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5d0dae4cfd56969d23d94dc8e89fb6a217be461c69090768227beb8ed28c0a3"}, + {file = "Pillow-10.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22c10cc517668d44b211717fd9775799ccec4124b9a7f7b3635fc5386e584992"}, + {file = "Pillow-10.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:dffe31a7f47b603318c609f378ebcd57f1554a3a6a8effbc59c3c69f804296de"}, + {file = "Pillow-10.0.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:9fb218c8a12e51d7ead2a7c9e101a04982237d4855716af2e9499306728fb485"}, + {file = "Pillow-10.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d35e3c8d9b1268cbf5d3670285feb3528f6680420eafe35cccc686b73c1e330f"}, + {file = "Pillow-10.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ed64f9ca2f0a95411e88a4efbd7a29e5ce2cea36072c53dd9d26d9c76f753b3"}, + {file = "Pillow-10.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b6eb5502f45a60a3f411c63187db83a3d3107887ad0d036c13ce836f8a36f1d"}, + {file = "Pillow-10.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:c1fbe7621c167ecaa38ad29643d77a9ce7311583761abf7836e1510c580bf3dd"}, + {file = "Pillow-10.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:cd25d2a9d2b36fcb318882481367956d2cf91329f6892fe5d385c346c0649629"}, + {file = "Pillow-10.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3b08d4cc24f471b2c8ca24ec060abf4bebc6b144cb89cba638c720546b1cf538"}, + {file = "Pillow-10.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d737a602fbd82afd892ca746392401b634e278cb65d55c4b7a8f48e9ef8d008d"}, + {file = "Pillow-10.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:3a82c40d706d9aa9734289740ce26460a11aeec2d9c79b7af87bb35f0073c12f"}, + {file = "Pillow-10.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:bc2ec7c7b5d66b8ec9ce9f720dbb5fa4bace0f545acd34870eff4a369b44bf37"}, + {file = "Pillow-10.0.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:d80cf684b541685fccdd84c485b31ce73fc5c9b5d7523bf1394ce134a60c6883"}, + {file = "Pillow-10.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76de421f9c326da8f43d690110f0e79fe3ad1e54be811545d7d91898b4c8493e"}, + {file = "Pillow-10.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81ff539a12457809666fef6624684c008e00ff6bf455b4b89fd00a140eecd640"}, + {file = "Pillow-10.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce543ed15570eedbb85df19b0a1a7314a9c8141a36ce089c0a894adbfccb4568"}, + {file = "Pillow-10.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:685ac03cc4ed5ebc15ad5c23bc555d68a87777586d970c2c3e216619a5476223"}, + {file = "Pillow-10.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d72e2ecc68a942e8cf9739619b7f408cc7b272b279b56b2c83c6123fcfa5cdff"}, + {file = "Pillow-10.0.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d50b6aec14bc737742ca96e85d6d0a5f9bfbded018264b3b70ff9d8c33485551"}, + {file = "Pillow-10.0.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:00e65f5e822decd501e374b0650146063fbb30a7264b4d2744bdd7b913e0cab5"}, + {file = "Pillow-10.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:f31f9fdbfecb042d046f9d91270a0ba28368a723302786c0009ee9b9f1f60199"}, + {file = "Pillow-10.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:1ce91b6ec08d866b14413d3f0bbdea7e24dfdc8e59f562bb77bc3fe60b6144ca"}, + {file = "Pillow-10.0.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:349930d6e9c685c089284b013478d6f76e3a534e36ddfa912cde493f235372f3"}, + {file = "Pillow-10.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3a684105f7c32488f7153905a4e3015a3b6c7182e106fe3c37fbb5ef3e6994c3"}, + {file = "Pillow-10.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4f69b3700201b80bb82c3a97d5e9254084f6dd5fb5b16fc1a7b974260f89f43"}, + {file = "Pillow-10.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f07ea8d2f827d7d2a49ecf1639ec02d75ffd1b88dcc5b3a61bbb37a8759ad8d"}, + {file = "Pillow-10.0.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:040586f7d37b34547153fa383f7f9aed68b738992380ac911447bb78f2abe530"}, + {file = "Pillow-10.0.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:f88a0b92277de8e3ca715a0d79d68dc82807457dae3ab8699c758f07c20b3c51"}, + {file = "Pillow-10.0.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c7cf14a27b0d6adfaebb3ae4153f1e516df54e47e42dcc073d7b3d76111a8d86"}, + {file = "Pillow-10.0.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3400aae60685b06bb96f99a21e1ada7bc7a413d5f49bce739828ecd9391bb8f7"}, + {file = "Pillow-10.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:dbc02381779d412145331789b40cc7b11fdf449e5d94f6bc0b080db0a56ea3f0"}, + {file = "Pillow-10.0.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:9211e7ad69d7c9401cfc0e23d49b69ca65ddd898976d660a2fa5904e3d7a9baa"}, + {file = "Pillow-10.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:faaf07ea35355b01a35cb442dd950d8f1bb5b040a7787791a535de13db15ed90"}, + {file = "Pillow-10.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9f72a021fbb792ce98306ffb0c348b3c9cb967dce0f12a49aa4c3d3fdefa967"}, + {file = "Pillow-10.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f7c16705f44e0504a3a2a14197c1f0b32a95731d251777dcb060aa83022cb2d"}, + {file = "Pillow-10.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:76edb0a1fa2b4745fb0c99fb9fb98f8b180a1bbceb8be49b087e0b21867e77d3"}, + {file = "Pillow-10.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:368ab3dfb5f49e312231b6f27b8820c823652b7cd29cfbd34090565a015e99ba"}, + {file = "Pillow-10.0.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:608bfdee0d57cf297d32bcbb3c728dc1da0907519d1784962c5f0c68bb93e5a3"}, + {file = "Pillow-10.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5c6e3df6bdd396749bafd45314871b3d0af81ff935b2d188385e970052091017"}, + {file = "Pillow-10.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:7be600823e4c8631b74e4a0d38384c73f680e6105a7d3c6824fcf226c178c7e6"}, + {file = "Pillow-10.0.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:92be919bbc9f7d09f7ae343c38f5bb21c973d2576c1d45600fce4b74bafa7ac0"}, + {file = "Pillow-10.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8182b523b2289f7c415f589118228d30ac8c355baa2f3194ced084dac2dbba"}, + {file = "Pillow-10.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:38250a349b6b390ee6047a62c086d3817ac69022c127f8a5dc058c31ccef17f3"}, + {file = "Pillow-10.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:88af2003543cc40c80f6fca01411892ec52b11021b3dc22ec3bc9d5afd1c5334"}, + {file = "Pillow-10.0.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c189af0545965fa8d3b9613cfdb0cd37f9d71349e0f7750e1fd704648d475ed2"}, + {file = "Pillow-10.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce7b031a6fc11365970e6a5686d7ba8c63e4c1cf1ea143811acbb524295eabed"}, + {file = "Pillow-10.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:db24668940f82321e746773a4bc617bfac06ec831e5c88b643f91f122a785684"}, + {file = "Pillow-10.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:efe8c0681042536e0d06c11f48cebe759707c9e9abf880ee213541c5b46c5bf3"}, + {file = "Pillow-10.0.0.tar.gz", hash = "sha256:9c82b5b3e043c7af0d95792d0d20ccf68f61a1fec6b3530e718b688422727396"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] + [[package]] name = "platformdirs" -version = "2.5.4" +version = "3.10.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." optional = false python-versions = ">=3.7" files = [ - {file = "platformdirs-2.5.4-py3-none-any.whl", hash = "sha256:af0276409f9a02373d540bf8480021a048711d572745aef4b7842dad245eba10"}, - {file = "platformdirs-2.5.4.tar.gz", hash = "sha256:1006647646d80f16130f052404c6b901e80ee4ed6bef6792e1f238a8969106f7"}, + {file = "platformdirs-3.10.0-py3-none-any.whl", hash = "sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d"}, + {file = "platformdirs-3.10.0.tar.gz", hash = "sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d"}, ] [package.extras] -docs = ["furo (>=2022.9.29)", "proselint (>=0.13)", "sphinx (>=5.3)", "sphinx-autodoc-typehints (>=1.19.4)"] -test = ["appdirs (==1.4.4)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] [[package]] name = "pluggy" -version = "1.0.0" +version = "1.2.0" description = "plugin and hook calling mechanisms for python" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, - {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, + {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, + {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, ] [package.extras] @@ -1439,13 +1639,13 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "prompt-toolkit" -version = "3.0.33" +version = "3.0.39" description = "Library for building powerful interactive command lines in Python" optional = false -python-versions = ">=3.6.2" +python-versions = ">=3.7.0" files = [ - {file = "prompt_toolkit-3.0.33-py3-none-any.whl", hash = "sha256:ced598b222f6f4029c0800cefaa6a17373fb580cd093223003475ce32805c35b"}, - {file = "prompt_toolkit-3.0.33.tar.gz", hash = "sha256:535c29c31216c77302877d5120aef6c94ff573748a5b5ca5b1b1f76f5e700c73"}, + {file = "prompt_toolkit-3.0.39-py3-none-any.whl", hash = "sha256:9dffbe1d8acf91e3de75f3b544e4842382fc06c6babe903ac9acb74dc6e08d88"}, + {file = "prompt_toolkit-3.0.39.tar.gz", hash = "sha256:04505ade687dc26dc4284b1ad19a83be2f2afe83e7a828ace0c72f3a1df72aac"}, ] [package.dependencies] @@ -1453,25 +1653,25 @@ wcwidth = "*" [[package]] name = "psutil" -version = "5.9.4" +version = "5.9.5" description = "Cross-platform lib for process and system monitoring in Python." optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ - {file = "psutil-5.9.4-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:c1ca331af862803a42677c120aff8a814a804e09832f166f226bfd22b56feee8"}, - {file = "psutil-5.9.4-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:68908971daf802203f3d37e78d3f8831b6d1014864d7a85937941bb35f09aefe"}, - {file = "psutil-5.9.4-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:3ff89f9b835100a825b14c2808a106b6fdcc4b15483141482a12c725e7f78549"}, - {file = "psutil-5.9.4-cp27-cp27m-win32.whl", hash = "sha256:852dd5d9f8a47169fe62fd4a971aa07859476c2ba22c2254d4a1baa4e10b95ad"}, - {file = "psutil-5.9.4-cp27-cp27m-win_amd64.whl", hash = "sha256:9120cd39dca5c5e1c54b59a41d205023d436799b1c8c4d3ff71af18535728e94"}, - {file = "psutil-5.9.4-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:6b92c532979bafc2df23ddc785ed116fced1f492ad90a6830cf24f4d1ea27d24"}, - {file = "psutil-5.9.4-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:efeae04f9516907be44904cc7ce08defb6b665128992a56957abc9b61dca94b7"}, - {file = "psutil-5.9.4-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:54d5b184728298f2ca8567bf83c422b706200bcbbfafdc06718264f9393cfeb7"}, - {file = "psutil-5.9.4-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:16653106f3b59386ffe10e0bad3bb6299e169d5327d3f187614b1cb8f24cf2e1"}, - {file = "psutil-5.9.4-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54c0d3d8e0078b7666984e11b12b88af2db11d11249a8ac8920dd5ef68a66e08"}, - {file = "psutil-5.9.4-cp36-abi3-win32.whl", hash = "sha256:149555f59a69b33f056ba1c4eb22bb7bf24332ce631c44a319cec09f876aaeff"}, - {file = "psutil-5.9.4-cp36-abi3-win_amd64.whl", hash = "sha256:fd8522436a6ada7b4aad6638662966de0d61d241cb821239b2ae7013d41a43d4"}, - {file = "psutil-5.9.4-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:6001c809253a29599bc0dfd5179d9f8a5779f9dffea1da0f13c53ee568115e1e"}, - {file = "psutil-5.9.4.tar.gz", hash = "sha256:3d7f9739eb435d4b1338944abe23f49584bde5395f27487d2ee25ad9a8774a62"}, + {file = "psutil-5.9.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:be8929ce4313f9f8146caad4272f6abb8bf99fc6cf59344a3167ecd74f4f203f"}, + {file = "psutil-5.9.5-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ab8ed1a1d77c95453db1ae00a3f9c50227ebd955437bcf2a574ba8adbf6a74d5"}, + {file = "psutil-5.9.5-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:4aef137f3345082a3d3232187aeb4ac4ef959ba3d7c10c33dd73763fbc063da4"}, + {file = "psutil-5.9.5-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ea8518d152174e1249c4f2a1c89e3e6065941df2fa13a1ab45327716a23c2b48"}, + {file = "psutil-5.9.5-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:acf2aef9391710afded549ff602b5887d7a2349831ae4c26be7c807c0a39fac4"}, + {file = "psutil-5.9.5-cp27-none-win32.whl", hash = "sha256:5b9b8cb93f507e8dbaf22af6a2fd0ccbe8244bf30b1baad6b3954e935157ae3f"}, + {file = "psutil-5.9.5-cp27-none-win_amd64.whl", hash = "sha256:8c5f7c5a052d1d567db4ddd231a9d27a74e8e4a9c3f44b1032762bd7b9fdcd42"}, + {file = "psutil-5.9.5-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:3c6f686f4225553615612f6d9bc21f1c0e305f75d7d8454f9b46e901778e7217"}, + {file = "psutil-5.9.5-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7a7dd9997128a0d928ed4fb2c2d57e5102bb6089027939f3b722f3a210f9a8da"}, + {file = "psutil-5.9.5-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89518112647f1276b03ca97b65cc7f64ca587b1eb0278383017c2a0dcc26cbe4"}, + {file = "psutil-5.9.5-cp36-abi3-win32.whl", hash = "sha256:104a5cc0e31baa2bcf67900be36acde157756b9c44017b86b2c049f11957887d"}, + {file = "psutil-5.9.5-cp36-abi3-win_amd64.whl", hash = "sha256:b258c0c1c9d145a1d5ceffab1134441c4c5113b2417fafff7315a917a026c3c9"}, + {file = "psutil-5.9.5-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:c607bb3b57dc779d55e1554846352b4e358c10fff3abf3514a7a6601beebdb30"}, + {file = "psutil-5.9.5.tar.gz", hash = "sha256:5410638e4df39c54d957fc51ce03048acd8e6d60abc0f5107af51e5fb566eb3c"}, ] [package.extras] @@ -1479,82 +1679,71 @@ test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] [[package]] name = "psycopg2-binary" -version = "2.9.5" +version = "2.9.7" description = "psycopg2 - Python-PostgreSQL Database Adapter" optional = false python-versions = ">=3.6" files = [ - {file = "psycopg2-binary-2.9.5.tar.gz", hash = "sha256:33e632d0885b95a8b97165899006c40e9ecdc634a529dca7b991eb7de4ece41c"}, - {file = "psycopg2_binary-2.9.5-cp310-cp310-macosx_10_15_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:0775d6252ccb22b15da3b5d7adbbf8cfe284916b14b6dc0ff503a23edb01ee85"}, - {file = "psycopg2_binary-2.9.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2ec46ed947801652c9643e0b1dc334cfb2781232e375ba97312c2fc256597632"}, - {file = "psycopg2_binary-2.9.5-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3520d7af1ebc838cc6084a3281145d5cd5bdd43fdef139e6db5af01b92596cb7"}, - {file = "psycopg2_binary-2.9.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5cbc554ba47ecca8cd3396ddaca85e1ecfe3e48dd57dc5e415e59551affe568e"}, - {file = "psycopg2_binary-2.9.5-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:5d28ecdf191db558d0c07d0f16524ee9d67896edf2b7990eea800abeb23ebd61"}, - {file = "psycopg2_binary-2.9.5-cp310-cp310-manylinux_2_24_ppc64le.whl", hash = "sha256:b9c33d4aef08dfecbd1736ceab8b7b3c4358bf10a0121483e5cd60d3d308cc64"}, - {file = "psycopg2_binary-2.9.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:05b3d479425e047c848b9782cd7aac9c6727ce23181eb9647baf64ffdfc3da41"}, - {file = "psycopg2_binary-2.9.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:1e491e6489a6cb1d079df8eaa15957c277fdedb102b6a68cfbf40c4994412fd0"}, - {file = "psycopg2_binary-2.9.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:9e32cedc389bcb76d9f24ea8a012b3cb8385ee362ea437e1d012ffaed106c17d"}, - {file = "psycopg2_binary-2.9.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:46850a640df62ae940e34a163f72e26aca1f88e2da79148e1862faaac985c302"}, - {file = "psycopg2_binary-2.9.5-cp310-cp310-win32.whl", hash = "sha256:3d790f84201c3698d1bfb404c917f36e40531577a6dda02e45ba29b64d539867"}, - {file = "psycopg2_binary-2.9.5-cp310-cp310-win_amd64.whl", hash = "sha256:1764546ffeaed4f9428707be61d68972eb5ede81239b46a45843e0071104d0dd"}, - {file = "psycopg2_binary-2.9.5-cp311-cp311-macosx_10_9_universal2.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:426c2ae999135d64e6a18849a7d1ad0e1bd007277e4a8f4752eaa40a96b550ff"}, - {file = "psycopg2_binary-2.9.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7cf1d44e710ca3a9ce952bda2855830fe9f9017ed6259e01fcd71ea6287565f5"}, - {file = "psycopg2_binary-2.9.5-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:024030b13bdcbd53d8a93891a2cf07719715724fc9fee40243f3bd78b4264b8f"}, - {file = "psycopg2_binary-2.9.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bcda1c84a1c533c528356da5490d464a139b6e84eb77cc0b432e38c5c6dd7882"}, - {file = "psycopg2_binary-2.9.5-cp311-cp311-manylinux_2_24_aarch64.whl", hash = "sha256:2ef892cabdccefe577088a79580301f09f2a713eb239f4f9f62b2b29cafb0577"}, - {file = "psycopg2_binary-2.9.5-cp311-cp311-manylinux_2_24_ppc64le.whl", hash = "sha256:af0516e1711995cb08dc19bbd05bec7dbdebf4185f68870595156718d237df3e"}, - {file = "psycopg2_binary-2.9.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e72c91bda9880f097c8aa3601a2c0de6c708763ba8128006151f496ca9065935"}, - {file = "psycopg2_binary-2.9.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e67b3c26e9b6d37b370c83aa790bbc121775c57bfb096c2e77eacca25fd0233b"}, - {file = "psycopg2_binary-2.9.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5fc447058d083b8c6ac076fc26b446d44f0145308465d745fba93a28c14c9e32"}, - {file = "psycopg2_binary-2.9.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d892bfa1d023c3781a3cab8dd5af76b626c483484d782e8bd047c180db590e4c"}, - {file = "psycopg2_binary-2.9.5-cp311-cp311-win32.whl", hash = "sha256:2abccab84d057723d2ca8f99ff7b619285d40da6814d50366f61f0fc385c3903"}, - {file = "psycopg2_binary-2.9.5-cp311-cp311-win_amd64.whl", hash = "sha256:bef7e3f9dc6f0c13afdd671008534be5744e0e682fb851584c8c3a025ec09720"}, - {file = "psycopg2_binary-2.9.5-cp36-cp36m-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:6e63814ec71db9bdb42905c925639f319c80e7909fb76c3b84edc79dadef8d60"}, - {file = "psycopg2_binary-2.9.5-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:212757ffcecb3e1a5338d4e6761bf9c04f750e7d027117e74aa3cd8a75bb6fbd"}, - {file = "psycopg2_binary-2.9.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f8a9bcab7b6db2e3dbf65b214dfc795b4c6b3bb3af922901b6a67f7cb47d5f8"}, - {file = "psycopg2_binary-2.9.5-cp36-cp36m-manylinux_2_24_aarch64.whl", hash = "sha256:56b2957a145f816726b109ee3d4e6822c23f919a7d91af5a94593723ed667835"}, - {file = "psycopg2_binary-2.9.5-cp36-cp36m-manylinux_2_24_ppc64le.whl", hash = "sha256:f95b8aca2703d6a30249f83f4fe6a9abf2e627aa892a5caaab2267d56be7ab69"}, - {file = "psycopg2_binary-2.9.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:70831e03bd53702c941da1a1ad36c17d825a24fbb26857b40913d58df82ec18b"}, - {file = "psycopg2_binary-2.9.5-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:dbc332beaf8492b5731229a881807cd7b91b50dbbbaf7fe2faf46942eda64a24"}, - {file = "psycopg2_binary-2.9.5-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:2d964eb24c8b021623df1c93c626671420c6efadbdb8655cb2bd5e0c6fa422ba"}, - {file = "psycopg2_binary-2.9.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:95076399ec3b27a8f7fa1cc9a83417b1c920d55cf7a97f718a94efbb96c7f503"}, - {file = "psycopg2_binary-2.9.5-cp36-cp36m-win32.whl", hash = "sha256:3fc33295cfccad697a97a76dec3f1e94ad848b7b163c3228c1636977966b51e2"}, - {file = "psycopg2_binary-2.9.5-cp36-cp36m-win_amd64.whl", hash = "sha256:02551647542f2bf89073d129c73c05a25c372fc0a49aa50e0de65c3c143d8bd0"}, - {file = "psycopg2_binary-2.9.5-cp37-cp37m-macosx_10_15_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:63e318dbe52709ed10d516a356f22a635e07a2e34c68145484ed96a19b0c4c68"}, - {file = "psycopg2_binary-2.9.5-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7e518a0911c50f60313cb9e74a169a65b5d293770db4770ebf004245f24b5c5"}, - {file = "psycopg2_binary-2.9.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9d38a4656e4e715d637abdf7296e98d6267df0cc0a8e9a016f8ba07e4aa3eeb"}, - {file = "psycopg2_binary-2.9.5-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:68d81a2fe184030aa0c5c11e518292e15d342a667184d91e30644c9d533e53e1"}, - {file = "psycopg2_binary-2.9.5-cp37-cp37m-manylinux_2_24_ppc64le.whl", hash = "sha256:7ee3095d02d6f38bd7d9a5358fcc9ea78fcdb7176921528dd709cc63f40184f5"}, - {file = "psycopg2_binary-2.9.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:46512486be6fbceef51d7660dec017394ba3e170299d1dc30928cbedebbf103a"}, - {file = "psycopg2_binary-2.9.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b911dfb727e247340d36ae20c4b9259e4a64013ab9888ccb3cbba69b77fd9636"}, - {file = "psycopg2_binary-2.9.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:422e3d43b47ac20141bc84b3d342eead8d8099a62881a501e97d15f6addabfe9"}, - {file = "psycopg2_binary-2.9.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c5682a45df7d9642eff590abc73157c887a68f016df0a8ad722dcc0f888f56d7"}, - {file = "psycopg2_binary-2.9.5-cp37-cp37m-win32.whl", hash = "sha256:b8104f709590fff72af801e916817560dbe1698028cd0afe5a52d75ceb1fce5f"}, - {file = "psycopg2_binary-2.9.5-cp37-cp37m-win_amd64.whl", hash = "sha256:7b3751857da3e224f5629400736a7b11e940b5da5f95fa631d86219a1beaafec"}, - {file = "psycopg2_binary-2.9.5-cp38-cp38-macosx_10_15_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:043a9fd45a03858ff72364b4b75090679bd875ee44df9c0613dc862ca6b98460"}, - {file = "psycopg2_binary-2.9.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9ffdc51001136b699f9563b1c74cc1f8c07f66ef7219beb6417a4c8aaa896c28"}, - {file = "psycopg2_binary-2.9.5-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c15ba5982c177bc4b23a7940c7e4394197e2d6a424a2d282e7c236b66da6d896"}, - {file = "psycopg2_binary-2.9.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc85b3777068ed30aff8242be2813038a929f2084f69e43ef869daddae50f6ee"}, - {file = "psycopg2_binary-2.9.5-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:215d6bf7e66732a514f47614f828d8c0aaac9a648c46a831955cb103473c7147"}, - {file = "psycopg2_binary-2.9.5-cp38-cp38-manylinux_2_24_ppc64le.whl", hash = "sha256:7d07f552d1e412f4b4e64ce386d4c777a41da3b33f7098b6219012ba534fb2c2"}, - {file = "psycopg2_binary-2.9.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a0adef094c49f242122bb145c3c8af442070dc0e4312db17e49058c1702606d4"}, - {file = "psycopg2_binary-2.9.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:00475004e5ed3e3bf5e056d66e5dcdf41a0dc62efcd57997acd9135c40a08a50"}, - {file = "psycopg2_binary-2.9.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:7d88db096fa19d94f433420eaaf9f3c45382da2dd014b93e4bf3215639047c16"}, - {file = "psycopg2_binary-2.9.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:902844f9c4fb19b17dfa84d9e2ca053d4a4ba265723d62ea5c9c26b38e0aa1e6"}, - {file = "psycopg2_binary-2.9.5-cp38-cp38-win32.whl", hash = "sha256:4e7904d1920c0c89105c0517dc7e3f5c20fb4e56ba9cdef13048db76947f1d79"}, - {file = "psycopg2_binary-2.9.5-cp38-cp38-win_amd64.whl", hash = "sha256:a36a0e791805aa136e9cbd0ffa040d09adec8610453ee8a753f23481a0057af5"}, - {file = "psycopg2_binary-2.9.5-cp39-cp39-macosx_10_15_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:25382c7d174c679ce6927c16b6fbb68b10e56ee44b1acb40671e02d29f2fce7c"}, - {file = "psycopg2_binary-2.9.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9c38d3869238e9d3409239bc05bc27d6b7c99c2a460ea337d2814b35fb4fea1b"}, - {file = "psycopg2_binary-2.9.5-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5c6527c8efa5226a9e787507652dd5ba97b62d29b53c371a85cd13f957fe4d42"}, - {file = "psycopg2_binary-2.9.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e59137cdb970249ae60be2a49774c6dfb015bd0403f05af1fe61862e9626642d"}, - {file = "psycopg2_binary-2.9.5-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:d4c7b3a31502184e856df1f7bbb2c3735a05a8ce0ade34c5277e1577738a5c91"}, - {file = "psycopg2_binary-2.9.5-cp39-cp39-manylinux_2_24_ppc64le.whl", hash = "sha256:b9a794cef1d9c1772b94a72eec6da144c18e18041d294a9ab47669bc77a80c1d"}, - {file = "psycopg2_binary-2.9.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c5254cbd4f4855e11cebf678c1a848a3042d455a22a4ce61349c36aafd4c2267"}, - {file = "psycopg2_binary-2.9.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c5e65c6ac0ae4bf5bef1667029f81010b6017795dcb817ba5c7b8a8d61fab76f"}, - {file = "psycopg2_binary-2.9.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:74eddec4537ab1f701a1647214734bc52cee2794df748f6ae5908e00771f180a"}, - {file = "psycopg2_binary-2.9.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:01ad49d68dd8c5362e4bfb4158f2896dc6e0c02e87b8a3770fc003459f1a4425"}, - {file = "psycopg2_binary-2.9.5-cp39-cp39-win32.whl", hash = "sha256:937880290775033a743f4836aa253087b85e62784b63fd099ee725d567a48aa1"}, - {file = "psycopg2_binary-2.9.5-cp39-cp39-win_amd64.whl", hash = "sha256:484405b883630f3e74ed32041a87456c5e0e63a8e3429aa93e8714c366d62bd1"}, + {file = "psycopg2-binary-2.9.7.tar.gz", hash = "sha256:1b918f64a51ffe19cd2e230b3240ba481330ce1d4b7875ae67305bd1d37b041c"}, + {file = "psycopg2_binary-2.9.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ea5f8ee87f1eddc818fc04649d952c526db4426d26bab16efbe5a0c52b27d6ab"}, + {file = "psycopg2_binary-2.9.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2993ccb2b7e80844d534e55e0f12534c2871952f78e0da33c35e648bf002bbff"}, + {file = "psycopg2_binary-2.9.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbbc3c5d15ed76b0d9db7753c0db40899136ecfe97d50cbde918f630c5eb857a"}, + {file = "psycopg2_binary-2.9.7-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:692df8763b71d42eb8343f54091368f6f6c9cfc56dc391858cdb3c3ef1e3e584"}, + {file = "psycopg2_binary-2.9.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9dcfd5d37e027ec393a303cc0a216be564b96c80ba532f3d1e0d2b5e5e4b1e6e"}, + {file = "psycopg2_binary-2.9.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17cc17a70dfb295a240db7f65b6d8153c3d81efb145d76da1e4a096e9c5c0e63"}, + {file = "psycopg2_binary-2.9.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e5666632ba2b0d9757b38fc17337d84bdf932d38563c5234f5f8c54fd01349c9"}, + {file = "psycopg2_binary-2.9.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7db7b9b701974c96a88997d458b38ccb110eba8f805d4b4f74944aac48639b42"}, + {file = "psycopg2_binary-2.9.7-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c82986635a16fb1fa15cd5436035c88bc65c3d5ced1cfaac7f357ee9e9deddd4"}, + {file = "psycopg2_binary-2.9.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4fe13712357d802080cfccbf8c6266a3121dc0e27e2144819029095ccf708372"}, + {file = "psycopg2_binary-2.9.7-cp310-cp310-win32.whl", hash = "sha256:122641b7fab18ef76b18860dd0c772290566b6fb30cc08e923ad73d17461dc63"}, + {file = "psycopg2_binary-2.9.7-cp310-cp310-win_amd64.whl", hash = "sha256:f8651cf1f144f9ee0fa7d1a1df61a9184ab72962531ca99f077bbdcba3947c58"}, + {file = "psycopg2_binary-2.9.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4ecc15666f16f97709106d87284c136cdc82647e1c3f8392a672616aed3c7151"}, + {file = "psycopg2_binary-2.9.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3fbb1184c7e9d28d67671992970718c05af5f77fc88e26fd7136613c4ece1f89"}, + {file = "psycopg2_binary-2.9.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a7968fd20bd550431837656872c19575b687f3f6f98120046228e451e4064df"}, + {file = "psycopg2_binary-2.9.7-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:094af2e77a1976efd4956a031028774b827029729725e136514aae3cdf49b87b"}, + {file = "psycopg2_binary-2.9.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:26484e913d472ecb6b45937ea55ce29c57c662066d222fb0fbdc1fab457f18c5"}, + {file = "psycopg2_binary-2.9.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f309b77a7c716e6ed9891b9b42953c3ff7d533dc548c1e33fddc73d2f5e21f9"}, + {file = "psycopg2_binary-2.9.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6d92e139ca388ccfe8c04aacc163756e55ba4c623c6ba13d5d1595ed97523e4b"}, + {file = "psycopg2_binary-2.9.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:2df562bb2e4e00ee064779902d721223cfa9f8f58e7e52318c97d139cf7f012d"}, + {file = "psycopg2_binary-2.9.7-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:4eec5d36dbcfc076caab61a2114c12094c0b7027d57e9e4387b634e8ab36fd44"}, + {file = "psycopg2_binary-2.9.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1011eeb0c51e5b9ea1016f0f45fa23aca63966a4c0afcf0340ccabe85a9f65bd"}, + {file = "psycopg2_binary-2.9.7-cp311-cp311-win32.whl", hash = "sha256:ded8e15f7550db9e75c60b3d9fcbc7737fea258a0f10032cdb7edc26c2a671fd"}, + {file = "psycopg2_binary-2.9.7-cp311-cp311-win_amd64.whl", hash = "sha256:8a136c8aaf6615653450817a7abe0fc01e4ea720ae41dfb2823eccae4b9062a3"}, + {file = "psycopg2_binary-2.9.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2dec5a75a3a5d42b120e88e6ed3e3b37b46459202bb8e36cd67591b6e5feebc1"}, + {file = "psycopg2_binary-2.9.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc10da7e7df3380426521e8c1ed975d22df678639da2ed0ec3244c3dc2ab54c8"}, + {file = "psycopg2_binary-2.9.7-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee919b676da28f78f91b464fb3e12238bd7474483352a59c8a16c39dfc59f0c5"}, + {file = "psycopg2_binary-2.9.7-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb1c0e682138f9067a58fc3c9a9bf1c83d8e08cfbee380d858e63196466d5c86"}, + {file = "psycopg2_binary-2.9.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00d8db270afb76f48a499f7bb8fa70297e66da67288471ca873db88382850bf4"}, + {file = "psycopg2_binary-2.9.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9b0c2b466b2f4d89ccc33784c4ebb1627989bd84a39b79092e560e937a11d4ac"}, + {file = "psycopg2_binary-2.9.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:51d1b42d44f4ffb93188f9b39e6d1c82aa758fdb8d9de65e1ddfe7a7d250d7ad"}, + {file = "psycopg2_binary-2.9.7-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:11abdbfc6f7f7dea4a524b5f4117369b0d757725798f1593796be6ece20266cb"}, + {file = "psycopg2_binary-2.9.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:f02f4a72cc3ab2565c6d9720f0343cb840fb2dc01a2e9ecb8bc58ccf95dc5c06"}, + {file = "psycopg2_binary-2.9.7-cp37-cp37m-win32.whl", hash = "sha256:81d5dd2dd9ab78d31a451e357315f201d976c131ca7d43870a0e8063b6b7a1ec"}, + {file = "psycopg2_binary-2.9.7-cp37-cp37m-win_amd64.whl", hash = "sha256:62cb6de84d7767164a87ca97e22e5e0a134856ebcb08f21b621c6125baf61f16"}, + {file = "psycopg2_binary-2.9.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:59f7e9109a59dfa31efa022e94a244736ae401526682de504e87bd11ce870c22"}, + {file = "psycopg2_binary-2.9.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:95a7a747bdc3b010bb6a980f053233e7610276d55f3ca506afff4ad7749ab58a"}, + {file = "psycopg2_binary-2.9.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c721ee464e45ecf609ff8c0a555018764974114f671815a0a7152aedb9f3343"}, + {file = "psycopg2_binary-2.9.7-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4f37bbc6588d402980ffbd1f3338c871368fb4b1cfa091debe13c68bb3852b3"}, + {file = "psycopg2_binary-2.9.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac83ab05e25354dad798401babaa6daa9577462136ba215694865394840e31f8"}, + {file = "psycopg2_binary-2.9.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:024eaeb2a08c9a65cd5f94b31ace1ee3bb3f978cd4d079406aef85169ba01f08"}, + {file = "psycopg2_binary-2.9.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1c31c2606ac500dbd26381145684d87730a2fac9a62ebcfbaa2b119f8d6c19f4"}, + {file = "psycopg2_binary-2.9.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:42a62ef0e5abb55bf6ffb050eb2b0fcd767261fa3faf943a4267539168807522"}, + {file = "psycopg2_binary-2.9.7-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:7952807f95c8eba6a8ccb14e00bf170bb700cafcec3924d565235dffc7dc4ae8"}, + {file = "psycopg2_binary-2.9.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e02bc4f2966475a7393bd0f098e1165d470d3fa816264054359ed4f10f6914ea"}, + {file = "psycopg2_binary-2.9.7-cp38-cp38-win32.whl", hash = "sha256:fdca0511458d26cf39b827a663d7d87db6f32b93efc22442a742035728603d5f"}, + {file = "psycopg2_binary-2.9.7-cp38-cp38-win_amd64.whl", hash = "sha256:d0b16e5bb0ab78583f0ed7ab16378a0f8a89a27256bb5560402749dbe8a164d7"}, + {file = "psycopg2_binary-2.9.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6822c9c63308d650db201ba22fe6648bd6786ca6d14fdaf273b17e15608d0852"}, + {file = "psycopg2_binary-2.9.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f94cb12150d57ea433e3e02aabd072205648e86f1d5a0a692d60242f7809b15"}, + {file = "psycopg2_binary-2.9.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5ee89587696d808c9a00876065d725d4ae606f5f7853b961cdbc348b0f7c9a1"}, + {file = "psycopg2_binary-2.9.7-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad5ec10b53cbb57e9a2e77b67e4e4368df56b54d6b00cc86398578f1c635f329"}, + {file = "psycopg2_binary-2.9.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:642df77484b2dcaf87d4237792246d8068653f9e0f5c025e2c692fc56b0dda70"}, + {file = "psycopg2_binary-2.9.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6a8b575ac45af1eaccbbcdcf710ab984fd50af048fe130672377f78aaff6fc1"}, + {file = "psycopg2_binary-2.9.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f955aa50d7d5220fcb6e38f69ea126eafecd812d96aeed5d5f3597f33fad43bb"}, + {file = "psycopg2_binary-2.9.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ad26d4eeaa0d722b25814cce97335ecf1b707630258f14ac4d2ed3d1d8415265"}, + {file = "psycopg2_binary-2.9.7-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:ced63c054bdaf0298f62681d5dcae3afe60cbae332390bfb1acf0e23dcd25fc8"}, + {file = "psycopg2_binary-2.9.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2b04da24cbde33292ad34a40db9832a80ad12de26486ffeda883413c9e1b1d5e"}, + {file = "psycopg2_binary-2.9.7-cp39-cp39-win32.whl", hash = "sha256:18f12632ab516c47c1ac4841a78fddea6508a8284c7cf0f292cb1a523f2e2379"}, + {file = "psycopg2_binary-2.9.7-cp39-cp39-win_amd64.whl", hash = "sha256:eb3b8d55924a6058a26db69fb1d3e7e32695ff8b491835ba9f479537e14dcf9f"}, ] [[package]] @@ -1582,26 +1771,15 @@ files = [ [package.extras] tests = ["pytest"] -[[package]] -name = "py" -version = "1.11.0" -description = "library with cross-python path, ini-parsing, io, code, log facilities" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, - {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, -] - [[package]] name = "pyasn1" -version = "0.4.8" -description = "ASN.1 types and codecs" +version = "0.5.0" +description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" optional = false -python-versions = "*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ - {file = "pyasn1-0.4.8-py2.py3-none-any.whl", hash = "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d"}, - {file = "pyasn1-0.4.8.tar.gz", hash = "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba"}, + {file = "pyasn1-0.5.0-py2.py3-none-any.whl", hash = "sha256:87a2121042a1ac9358cabcaf1d07680ff97ee6404333bacca15f76aa8ad01a57"}, + {file = "pyasn1-0.5.0.tar.gz", hash = "sha256:97b7290ca68e62a832558ec3976f15cbf911bf5d7c7039d8b861c2a0ece69fde"}, ] [[package]] @@ -1628,51 +1806,51 @@ files = [ [[package]] name = "pydantic" -version = "1.10.2" +version = "1.10.12" description = "Data validation and settings management using python type hints" optional = false python-versions = ">=3.7" files = [ - {file = "pydantic-1.10.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bb6ad4489af1bac6955d38ebcb95079a836af31e4c4f74aba1ca05bb9f6027bd"}, - {file = "pydantic-1.10.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a1f5a63a6dfe19d719b1b6e6106561869d2efaca6167f84f5ab9347887d78b98"}, - {file = "pydantic-1.10.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:352aedb1d71b8b0736c6d56ad2bd34c6982720644b0624462059ab29bd6e5912"}, - {file = "pydantic-1.10.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19b3b9ccf97af2b7519c42032441a891a5e05c68368f40865a90eb88833c2559"}, - {file = "pydantic-1.10.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e9069e1b01525a96e6ff49e25876d90d5a563bc31c658289a8772ae186552236"}, - {file = "pydantic-1.10.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:355639d9afc76bcb9b0c3000ddcd08472ae75318a6eb67a15866b87e2efa168c"}, - {file = "pydantic-1.10.2-cp310-cp310-win_amd64.whl", hash = "sha256:ae544c47bec47a86bc7d350f965d8b15540e27e5aa4f55170ac6a75e5f73b644"}, - {file = "pydantic-1.10.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a4c805731c33a8db4b6ace45ce440c4ef5336e712508b4d9e1aafa617dc9907f"}, - {file = "pydantic-1.10.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d49f3db871575e0426b12e2f32fdb25e579dea16486a26e5a0474af87cb1ab0a"}, - {file = "pydantic-1.10.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37c90345ec7dd2f1bcef82ce49b6235b40f282b94d3eec47e801baf864d15525"}, - {file = "pydantic-1.10.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b5ba54d026c2bd2cb769d3468885f23f43710f651688e91f5fb1edcf0ee9283"}, - {file = "pydantic-1.10.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:05e00dbebbe810b33c7a7362f231893183bcc4251f3f2ff991c31d5c08240c42"}, - {file = "pydantic-1.10.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2d0567e60eb01bccda3a4df01df677adf6b437958d35c12a3ac3e0f078b0ee52"}, - {file = "pydantic-1.10.2-cp311-cp311-win_amd64.whl", hash = "sha256:c6f981882aea41e021f72779ce2a4e87267458cc4d39ea990729e21ef18f0f8c"}, - {file = "pydantic-1.10.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4aac8e7103bf598373208f6299fa9a5cfd1fc571f2d40bf1dd1955a63d6eeb5"}, - {file = "pydantic-1.10.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81a7b66c3f499108b448f3f004801fcd7d7165fb4200acb03f1c2402da73ce4c"}, - {file = "pydantic-1.10.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bedf309630209e78582ffacda64a21f96f3ed2e51fbf3962d4d488e503420254"}, - {file = "pydantic-1.10.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9300fcbebf85f6339a02c6994b2eb3ff1b9c8c14f502058b5bf349d42447dcf5"}, - {file = "pydantic-1.10.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:216f3bcbf19c726b1cc22b099dd409aa371f55c08800bcea4c44c8f74b73478d"}, - {file = "pydantic-1.10.2-cp37-cp37m-win_amd64.whl", hash = "sha256:dd3f9a40c16daf323cf913593083698caee97df2804aa36c4b3175d5ac1b92a2"}, - {file = "pydantic-1.10.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b97890e56a694486f772d36efd2ba31612739bc6f3caeee50e9e7e3ebd2fdd13"}, - {file = "pydantic-1.10.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9cabf4a7f05a776e7793e72793cd92cc865ea0e83a819f9ae4ecccb1b8aa6116"}, - {file = "pydantic-1.10.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06094d18dd5e6f2bbf93efa54991c3240964bb663b87729ac340eb5014310624"}, - {file = "pydantic-1.10.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc78cc83110d2f275ec1970e7a831f4e371ee92405332ebfe9860a715f8336e1"}, - {file = "pydantic-1.10.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ee433e274268a4b0c8fde7ad9d58ecba12b069a033ecc4645bb6303c062d2e9"}, - {file = "pydantic-1.10.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7c2abc4393dea97a4ccbb4ec7d8658d4e22c4765b7b9b9445588f16c71ad9965"}, - {file = "pydantic-1.10.2-cp38-cp38-win_amd64.whl", hash = "sha256:0b959f4d8211fc964772b595ebb25f7652da3f22322c007b6fed26846a40685e"}, - {file = "pydantic-1.10.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c33602f93bfb67779f9c507e4d69451664524389546bacfe1bee13cae6dc7488"}, - {file = "pydantic-1.10.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5760e164b807a48a8f25f8aa1a6d857e6ce62e7ec83ea5d5c5a802eac81bad41"}, - {file = "pydantic-1.10.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6eb843dcc411b6a2237a694f5e1d649fc66c6064d02b204a7e9d194dff81eb4b"}, - {file = "pydantic-1.10.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b8795290deaae348c4eba0cebb196e1c6b98bdbe7f50b2d0d9a4a99716342fe"}, - {file = "pydantic-1.10.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e0bedafe4bc165ad0a56ac0bd7695df25c50f76961da29c050712596cf092d6d"}, - {file = "pydantic-1.10.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2e05aed07fa02231dbf03d0adb1be1d79cabb09025dd45aa094aa8b4e7b9dcda"}, - {file = "pydantic-1.10.2-cp39-cp39-win_amd64.whl", hash = "sha256:c1ba1afb396148bbc70e9eaa8c06c1716fdddabaf86e7027c5988bae2a829ab6"}, - {file = "pydantic-1.10.2-py3-none-any.whl", hash = "sha256:1b6ee725bd6e83ec78b1aa32c5b1fa67a3a65badddde3976bca5fe4568f27709"}, - {file = "pydantic-1.10.2.tar.gz", hash = "sha256:91b8e218852ef6007c2b98cd861601c6a09f1aa32bbbb74fab5b1c33d4a1e410"}, + {file = "pydantic-1.10.12-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a1fcb59f2f355ec350073af41d927bf83a63b50e640f4dbaa01053a28b7a7718"}, + {file = "pydantic-1.10.12-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b7ccf02d7eb340b216ec33e53a3a629856afe1c6e0ef91d84a4e6f2fb2ca70fe"}, + {file = "pydantic-1.10.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fb2aa3ab3728d950bcc885a2e9eff6c8fc40bc0b7bb434e555c215491bcf48b"}, + {file = "pydantic-1.10.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:771735dc43cf8383959dc9b90aa281f0b6092321ca98677c5fb6125a6f56d58d"}, + {file = "pydantic-1.10.12-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ca48477862372ac3770969b9d75f1bf66131d386dba79506c46d75e6b48c1e09"}, + {file = "pydantic-1.10.12-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a5e7add47a5b5a40c49b3036d464e3c7802f8ae0d1e66035ea16aa5b7a3923ed"}, + {file = "pydantic-1.10.12-cp310-cp310-win_amd64.whl", hash = "sha256:e4129b528c6baa99a429f97ce733fff478ec955513630e61b49804b6cf9b224a"}, + {file = "pydantic-1.10.12-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b0d191db0f92dfcb1dec210ca244fdae5cbe918c6050b342d619c09d31eea0cc"}, + {file = "pydantic-1.10.12-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:795e34e6cc065f8f498c89b894a3c6da294a936ee71e644e4bd44de048af1405"}, + {file = "pydantic-1.10.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69328e15cfda2c392da4e713443c7dbffa1505bc9d566e71e55abe14c97ddc62"}, + {file = "pydantic-1.10.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2031de0967c279df0d8a1c72b4ffc411ecd06bac607a212892757db7462fc494"}, + {file = "pydantic-1.10.12-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ba5b2e6fe6ca2b7e013398bc7d7b170e21cce322d266ffcd57cca313e54fb246"}, + {file = "pydantic-1.10.12-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2a7bac939fa326db1ab741c9d7f44c565a1d1e80908b3797f7f81a4f86bc8d33"}, + {file = "pydantic-1.10.12-cp311-cp311-win_amd64.whl", hash = "sha256:87afda5539d5140cb8ba9e8b8c8865cb5b1463924d38490d73d3ccfd80896b3f"}, + {file = "pydantic-1.10.12-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:549a8e3d81df0a85226963611950b12d2d334f214436a19537b2efed61b7639a"}, + {file = "pydantic-1.10.12-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:598da88dfa127b666852bef6d0d796573a8cf5009ffd62104094a4fe39599565"}, + {file = "pydantic-1.10.12-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba5c4a8552bff16c61882db58544116d021d0b31ee7c66958d14cf386a5b5350"}, + {file = "pydantic-1.10.12-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c79e6a11a07da7374f46970410b41d5e266f7f38f6a17a9c4823db80dadf4303"}, + {file = "pydantic-1.10.12-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab26038b8375581dc832a63c948f261ae0aa21f1d34c1293469f135fa92972a5"}, + {file = "pydantic-1.10.12-cp37-cp37m-win_amd64.whl", hash = "sha256:e0a16d274b588767602b7646fa05af2782576a6cf1022f4ba74cbb4db66f6ca8"}, + {file = "pydantic-1.10.12-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6a9dfa722316f4acf4460afdf5d41d5246a80e249c7ff475c43a3a1e9d75cf62"}, + {file = "pydantic-1.10.12-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a73f489aebd0c2121ed974054cb2759af8a9f747de120acd2c3394cf84176ccb"}, + {file = "pydantic-1.10.12-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b30bcb8cbfccfcf02acb8f1a261143fab622831d9c0989707e0e659f77a18e0"}, + {file = "pydantic-1.10.12-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fcfb5296d7877af406ba1547dfde9943b1256d8928732267e2653c26938cd9c"}, + {file = "pydantic-1.10.12-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2f9a6fab5f82ada41d56b0602606a5506aab165ca54e52bc4545028382ef1c5d"}, + {file = "pydantic-1.10.12-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:dea7adcc33d5d105896401a1f37d56b47d443a2b2605ff8a969a0ed5543f7e33"}, + {file = "pydantic-1.10.12-cp38-cp38-win_amd64.whl", hash = "sha256:1eb2085c13bce1612da8537b2d90f549c8cbb05c67e8f22854e201bde5d98a47"}, + {file = "pydantic-1.10.12-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ef6c96b2baa2100ec91a4b428f80d8f28a3c9e53568219b6c298c1125572ebc6"}, + {file = "pydantic-1.10.12-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c076be61cd0177a8433c0adcb03475baf4ee91edf5a4e550161ad57fc90f523"}, + {file = "pydantic-1.10.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d5a58feb9a39f481eda4d5ca220aa8b9d4f21a41274760b9bc66bfd72595b86"}, + {file = "pydantic-1.10.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5f805d2d5d0a41633651a73fa4ecdd0b3d7a49de4ec3fadf062fe16501ddbf1"}, + {file = "pydantic-1.10.12-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1289c180abd4bd4555bb927c42ee42abc3aee02b0fb2d1223fb7c6e5bef87dbe"}, + {file = "pydantic-1.10.12-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5d1197e462e0364906cbc19681605cb7c036f2475c899b6f296104ad42b9f5fb"}, + {file = "pydantic-1.10.12-cp39-cp39-win_amd64.whl", hash = "sha256:fdbdd1d630195689f325c9ef1a12900524dceb503b00a987663ff4f58669b93d"}, + {file = "pydantic-1.10.12-py3-none-any.whl", hash = "sha256:b749a43aa51e32839c9d71dc67eb1e4221bb04af1033a32e3923d46f9effa942"}, + {file = "pydantic-1.10.12.tar.gz", hash = "sha256:0fe8a415cea8f340e7a9af9c54fc71a649b43e8ca3cc732986116b3cb135d303"}, ] [package.dependencies] -typing-extensions = ">=4.1.0" +typing-extensions = ">=4.2.0" [package.extras] dotenv = ["python-dotenv (>=0.10.4)"] @@ -1691,13 +1869,13 @@ files = [ [[package]] name = "pygments" -version = "2.13.0" +version = "2.16.1" description = "Pygments is a syntax highlighting package written in Python." optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "Pygments-2.13.0-py3-none-any.whl", hash = "sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42"}, - {file = "Pygments-2.13.0.tar.gz", hash = "sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1"}, + {file = "Pygments-2.16.1-py3-none-any.whl", hash = "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692"}, + {file = "Pygments-2.16.1.tar.gz", hash = "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29"}, ] [package.extras] @@ -1724,39 +1902,93 @@ docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] [[package]] -name = "pyparsing" -version = "3.0.9" -description = "pyparsing module - Classes and methods to define and execute parsing grammars" +name = "pymupdf" +version = "1.23.2" +description = "A high performance Python library for data extraction, analysis, conversion & manipulation of PDF (and other) documents." optional = false -python-versions = ">=3.6.8" +python-versions = ">=3.8" files = [ - {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, - {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, + {file = "PyMuPDF-1.23.2-cp310-none-macosx_10_9_x86_64.whl", hash = "sha256:701aff64dbf0635c2c875b518979b46b935ed4d3b3d2aee1c449e2960831d766"}, + {file = "PyMuPDF-1.23.2-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:949c071b50825cf341f03546e7354cef942c36fcc071a72a0417c035d6ee7e33"}, + {file = "PyMuPDF-1.23.2-cp310-none-manylinux2014_aarch64.whl", hash = "sha256:5209612dfc9038fbbb1a61dc01bd298d5279646d5e1c98cfe80878db3d862a3e"}, + {file = "PyMuPDF-1.23.2-cp310-none-manylinux2014_x86_64.whl", hash = "sha256:f20ba77a61440220bd2e380ceef8a86bf51f97ac9374a8af00aeedea904dad46"}, + {file = "PyMuPDF-1.23.2-cp310-none-win32.whl", hash = "sha256:01c45723fbc389fac2ab8150e5ba80c357706ca69a74c29ec1a83a05921c53d1"}, + {file = "PyMuPDF-1.23.2-cp310-none-win_amd64.whl", hash = "sha256:ff799db717d5b0e423bd81fbae8131cf3463a80a642524a96952f6f3deaf2a95"}, + {file = "PyMuPDF-1.23.2-cp311-none-macosx_10_9_x86_64.whl", hash = "sha256:1f372bcc70b888f0c953add8b15627efb9f3cc2c7b8ad0916560b6081093932c"}, + {file = "PyMuPDF-1.23.2-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:6389eb4bfc27264a951497847089e5e4485f6609c351ac321071d62881a21982"}, + {file = "PyMuPDF-1.23.2-cp311-none-manylinux2014_aarch64.whl", hash = "sha256:0fc5f600b3a72c29a0944cbcbc1375962ad669023265c50cd1d8f794d7ae95f7"}, + {file = "PyMuPDF-1.23.2-cp311-none-manylinux2014_x86_64.whl", hash = "sha256:4fc4a6183a7a8006b83476fc0b26d6fb849996050e8c3c911b9d6a66fe6ccc1e"}, + {file = "PyMuPDF-1.23.2-cp311-none-win32.whl", hash = "sha256:66f94d35fd48e2b5cbe70a4601f036f76cb826318b893994ab7bd4186a65e78f"}, + {file = "PyMuPDF-1.23.2-cp311-none-win_amd64.whl", hash = "sha256:1ec04285451231c68a024657b75d59a43ce0dcdade582edf3a9cc1d86c75b826"}, + {file = "PyMuPDF-1.23.2-cp38-none-macosx_10_9_x86_64.whl", hash = "sha256:40a713ea439548cf3c6bd910dc904cb868eae9d7bc1c2d0aebc04c84431822af"}, + {file = "PyMuPDF-1.23.2-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:f0d57e40bdbf6c6deacf94387d3aad918535d8723aa6e3a27e4bef1f3d52158a"}, + {file = "PyMuPDF-1.23.2-cp38-none-manylinux2014_aarch64.whl", hash = "sha256:2de9da709e14a0b32ca1ed7e268615189a8c1e76a26920dd45a92d9f0e207d1f"}, + {file = "PyMuPDF-1.23.2-cp38-none-manylinux2014_x86_64.whl", hash = "sha256:7edc4b4542041a28f5644c09c1e670215ae014adc28a81d32786db73077d4cf3"}, + {file = "PyMuPDF-1.23.2-cp38-none-win32.whl", hash = "sha256:18f19be85f277a36536277f3f4991a2d1d1b9c2d0c3a515925e9bef41780efe0"}, + {file = "PyMuPDF-1.23.2-cp38-none-win_amd64.whl", hash = "sha256:a98cf7bb1ba8d64de78f443005c0f60c0c9644f73b3ebd57cbd20e232e2e5a30"}, + {file = "PyMuPDF-1.23.2-cp39-none-macosx_10_9_x86_64.whl", hash = "sha256:ac236156688627bca0a8062bb4153f77108f072dd4a06a80626fd089c2879e04"}, + {file = "PyMuPDF-1.23.2-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:c1a08531194d038e068641be92fdc31276efbee2b718a8dc4281dc593f1a99e7"}, + {file = "PyMuPDF-1.23.2-cp39-none-manylinux2014_aarch64.whl", hash = "sha256:78b6c87fd375d1b017c63a426432be7ee4859f2142108b9c5dc8283599c112eb"}, + {file = "PyMuPDF-1.23.2-cp39-none-manylinux2014_x86_64.whl", hash = "sha256:41d9cd45bb61cda890d446baeeded454fb4404086cf7f7e385e440123e9ecb56"}, + {file = "PyMuPDF-1.23.2-cp39-none-win32.whl", hash = "sha256:d34da29cd4305c4b85ea57528c1a31cfc6abfac7921d27153e633470e9dac104"}, + {file = "PyMuPDF-1.23.2-cp39-none-win_amd64.whl", hash = "sha256:86127075227f868a6b115eb96a74405539dde90168cd1a98781b0f1f6d4f9d7c"}, + {file = "PyMuPDF-1.23.2.tar.gz", hash = "sha256:32302d0eb0e28d60ba305f5d74702fb0fab2ed9d9f6b3a9d853429e5023bc6bb"}, ] -[package.extras] -diagrams = ["jinja2", "railroad-diagrams"] +[package.dependencies] +PyMuPDFb = "1.23.0" + +[[package]] +name = "pymupdfb" +version = "1.23.0" +description = "Rebased Python bindings for the PDF toolkit and renderer MuPDF - shared libraries only" +optional = false +python-versions = ">=3.8" +files = [ + {file = "PyMuPDFb-1.23.0-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:517b6bf8eb658d15a13b43f95bd06a93ac7020b25df45b35eb43058815ff2de0"}, + {file = "PyMuPDFb-1.23.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:07f55d21e982b3ba567708f8a4d663d933b597d2dcd81e16a6b09fdc3a66e59c"}, + {file = "PyMuPDFb-1.23.0-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3acfa3b9b4a4021cac771c74621d571b9cbb6ed7dc09833fe85f4126a7d4db97"}, + {file = "PyMuPDFb-1.23.0-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c58801b097c02910238e378aad23be3ff0f5ef785bad269142b4efb353dc9728"}, + {file = "PyMuPDFb-1.23.0-py3-none-win32.whl", hash = "sha256:89bf1a1085bffa3d5f8db12fce61cc9e0644a296bcc9568637f7ab36509e79ae"}, + {file = "PyMuPDFb-1.23.0-py3-none-win_amd64.whl", hash = "sha256:a5f425f2b2d977f623ba87f869162cb1a1579023c92032f863ea541d3c8997d9"}, +] [[package]] name = "pytest" -version = "7.2.2" +version = "7.4.0" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" files = [ - {file = "pytest-7.2.2-py3-none-any.whl", hash = "sha256:130328f552dcfac0b1cec75c12e3f005619dc5f874f0a06e8ff7263f0ee6225e"}, - {file = "pytest-7.2.2.tar.gz", hash = "sha256:c99ab0c73aceb050f68929bc93af19ab6db0558791c6a0715723abe9d0ade9d4"}, + {file = "pytest-7.4.0-py3-none-any.whl", hash = "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32"}, + {file = "pytest-7.4.0.tar.gz", hash = "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a"}, ] [package.dependencies] -attrs = ">=19.2.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} iniconfig = "*" packaging = "*" pluggy = ">=0.12,<2.0" [package.extras] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "pytest-mock" +version = "3.11.1" +description = "Thin-wrapper around the mock package for easier use with pytest" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-mock-3.11.1.tar.gz", hash = "sha256:7f6b125602ac6d743e523ae0bfa71e1a697a2f5534064528c6ff84c2f7c2fc7f"}, + {file = "pytest_mock-3.11.1-py3-none-any.whl", hash = "sha256:21c279fff83d70763b05f8874cc9cfb3fcacd6d354247a976f9529d19f9acf39"}, +] + +[package.dependencies] +pytest = ">=5.0" + +[package.extras] +dev = ["pre-commit", "pytest-asyncio", "tox"] [[package]] name = "python-dateutil" @@ -1772,15 +2004,28 @@ files = [ [package.dependencies] six = ">=1.5" +[[package]] +name = "python-docx" +version = "0.8.11" +description = "Create and update Microsoft Word .docx files." +optional = false +python-versions = "*" +files = [ + {file = "python-docx-0.8.11.tar.gz", hash = "sha256:1105d233a0956dd8dd1e710d20b159e2d72ac3c301041b95f4d4ceb3e0ebebc4"}, +] + +[package.dependencies] +lxml = ">=2.3.2" + [[package]] name = "python-dotenv" -version = "0.21.0" +version = "0.21.1" description = "Read key-value pairs from a .env file and set them as environment variables" optional = false python-versions = ">=3.7" files = [ - {file = "python-dotenv-0.21.0.tar.gz", hash = "sha256:b77d08274639e3d34145dfa6c7008e66df0f04b7be7a75fd0d5292c191d79045"}, - {file = "python_dotenv-0.21.0-py3-none-any.whl", hash = "sha256:1684eb44636dd462b66c3ee016599815514527ad99965de77f43e0944634a7e5"}, + {file = "python-dotenv-0.21.1.tar.gz", hash = "sha256:1c93de8f636cde3ce377292818d0e440b6e45a82f215c3744979151fa8151c49"}, + {file = "python_dotenv-0.21.1-py3-none-any.whl", hash = "sha256:41e12e0318bebc859fcc4d97d4db8d20ad21721a6aa5047dd59f090391cb549a"}, ] [package.extras] @@ -1809,20 +2054,20 @@ pycryptodome = ["pyasn1", "pycryptodome (>=3.3.1,<4.0.0)"] [[package]] name = "python-keycloak" -version = "2.9.0" +version = "3.3.0" description = "python-keycloak is a Python package providing access to the Keycloak API." optional = false python-versions = ">=3.7,<4.0" files = [ - {file = "python_keycloak-2.9.0-py3-none-any.whl", hash = "sha256:f2b42fc27b474ac791900eee38049ba9342613118f599e8214e85cfd58d4329e"}, - {file = "python_keycloak-2.9.0.tar.gz", hash = "sha256:a270939000a4431a1f94ccf833ca3884d015635491cfb557405bc78e80a12b28"}, + {file = "python_keycloak-3.3.0-py3-none-any.whl", hash = "sha256:57cd0bd0610e07ad11888197d3f753a00611cb9975742e70444b93a566889a51"}, + {file = "python_keycloak-3.3.0.tar.gz", hash = "sha256:cc868126f535aa4f320dc9eab24e46af381c13bcc88d9b0701b04293ea75cd24"}, ] [package.dependencies] -python-jose = ">=3.3.0,<4.0.0" -requests = ">=2.20.0,<3.0.0" -requests-toolbelt = ">=0.9.1,<0.10.0" -urllib3 = ">=1.26.0,<2.0.0" +deprecation = ">=2.1.0" +python-jose = ">=3.3.0" +requests = ">=2.20.0" +requests-toolbelt = ">=1.0.0" [package.extras] docs = ["Sphinx (>=5.3.0,<6.0.0)", "alabaster (>=0.7.12,<0.8.0)", "commonmark (>=0.9.1,<0.10.0)", "m2r2 (>=0.3.2,<0.4.0)", "mock (>=4.0.3,<5.0.0)", "readthedocs-sphinx-ext (>=2.1.9,<3.0.0)", "recommonmark (>=0.7.1,<0.8.0)", "sphinx-autoapi (>=2.0.0,<3.0.0)", "sphinx-rtd-theme (>=1.0.0,<2.0.0)"] @@ -1860,190 +2105,237 @@ unidecode = ["Unidecode (>=1.1.1)"] [[package]] name = "pytz" -version = "2022.6" +version = "2023.3" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" files = [ - {file = "pytz-2022.6-py2.py3-none-any.whl", hash = "sha256:222439474e9c98fced559f1709d89e6c9cbf8d79c794ff3eb9f8800064291427"}, - {file = "pytz-2022.6.tar.gz", hash = "sha256:e89512406b793ca39f5971bc999cc538ce125c0e51c27941bef4568b460095e2"}, + {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"}, + {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"}, ] [[package]] name = "pywin32" -version = "305" +version = "306" description = "Python for Window Extensions" optional = false python-versions = "*" files = [ - {file = "pywin32-305-cp310-cp310-win32.whl", hash = "sha256:421f6cd86e84bbb696d54563c48014b12a23ef95a14e0bdba526be756d89f116"}, - {file = "pywin32-305-cp310-cp310-win_amd64.whl", hash = "sha256:73e819c6bed89f44ff1d690498c0a811948f73777e5f97c494c152b850fad478"}, - {file = "pywin32-305-cp310-cp310-win_arm64.whl", hash = "sha256:742eb905ce2187133a29365b428e6c3b9001d79accdc30aa8969afba1d8470f4"}, - {file = "pywin32-305-cp311-cp311-win32.whl", hash = "sha256:19ca459cd2e66c0e2cc9a09d589f71d827f26d47fe4a9d09175f6aa0256b51c2"}, - {file = "pywin32-305-cp311-cp311-win_amd64.whl", hash = "sha256:326f42ab4cfff56e77e3e595aeaf6c216712bbdd91e464d167c6434b28d65990"}, - {file = "pywin32-305-cp311-cp311-win_arm64.whl", hash = "sha256:4ecd404b2c6eceaca52f8b2e3e91b2187850a1ad3f8b746d0796a98b4cea04db"}, - {file = "pywin32-305-cp36-cp36m-win32.whl", hash = "sha256:48d8b1659284f3c17b68587af047d110d8c44837736b8932c034091683e05863"}, - {file = "pywin32-305-cp36-cp36m-win_amd64.whl", hash = "sha256:13362cc5aa93c2beaf489c9c9017c793722aeb56d3e5166dadd5ef82da021fe1"}, - {file = "pywin32-305-cp37-cp37m-win32.whl", hash = "sha256:a55db448124d1c1484df22fa8bbcbc45c64da5e6eae74ab095b9ea62e6d00496"}, - {file = "pywin32-305-cp37-cp37m-win_amd64.whl", hash = "sha256:109f98980bfb27e78f4df8a51a8198e10b0f347257d1e265bb1a32993d0c973d"}, - {file = "pywin32-305-cp38-cp38-win32.whl", hash = "sha256:9dd98384da775afa009bc04863426cb30596fd78c6f8e4e2e5bbf4edf8029504"}, - {file = "pywin32-305-cp38-cp38-win_amd64.whl", hash = "sha256:56d7a9c6e1a6835f521788f53b5af7912090674bb84ef5611663ee1595860fc7"}, - {file = "pywin32-305-cp39-cp39-win32.whl", hash = "sha256:9d968c677ac4d5cbdaa62fd3014ab241718e619d8e36ef8e11fb930515a1e918"}, - {file = "pywin32-305-cp39-cp39-win_amd64.whl", hash = "sha256:50768c6b7c3f0b38b7fb14dd4104da93ebced5f1a50dc0e834594bff6fbe1271"}, + {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, + {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, + {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, + {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, + {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, + {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, + {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, + {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, + {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"}, + {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"}, + {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"}, + {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"}, + {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, + {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, ] [[package]] name = "pyyaml" -version = "6.0" +version = "6.0.1" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.6" files = [ - {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, - {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, - {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, - {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, - {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, - {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, - {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, - {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, - {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, - {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, - {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, - {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, - {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, - {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, - {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, - {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, - {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, - {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, + {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, ] [[package]] name = "pyzmq" -version = "24.0.1" +version = "25.1.1" description = "Python bindings for 0MQ" optional = false python-versions = ">=3.6" files = [ - {file = "pyzmq-24.0.1-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:28b119ba97129d3001673a697b7cce47fe6de1f7255d104c2f01108a5179a066"}, - {file = "pyzmq-24.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bcbebd369493d68162cddb74a9c1fcebd139dfbb7ddb23d8f8e43e6c87bac3a6"}, - {file = "pyzmq-24.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae61446166983c663cee42c852ed63899e43e484abf080089f771df4b9d272ef"}, - {file = "pyzmq-24.0.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:87f7ac99b15270db8d53f28c3c7b968612993a90a5cf359da354efe96f5372b4"}, - {file = "pyzmq-24.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9dca7c3956b03b7663fac4d150f5e6d4f6f38b2462c1e9afd83bcf7019f17913"}, - {file = "pyzmq-24.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8c78bfe20d4c890cb5580a3b9290f700c570e167d4cdcc55feec07030297a5e3"}, - {file = "pyzmq-24.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:48f721f070726cd2a6e44f3c33f8ee4b24188e4b816e6dd8ba542c8c3bb5b246"}, - {file = "pyzmq-24.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:afe1f3bc486d0ce40abb0a0c9adb39aed3bbac36ebdc596487b0cceba55c21c1"}, - {file = "pyzmq-24.0.1-cp310-cp310-win32.whl", hash = "sha256:3e6192dbcefaaa52ed81be88525a54a445f4b4fe2fffcae7fe40ebb58bd06bfd"}, - {file = "pyzmq-24.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:86de64468cad9c6d269f32a6390e210ca5ada568c7a55de8e681ca3b897bb340"}, - {file = "pyzmq-24.0.1-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:838812c65ed5f7c2bd11f7b098d2e5d01685a3f6d1f82849423b570bae698c00"}, - {file = "pyzmq-24.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dfb992dbcd88d8254471760879d48fb20836d91baa90f181c957122f9592b3dc"}, - {file = "pyzmq-24.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7abddb2bd5489d30ffeb4b93a428130886c171b4d355ccd226e83254fcb6b9ef"}, - {file = "pyzmq-24.0.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:94010bd61bc168c103a5b3b0f56ed3b616688192db7cd5b1d626e49f28ff51b3"}, - {file = "pyzmq-24.0.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8242543c522d84d033fe79be04cb559b80d7eb98ad81b137ff7e0a9020f00ace"}, - {file = "pyzmq-24.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ccb94342d13e3bf3ffa6e62f95b5e3f0bc6bfa94558cb37f4b3d09d6feb536ff"}, - {file = "pyzmq-24.0.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6640f83df0ae4ae1104d4c62b77e9ef39be85ebe53f636388707d532bee2b7b8"}, - {file = "pyzmq-24.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a180dbd5ea5d47c2d3b716d5c19cc3fb162d1c8db93b21a1295d69585bfddac1"}, - {file = "pyzmq-24.0.1-cp311-cp311-win32.whl", hash = "sha256:624321120f7e60336be8ec74a172ae7fba5c3ed5bf787cc85f7e9986c9e0ebc2"}, - {file = "pyzmq-24.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:1724117bae69e091309ffb8255412c4651d3f6355560d9af312d547f6c5bc8b8"}, - {file = "pyzmq-24.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:15975747462ec49fdc863af906bab87c43b2491403ab37a6d88410635786b0f4"}, - {file = "pyzmq-24.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b947e264f0e77d30dcbccbb00f49f900b204b922eb0c3a9f0afd61aaa1cedc3d"}, - {file = "pyzmq-24.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0ec91f1bad66f3ee8c6deb65fa1fe418e8ad803efedd69c35f3b5502f43bd1dc"}, - {file = "pyzmq-24.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:db03704b3506455d86ec72c3358a779e9b1d07b61220dfb43702b7b668edcd0d"}, - {file = "pyzmq-24.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:e7e66b4e403c2836ac74f26c4b65d8ac0ca1eef41dfcac2d013b7482befaad83"}, - {file = "pyzmq-24.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:7a23ccc1083c260fa9685c93e3b170baba45aeed4b524deb3f426b0c40c11639"}, - {file = "pyzmq-24.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:fa0ae3275ef706c0309556061185dd0e4c4cd3b7d6f67ae617e4e677c7a41e2e"}, - {file = "pyzmq-24.0.1-cp36-cp36m-win32.whl", hash = "sha256:f01de4ec083daebf210531e2cca3bdb1608dbbbe00a9723e261d92087a1f6ebc"}, - {file = "pyzmq-24.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:de4217b9eb8b541cf2b7fde4401ce9d9a411cc0af85d410f9d6f4333f43640be"}, - {file = "pyzmq-24.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:78068e8678ca023594e4a0ab558905c1033b2d3e806a0ad9e3094e231e115a33"}, - {file = "pyzmq-24.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77c2713faf25a953c69cf0f723d1b7dd83827b0834e6c41e3fb3bbc6765914a1"}, - {file = "pyzmq-24.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8bb4af15f305056e95ca1bd086239b9ebc6ad55e9f49076d27d80027f72752f6"}, - {file = "pyzmq-24.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:0f14cffd32e9c4c73da66db97853a6aeceaac34acdc0fae9e5bbc9370281864c"}, - {file = "pyzmq-24.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0108358dab8c6b27ff6b985c2af4b12665c1bc659648284153ee501000f5c107"}, - {file = "pyzmq-24.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:d66689e840e75221b0b290b0befa86f059fb35e1ee6443bce51516d4d61b6b99"}, - {file = "pyzmq-24.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ae08ac90aa8fa14caafc7a6251bd218bf6dac518b7bff09caaa5e781119ba3f2"}, - {file = "pyzmq-24.0.1-cp37-cp37m-win32.whl", hash = "sha256:8421aa8c9b45ea608c205db9e1c0c855c7e54d0e9c2c2f337ce024f6843cab3b"}, - {file = "pyzmq-24.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:54d8b9c5e288362ec8595c1d98666d36f2070fd0c2f76e2b3c60fbad9bd76227"}, - {file = "pyzmq-24.0.1-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:acbd0a6d61cc954b9f535daaa9ec26b0a60a0d4353c5f7c1438ebc88a359a47e"}, - {file = "pyzmq-24.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:47b11a729d61a47df56346283a4a800fa379ae6a85870d5a2e1e4956c828eedc"}, - {file = "pyzmq-24.0.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:abe6eb10122f0d746a0d510c2039ae8edb27bc9af29f6d1b05a66cc2401353ff"}, - {file = "pyzmq-24.0.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:07bec1a1b22dacf718f2c0e71b49600bb6a31a88f06527dfd0b5aababe3fa3f7"}, - {file = "pyzmq-24.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0d945a85b70da97ae86113faf9f1b9294efe66bd4a5d6f82f2676d567338b66"}, - {file = "pyzmq-24.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1b7928bb7580736ffac5baf814097be342ba08d3cfdfb48e52773ec959572287"}, - {file = "pyzmq-24.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b946da90dc2799bcafa682692c1d2139b2a96ec3c24fa9fc6f5b0da782675330"}, - {file = "pyzmq-24.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c8840f064b1fb377cffd3efeaad2b190c14d4c8da02316dae07571252d20b31f"}, - {file = "pyzmq-24.0.1-cp38-cp38-win32.whl", hash = "sha256:4854f9edc5208f63f0841c0c667260ae8d6846cfa233c479e29fdc85d42ebd58"}, - {file = "pyzmq-24.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:42d4f97b9795a7aafa152a36fe2ad44549b83a743fd3e77011136def512e6c2a"}, - {file = "pyzmq-24.0.1-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:52afb0ac962963fff30cf1be775bc51ae083ef4c1e354266ab20e5382057dd62"}, - {file = "pyzmq-24.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8bad8210ad4df68c44ff3685cca3cda448ee46e20d13edcff8909eba6ec01ca4"}, - {file = "pyzmq-24.0.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dabf1a05318d95b1537fd61d9330ef4313ea1216eea128a17615038859da3b3b"}, - {file = "pyzmq-24.0.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5bd3d7dfd9cd058eb68d9a905dec854f86649f64d4ddf21f3ec289341386c44b"}, - {file = "pyzmq-24.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8012bce6836d3f20a6c9599f81dfa945f433dab4dbd0c4917a6fb1f998ab33d"}, - {file = "pyzmq-24.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c31805d2c8ade9b11feca4674eee2b9cce1fec3e8ddb7bbdd961a09dc76a80ea"}, - {file = "pyzmq-24.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:3104f4b084ad5d9c0cb87445cc8cfd96bba710bef4a66c2674910127044df209"}, - {file = "pyzmq-24.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:df0841f94928f8af9c7a1f0aaaffba1fb74607af023a152f59379c01c53aee58"}, - {file = "pyzmq-24.0.1-cp39-cp39-win32.whl", hash = "sha256:a435ef8a3bd95c8a2d316d6e0ff70d0db524f6037411652803e118871d703333"}, - {file = "pyzmq-24.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:2032d9cb994ce3b4cba2b8dfae08c7e25bc14ba484c770d4d3be33c27de8c45b"}, - {file = "pyzmq-24.0.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bb5635c851eef3a7a54becde6da99485eecf7d068bd885ac8e6d173c4ecd68b0"}, - {file = "pyzmq-24.0.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:83ea1a398f192957cb986d9206ce229efe0ee75e3c6635baff53ddf39bd718d5"}, - {file = "pyzmq-24.0.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:941fab0073f0a54dc33d1a0460cb04e0d85893cb0c5e1476c785000f8b359409"}, - {file = "pyzmq-24.0.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e8f482c44ccb5884bf3f638f29bea0f8dc68c97e38b2061769c4cb697f6140d"}, - {file = "pyzmq-24.0.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:613010b5d17906c4367609e6f52e9a2595e35d5cc27d36ff3f1b6fa6e954d944"}, - {file = "pyzmq-24.0.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:65c94410b5a8355cfcf12fd600a313efee46ce96a09e911ea92cf2acf6708804"}, - {file = "pyzmq-24.0.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:20e7eeb1166087db636c06cae04a1ef59298627f56fb17da10528ab52a14c87f"}, - {file = "pyzmq-24.0.1-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a2712aee7b3834ace51738c15d9ee152cc5a98dc7d57dd93300461b792ab7b43"}, - {file = "pyzmq-24.0.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a7c280185c4da99e0cc06c63bdf91f5b0b71deb70d8717f0ab870a43e376db8"}, - {file = "pyzmq-24.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:858375573c9225cc8e5b49bfac846a77b696b8d5e815711b8d4ba3141e6e8879"}, - {file = "pyzmq-24.0.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:80093b595921eed1a2cead546a683b9e2ae7f4a4592bb2ab22f70d30174f003a"}, - {file = "pyzmq-24.0.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f3f3154fde2b1ff3aa7b4f9326347ebc89c8ef425ca1db8f665175e6d3bd42f"}, - {file = "pyzmq-24.0.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abb756147314430bee5d10919b8493c0ccb109ddb7f5dfd2fcd7441266a25b75"}, - {file = "pyzmq-24.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44e706bac34e9f50779cb8c39f10b53a4d15aebb97235643d3112ac20bd577b4"}, - {file = "pyzmq-24.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:687700f8371643916a1d2c61f3fdaa630407dd205c38afff936545d7b7466066"}, - {file = "pyzmq-24.0.1.tar.gz", hash = "sha256:216f5d7dbb67166759e59b0479bca82b8acf9bed6015b526b8eb10143fb08e77"}, + {file = "pyzmq-25.1.1-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:381469297409c5adf9a0e884c5eb5186ed33137badcbbb0560b86e910a2f1e76"}, + {file = "pyzmq-25.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:955215ed0604dac5b01907424dfa28b40f2b2292d6493445dd34d0dfa72586a8"}, + {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:985bbb1316192b98f32e25e7b9958088431d853ac63aca1d2c236f40afb17c83"}, + {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:afea96f64efa98df4da6958bae37f1cbea7932c35878b185e5982821bc883369"}, + {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76705c9325d72a81155bb6ab48d4312e0032bf045fb0754889133200f7a0d849"}, + {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:77a41c26205d2353a4c94d02be51d6cbdf63c06fbc1295ea57dad7e2d3381b71"}, + {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:12720a53e61c3b99d87262294e2b375c915fea93c31fc2336898c26d7aed34cd"}, + {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:57459b68e5cd85b0be8184382cefd91959cafe79ae019e6b1ae6e2ba8a12cda7"}, + {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:292fe3fc5ad4a75bc8df0dfaee7d0babe8b1f4ceb596437213821f761b4589f9"}, + {file = "pyzmq-25.1.1-cp310-cp310-win32.whl", hash = "sha256:35b5ab8c28978fbbb86ea54958cd89f5176ce747c1fb3d87356cf698048a7790"}, + {file = "pyzmq-25.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:11baebdd5fc5b475d484195e49bae2dc64b94a5208f7c89954e9e354fc609d8f"}, + {file = "pyzmq-25.1.1-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:d20a0ddb3e989e8807d83225a27e5c2eb2260eaa851532086e9e0fa0d5287d83"}, + {file = "pyzmq-25.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e1c1be77bc5fb77d923850f82e55a928f8638f64a61f00ff18a67c7404faf008"}, + {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d89528b4943d27029a2818f847c10c2cecc79fa9590f3cb1860459a5be7933eb"}, + {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:90f26dc6d5f241ba358bef79be9ce06de58d477ca8485e3291675436d3827cf8"}, + {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2b92812bd214018e50b6380ea3ac0c8bb01ac07fcc14c5f86a5bb25e74026e9"}, + {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:2f957ce63d13c28730f7fd6b72333814221c84ca2421298f66e5143f81c9f91f"}, + {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:047a640f5c9c6ade7b1cc6680a0e28c9dd5a0825135acbd3569cc96ea00b2505"}, + {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7f7e58effd14b641c5e4dec8c7dab02fb67a13df90329e61c869b9cc607ef752"}, + {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c2910967e6ab16bf6fbeb1f771c89a7050947221ae12a5b0b60f3bca2ee19bca"}, + {file = "pyzmq-25.1.1-cp311-cp311-win32.whl", hash = "sha256:76c1c8efb3ca3a1818b837aea423ff8a07bbf7aafe9f2f6582b61a0458b1a329"}, + {file = "pyzmq-25.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:44e58a0554b21fc662f2712814a746635ed668d0fbc98b7cb9d74cb798d202e6"}, + {file = "pyzmq-25.1.1-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:e1ffa1c924e8c72778b9ccd386a7067cddf626884fd8277f503c48bb5f51c762"}, + {file = "pyzmq-25.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1af379b33ef33757224da93e9da62e6471cf4a66d10078cf32bae8127d3d0d4a"}, + {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cff084c6933680d1f8b2f3b4ff5bbb88538a4aac00d199ac13f49d0698727ecb"}, + {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2400a94f7dd9cb20cd012951a0cbf8249e3d554c63a9c0cdfd5cbb6c01d2dec"}, + {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d81f1ddae3858b8299d1da72dd7d19dd36aab654c19671aa8a7e7fb02f6638a"}, + {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:255ca2b219f9e5a3a9ef3081512e1358bd4760ce77828e1028b818ff5610b87b"}, + {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a882ac0a351288dd18ecae3326b8a49d10c61a68b01419f3a0b9a306190baf69"}, + {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:724c292bb26365659fc434e9567b3f1adbdb5e8d640c936ed901f49e03e5d32e"}, + {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ca1ed0bb2d850aa8471387882247c68f1e62a4af0ce9c8a1dbe0d2bf69e41fb"}, + {file = "pyzmq-25.1.1-cp312-cp312-win32.whl", hash = "sha256:b3451108ab861040754fa5208bca4a5496c65875710f76789a9ad27c801a0075"}, + {file = "pyzmq-25.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:eadbefd5e92ef8a345f0525b5cfd01cf4e4cc651a2cffb8f23c0dd184975d787"}, + {file = "pyzmq-25.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:db0b2af416ba735c6304c47f75d348f498b92952f5e3e8bff449336d2728795d"}, + {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7c133e93b405eb0d36fa430c94185bdd13c36204a8635470cccc200723c13bb"}, + {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:273bc3959bcbff3f48606b28229b4721716598d76b5aaea2b4a9d0ab454ec062"}, + {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cbc8df5c6a88ba5ae385d8930da02201165408dde8d8322072e3e5ddd4f68e22"}, + {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:18d43df3f2302d836f2a56f17e5663e398416e9dd74b205b179065e61f1a6edf"}, + {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:73461eed88a88c866656e08f89299720a38cb4e9d34ae6bf5df6f71102570f2e"}, + {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:34c850ce7976d19ebe7b9d4b9bb8c9dfc7aac336c0958e2651b88cbd46682123"}, + {file = "pyzmq-25.1.1-cp36-cp36m-win32.whl", hash = "sha256:d2045d6d9439a0078f2a34b57c7b18c4a6aef0bee37f22e4ec9f32456c852c71"}, + {file = "pyzmq-25.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:458dea649f2f02a0b244ae6aef8dc29325a2810aa26b07af8374dc2a9faf57e3"}, + {file = "pyzmq-25.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7cff25c5b315e63b07a36f0c2bab32c58eafbe57d0dce61b614ef4c76058c115"}, + {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1579413ae492b05de5a6174574f8c44c2b9b122a42015c5292afa4be2507f28"}, + {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3d0a409d3b28607cc427aa5c30a6f1e4452cc44e311f843e05edb28ab5e36da0"}, + {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:21eb4e609a154a57c520e3d5bfa0d97e49b6872ea057b7c85257b11e78068222"}, + {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:034239843541ef7a1aee0c7b2cb7f6aafffb005ede965ae9cbd49d5ff4ff73cf"}, + {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f8115e303280ba09f3898194791a153862cbf9eef722ad8f7f741987ee2a97c7"}, + {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1a5d26fe8f32f137e784f768143728438877d69a586ddeaad898558dc971a5ae"}, + {file = "pyzmq-25.1.1-cp37-cp37m-win32.whl", hash = "sha256:f32260e556a983bc5c7ed588d04c942c9a8f9c2e99213fec11a031e316874c7e"}, + {file = "pyzmq-25.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:abf34e43c531bbb510ae7e8f5b2b1f2a8ab93219510e2b287a944432fad135f3"}, + {file = "pyzmq-25.1.1-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:87e34f31ca8f168c56d6fbf99692cc8d3b445abb5bfd08c229ae992d7547a92a"}, + {file = "pyzmq-25.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c9c6c9b2c2f80747a98f34ef491c4d7b1a8d4853937bb1492774992a120f475d"}, + {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5619f3f5a4db5dbb572b095ea3cb5cc035335159d9da950830c9c4db2fbb6995"}, + {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5a34d2395073ef862b4032343cf0c32a712f3ab49d7ec4f42c9661e0294d106f"}, + {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25f0e6b78220aba09815cd1f3a32b9c7cb3e02cb846d1cfc526b6595f6046618"}, + {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3669cf8ee3520c2f13b2e0351c41fea919852b220988d2049249db10046a7afb"}, + {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2d163a18819277e49911f7461567bda923461c50b19d169a062536fffe7cd9d2"}, + {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:df27ffddff4190667d40de7beba4a950b5ce78fe28a7dcc41d6f8a700a80a3c0"}, + {file = "pyzmq-25.1.1-cp38-cp38-win32.whl", hash = "sha256:a382372898a07479bd34bda781008e4a954ed8750f17891e794521c3e21c2e1c"}, + {file = "pyzmq-25.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:52533489f28d62eb1258a965f2aba28a82aa747202c8fa5a1c7a43b5db0e85c1"}, + {file = "pyzmq-25.1.1-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:03b3f49b57264909aacd0741892f2aecf2f51fb053e7d8ac6767f6c700832f45"}, + {file = "pyzmq-25.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:330f9e188d0d89080cde66dc7470f57d1926ff2fb5576227f14d5be7ab30b9fa"}, + {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2ca57a5be0389f2a65e6d3bb2962a971688cbdd30b4c0bd188c99e39c234f414"}, + {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d457aed310f2670f59cc5b57dcfced452aeeed77f9da2b9763616bd57e4dbaae"}, + {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c56d748ea50215abef7030c72b60dd723ed5b5c7e65e7bc2504e77843631c1a6"}, + {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:8f03d3f0d01cb5a018debeb412441996a517b11c5c17ab2001aa0597c6d6882c"}, + {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:820c4a08195a681252f46926de10e29b6bbf3e17b30037bd4250d72dd3ddaab8"}, + {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:17ef5f01d25b67ca8f98120d5fa1d21efe9611604e8eb03a5147360f517dd1e2"}, + {file = "pyzmq-25.1.1-cp39-cp39-win32.whl", hash = "sha256:04ccbed567171579ec2cebb9c8a3e30801723c575601f9a990ab25bcac6b51e2"}, + {file = "pyzmq-25.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:e61f091c3ba0c3578411ef505992d356a812fb200643eab27f4f70eed34a29ef"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ade6d25bb29c4555d718ac6d1443a7386595528c33d6b133b258f65f963bb0f6"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0c95ddd4f6e9fca4e9e3afaa4f9df8552f0ba5d1004e89ef0a68e1f1f9807c7"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48e466162a24daf86f6b5ca72444d2bf39a5e58da5f96370078be67c67adc978"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abc719161780932c4e11aaebb203be3d6acc6b38d2f26c0f523b5b59d2fc1996"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1ccf825981640b8c34ae54231b7ed00271822ea1c6d8ba1090ebd4943759abf5"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c2f20ce161ebdb0091a10c9ca0372e023ce24980d0e1f810f519da6f79c60800"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:deee9ca4727f53464daf089536e68b13e6104e84a37820a88b0a057b97bba2d2"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:aa8d6cdc8b8aa19ceb319aaa2b660cdaccc533ec477eeb1309e2a291eaacc43a"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:019e59ef5c5256a2c7378f2fb8560fc2a9ff1d315755204295b2eab96b254d0a"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:b9af3757495c1ee3b5c4e945c1df7be95562277c6e5bccc20a39aec50f826cd0"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:548d6482dc8aadbe7e79d1b5806585c8120bafa1ef841167bc9090522b610fa6"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:057e824b2aae50accc0f9a0570998adc021b372478a921506fddd6c02e60308e"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2243700cc5548cff20963f0ca92d3e5e436394375ab8a354bbea2b12911b20b0"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79986f3b4af059777111409ee517da24a529bdbd46da578b33f25580adcff728"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:11d58723d44d6ed4dd677c5615b2ffb19d5c426636345567d6af82be4dff8a55"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:49d238cf4b69652257db66d0c623cd3e09b5d2e9576b56bc067a396133a00d4a"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fedbdc753827cf014c01dbbee9c3be17e5a208dcd1bf8641ce2cd29580d1f0d4"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc16ac425cc927d0a57d242589f87ee093884ea4804c05a13834d07c20db203c"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11c1d2aed9079c6b0c9550a7257a836b4a637feb334904610f06d70eb44c56d2"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e8a701123029cc240cea61dd2d16ad57cab4691804143ce80ecd9286b464d180"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:61706a6b6c24bdece85ff177fec393545a3191eeda35b07aaa1458a027ad1304"}, + {file = "pyzmq-25.1.1.tar.gz", hash = "sha256:259c22485b71abacdfa8bf79720cd7bcf4b9d128b30ea554f01ae71fdbfdaa23"}, ] [package.dependencies] cffi = {version = "*", markers = "implementation_name == \"pypy\""} -py = {version = "*", markers = "implementation_name == \"pypy\""} + +[[package]] +name = "reportlab" +version = "4.0.4" +description = "The Reportlab Toolkit" +optional = false +python-versions = ">=3.7,<4" +files = [ + {file = "reportlab-4.0.4-py3-none-any.whl", hash = "sha256:3dcda79ce04baf70721e2ec54854722644262cac2feec3d5c4c5e77015504cb0"}, + {file = "reportlab-4.0.4.tar.gz", hash = "sha256:7f70b3b56aff5f11cb4136c51a0f5a56fe6e4c8fbbac7b903076db99a8ef31c1"}, +] + +[package.dependencies] +pillow = ">=9.0.0" + +[package.extras] +accel = ["rl-accel (>=0.9.0,<1.1)"] +pycairo = ["freetype-py (>=2.3.0,<2.4)", "rlPyCairo (>=0.2.0,<1)"] +renderpm = ["rl-renderPM (>=4.0.3,<4.1)"] [[package]] name = "requests" -version = "2.28.1" +version = "2.31.0" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.7, <4" +python-versions = ">=3.7" files = [ - {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"}, - {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"}, + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, ] [package.dependencies] certifi = ">=2017.4.17" -charset-normalizer = ">=2,<3" +charset-normalizer = ">=2,<4" idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<1.27" +urllib3 = ">=1.21.1,<3" [package.extras] socks = ["PySocks (>=1.5.6,!=1.5.7)"] @@ -2051,13 +2343,13 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "requests-toolbelt" -version = "0.9.1" +version = "1.0.0" description = "A utility belt for advanced users of python-requests" optional = false -python-versions = "*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ - {file = "requests-toolbelt-0.9.1.tar.gz", hash = "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0"}, - {file = "requests_toolbelt-0.9.1-py2.py3-none-any.whl", hash = "sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f"}, + {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, + {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, ] [package.dependencies] @@ -2079,18 +2371,18 @@ pyasn1 = ">=0.1.3" [[package]] name = "setuptools" -version = "65.6.3" +version = "68.1.2" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "setuptools-65.6.3-py3-none-any.whl", hash = "sha256:57f6f22bde4e042978bcd50176fdb381d7c21a9efa4041202288d3737a0c6a54"}, - {file = "setuptools-65.6.3.tar.gz", hash = "sha256:a7620757bf984b58deaf32fc8a4577a9bbc0850cf92c20e1ce41c38c19e5fb75"}, + {file = "setuptools-68.1.2-py3-none-any.whl", hash = "sha256:3d8083eed2d13afc9426f227b24fd1659489ec107c0e86cec2ffdde5c92e790b"}, + {file = "setuptools-68.1.2.tar.gz", hash = "sha256:3d4dfa6d95f1b101d695a6160a7626e15583af71a5f52176efa5d39a054d475d"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5,<=7.1.2)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] @@ -2134,87 +2426,99 @@ files = [ [[package]] name = "sqlalchemy" -version = "1.4.44" +version = "2.0.21" description = "Database Abstraction Library" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-1.4.44-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:da60b98b0f6f0df9fbf8b72d67d13b73aa8091923a48af79a951d4088530a239"}, - {file = "SQLAlchemy-1.4.44-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:95f4f8d62589755b507218f2e3189475a4c1f5cc9db2aec772071a7dc6cd5726"}, - {file = "SQLAlchemy-1.4.44-cp27-cp27m-win32.whl", hash = "sha256:afd1ac99179d1864a68c06b31263a08ea25a49df94e272712eb2824ef151e294"}, - {file = "SQLAlchemy-1.4.44-cp27-cp27m-win_amd64.whl", hash = "sha256:f8e5443295b218b08bef8eb85d31b214d184b3690d99a33b7bd8e5591e2b0aa1"}, - {file = "SQLAlchemy-1.4.44-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:53f90a2374f60e703c94118d21533765412da8225ba98659de7dd7998641ab17"}, - {file = "SQLAlchemy-1.4.44-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:65a0ad931944fcb0be12a8e0ac322dbd3ecf17c53f088bc10b6da8f0caac287b"}, - {file = "SQLAlchemy-1.4.44-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:595b185041a4dc5c685283ea98c2f67bbfa47bb28e4a4f5b27ebf40684e7a9f8"}, - {file = "SQLAlchemy-1.4.44-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:80ead36fb1d676cc019586ffdc21c7e906ce4bf243fe4021e4973dae332b6038"}, - {file = "SQLAlchemy-1.4.44-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68e0cd5d32a32c4395168d42f2fefbb03b817ead3a8f3704b8bd5697c0b26c24"}, - {file = "SQLAlchemy-1.4.44-cp310-cp310-win32.whl", hash = "sha256:ae1ed1ebc407d2f66c6f0ec44ef7d56e3f455859df5494680e2cf89dad8e3ae0"}, - {file = "SQLAlchemy-1.4.44-cp310-cp310-win_amd64.whl", hash = "sha256:6f0ea4d7348feb5e5d0bf317aace92e28398fa9a6e38b7be9ec1f31aad4a8039"}, - {file = "SQLAlchemy-1.4.44-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f5e8ed9cde48b76318ab989deeddc48f833d2a6a7b7c393c49b704f67dedf01d"}, - {file = "SQLAlchemy-1.4.44-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c857676d810ca196be73c98eb839125d6fa849bfa3589be06201a6517f9961c"}, - {file = "SQLAlchemy-1.4.44-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c56e6899fa6e767e4be5d106941804a4201c5cb9620a409c0b80448ec70b656"}, - {file = "SQLAlchemy-1.4.44-cp311-cp311-win32.whl", hash = "sha256:c46322354c58d4dc039a2c982d28284330f8919f31206894281f4b595b9d8dbe"}, - {file = "SQLAlchemy-1.4.44-cp311-cp311-win_amd64.whl", hash = "sha256:7313e4acebb9ae88dbde14a8a177467a7625b7449306c03a3f9f309b30e163d0"}, - {file = "SQLAlchemy-1.4.44-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:17aee7bfcef7bf0dea92f10e5dfdd67418dcf6fe0759f520e168b605855c003e"}, - {file = "SQLAlchemy-1.4.44-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9470633395e5f24d6741b4c8a6e905bce405a28cf417bba4ccbaadf3dab0111d"}, - {file = "SQLAlchemy-1.4.44-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:393f51a09778e8984d735b59a810731394308b4038acdb1635397c2865dae2b6"}, - {file = "SQLAlchemy-1.4.44-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c7e3b9e01fdbe1ce3a165cc7e1ff52b24813ee79c6df6dee0d1e13888a97817e"}, - {file = "SQLAlchemy-1.4.44-cp36-cp36m-win32.whl", hash = "sha256:6a06c2506c41926d2769f7968759995f2505e31c5b5a0821e43ca5a3ddb0e8ae"}, - {file = "SQLAlchemy-1.4.44-cp36-cp36m-win_amd64.whl", hash = "sha256:3ca21b35b714ce36f4b8d1ee8d15f149db8eb43a472cf71600bf18dae32286e7"}, - {file = "SQLAlchemy-1.4.44-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:3cbdbed8cdcae0f83640a9c44fa02b45a6c61e149c58d45a63c9581aba62850f"}, - {file = "SQLAlchemy-1.4.44-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a22208c1982f1fe2ae82e5e4c3d4a6f2445a7a0d65fb7983a3d7cbbe3983f5a4"}, - {file = "SQLAlchemy-1.4.44-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d3b9ac11f36ab9a726097fba7c7f6384f0129aedb017f1d4d1d4fce9052a1320"}, - {file = "SQLAlchemy-1.4.44-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d654870a66027af3a26df1372cf7f002e161c6768ebe4c9c6fdc0da331cb5173"}, - {file = "SQLAlchemy-1.4.44-cp37-cp37m-win32.whl", hash = "sha256:0be9b479c5806cece01f1581726573a8d6515f8404e082c375b922c45cfc2a7b"}, - {file = "SQLAlchemy-1.4.44-cp37-cp37m-win_amd64.whl", hash = "sha256:3eba07f740488c3a125f17c092a81eeae24a6c7ec32ac9dbc52bf7afaf0c4f16"}, - {file = "SQLAlchemy-1.4.44-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:ad5f966623905ee33694680dda1b735544c99c7638f216045d21546d3d8c6f5b"}, - {file = "SQLAlchemy-1.4.44-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f68eab46649504eb95be36ca529aea16cd199f080726c28cbdbcbf23d20b2a2"}, - {file = "SQLAlchemy-1.4.44-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:21f3df74a0ab39e1255e94613556e33c1dc3b454059fe0b365ec3bbb9ed82e4a"}, - {file = "SQLAlchemy-1.4.44-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8080bc51a775627865e0f1dbfc0040ff4ace685f187f6036837e1727ba2ed10"}, - {file = "SQLAlchemy-1.4.44-cp38-cp38-win32.whl", hash = "sha256:b6a337a2643a41476fb6262059b8740f4b9a2ec29bf00ffb18c18c080f6e0aed"}, - {file = "SQLAlchemy-1.4.44-cp38-cp38-win_amd64.whl", hash = "sha256:b737fbeb2f78926d1f59964feb287bbbd050e7904766f87c8ce5cfb86e6d840c"}, - {file = "SQLAlchemy-1.4.44-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:c9aa372b295a36771cffc226b6517df3011a7d146ac22d19fa6a75f1cdf9d7e6"}, - {file = "SQLAlchemy-1.4.44-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:237067ba0ef45a518b64606e1807f7229969ad568288b110ed5f0ca714a3ed3a"}, - {file = "SQLAlchemy-1.4.44-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6d7e1b28342b45f19e3dea7873a9479e4a57e15095a575afca902e517fb89652"}, - {file = "SQLAlchemy-1.4.44-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94c0093678001f5d79f2dcbf3104c54d6c89e41ab50d619494c503a4d3f1aef2"}, - {file = "SQLAlchemy-1.4.44-cp39-cp39-win32.whl", hash = "sha256:7cf7c7adbf4417e3f46fc5a2dbf8395a5a69698217337086888f79700a12e93a"}, - {file = "SQLAlchemy-1.4.44-cp39-cp39-win_amd64.whl", hash = "sha256:d3b6d4588994da73567bb00af9d7224a16c8027865a8aab53ae9be83f9b7cbd1"}, - {file = "SQLAlchemy-1.4.44.tar.gz", hash = "sha256:2dda5f96719ae89b3ec0f1b79698d86eb9aecb1d54e990abb3fdd92c04b46a90"}, + {file = "SQLAlchemy-2.0.21-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1e7dc99b23e33c71d720c4ae37ebb095bebebbd31a24b7d99dfc4753d2803ede"}, + {file = "SQLAlchemy-2.0.21-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7f0c4ee579acfe6c994637527c386d1c22eb60bc1c1d36d940d8477e482095d4"}, + {file = "SQLAlchemy-2.0.21-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f7d57a7e140efe69ce2d7b057c3f9a595f98d0bbdfc23fd055efdfbaa46e3a5"}, + {file = "SQLAlchemy-2.0.21-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ca38746eac23dd7c20bec9278d2058c7ad662b2f1576e4c3dbfcd7c00cc48fa"}, + {file = "SQLAlchemy-2.0.21-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3cf229704074bce31f7f47d12883afee3b0a02bb233a0ba45ddbfe542939cca4"}, + {file = "SQLAlchemy-2.0.21-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fb87f763b5d04a82ae84ccff25554ffd903baafba6698e18ebaf32561f2fe4aa"}, + {file = "SQLAlchemy-2.0.21-cp310-cp310-win32.whl", hash = "sha256:89e274604abb1a7fd5c14867a412c9d49c08ccf6ce3e1e04fffc068b5b6499d4"}, + {file = "SQLAlchemy-2.0.21-cp310-cp310-win_amd64.whl", hash = "sha256:e36339a68126ffb708dc6d1948161cea2a9e85d7d7b0c54f6999853d70d44430"}, + {file = "SQLAlchemy-2.0.21-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bf8eebccc66829010f06fbd2b80095d7872991bfe8415098b9fe47deaaa58063"}, + {file = "SQLAlchemy-2.0.21-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b977bfce15afa53d9cf6a632482d7968477625f030d86a109f7bdfe8ce3c064a"}, + {file = "SQLAlchemy-2.0.21-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ff3dc2f60dbf82c9e599c2915db1526d65415be323464f84de8db3e361ba5b9"}, + {file = "SQLAlchemy-2.0.21-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44ac5c89b6896f4740e7091f4a0ff2e62881da80c239dd9408f84f75a293dae9"}, + {file = "SQLAlchemy-2.0.21-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:87bf91ebf15258c4701d71dcdd9c4ba39521fb6a37379ea68088ce8cd869b446"}, + {file = "SQLAlchemy-2.0.21-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b69f1f754d92eb1cc6b50938359dead36b96a1dcf11a8670bff65fd9b21a4b09"}, + {file = "SQLAlchemy-2.0.21-cp311-cp311-win32.whl", hash = "sha256:af520a730d523eab77d754f5cf44cc7dd7ad2d54907adeb3233177eeb22f271b"}, + {file = "SQLAlchemy-2.0.21-cp311-cp311-win_amd64.whl", hash = "sha256:141675dae56522126986fa4ca713739d00ed3a6f08f3c2eb92c39c6dfec463ce"}, + {file = "SQLAlchemy-2.0.21-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:56628ca27aa17b5890391ded4e385bf0480209726f198799b7e980c6bd473bd7"}, + {file = "SQLAlchemy-2.0.21-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:db726be58837fe5ac39859e0fa40baafe54c6d54c02aba1d47d25536170b690f"}, + {file = "SQLAlchemy-2.0.21-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7421c1bfdbb7214313919472307be650bd45c4dc2fcb317d64d078993de045b"}, + {file = "SQLAlchemy-2.0.21-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:632784f7a6f12cfa0e84bf2a5003b07660addccf5563c132cd23b7cc1d7371a9"}, + {file = "SQLAlchemy-2.0.21-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f6f7276cf26145a888f2182a98f204541b519d9ea358a65d82095d9c9e22f917"}, + {file = "SQLAlchemy-2.0.21-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2a1f7ffac934bc0ea717fa1596f938483fb8c402233f9b26679b4f7b38d6ab6e"}, + {file = "SQLAlchemy-2.0.21-cp312-cp312-win32.whl", hash = "sha256:bfece2f7cec502ec5f759bbc09ce711445372deeac3628f6fa1c16b7fb45b682"}, + {file = "SQLAlchemy-2.0.21-cp312-cp312-win_amd64.whl", hash = "sha256:526b869a0f4f000d8d8ee3409d0becca30ae73f494cbb48801da0129601f72c6"}, + {file = "SQLAlchemy-2.0.21-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7614f1eab4336df7dd6bee05bc974f2b02c38d3d0c78060c5faa4cd1ca2af3b8"}, + {file = "SQLAlchemy-2.0.21-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d59cb9e20d79686aa473e0302e4a82882d7118744d30bb1dfb62d3c47141b3ec"}, + {file = "SQLAlchemy-2.0.21-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a95aa0672e3065d43c8aa80080cdd5cc40fe92dc873749e6c1cf23914c4b83af"}, + {file = "SQLAlchemy-2.0.21-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8c323813963b2503e54d0944813cd479c10c636e3ee223bcbd7bd478bf53c178"}, + {file = "SQLAlchemy-2.0.21-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:419b1276b55925b5ac9b4c7044e999f1787c69761a3c9756dec6e5c225ceca01"}, + {file = "SQLAlchemy-2.0.21-cp37-cp37m-win32.whl", hash = "sha256:4615623a490e46be85fbaa6335f35cf80e61df0783240afe7d4f544778c315a9"}, + {file = "SQLAlchemy-2.0.21-cp37-cp37m-win_amd64.whl", hash = "sha256:cca720d05389ab1a5877ff05af96551e58ba65e8dc65582d849ac83ddde3e231"}, + {file = "SQLAlchemy-2.0.21-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b4eae01faee9f2b17f08885e3f047153ae0416648f8e8c8bd9bc677c5ce64be9"}, + {file = "SQLAlchemy-2.0.21-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3eb7c03fe1cd3255811cd4e74db1ab8dca22074d50cd8937edf4ef62d758cdf4"}, + {file = "SQLAlchemy-2.0.21-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2d494b6a2a2d05fb99f01b84cc9af9f5f93bf3e1e5dbdafe4bed0c2823584c1"}, + {file = "SQLAlchemy-2.0.21-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b19ae41ef26c01a987e49e37c77b9ad060c59f94d3b3efdfdbf4f3daaca7b5fe"}, + {file = "SQLAlchemy-2.0.21-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:fc6b15465fabccc94bf7e38777d665b6a4f95efd1725049d6184b3a39fd54880"}, + {file = "SQLAlchemy-2.0.21-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:014794b60d2021cc8ae0f91d4d0331fe92691ae5467a00841f7130fe877b678e"}, + {file = "SQLAlchemy-2.0.21-cp38-cp38-win32.whl", hash = "sha256:0268256a34806e5d1c8f7ee93277d7ea8cc8ae391f487213139018b6805aeaf6"}, + {file = "SQLAlchemy-2.0.21-cp38-cp38-win_amd64.whl", hash = "sha256:73c079e21d10ff2be54a4699f55865d4b275fd6c8bd5d90c5b1ef78ae0197301"}, + {file = "SQLAlchemy-2.0.21-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:785e2f2c1cb50d0a44e2cdeea5fd36b5bf2d79c481c10f3a88a8be4cfa2c4615"}, + {file = "SQLAlchemy-2.0.21-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c111cd40910ffcb615b33605fc8f8e22146aeb7933d06569ac90f219818345ef"}, + {file = "SQLAlchemy-2.0.21-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9cba4e7369de663611ce7460a34be48e999e0bbb1feb9130070f0685e9a6b66"}, + {file = "SQLAlchemy-2.0.21-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50a69067af86ec7f11a8e50ba85544657b1477aabf64fa447fd3736b5a0a4f67"}, + {file = "SQLAlchemy-2.0.21-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ccb99c3138c9bde118b51a289d90096a3791658da9aea1754667302ed6564f6e"}, + {file = "SQLAlchemy-2.0.21-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:513fd5b6513d37e985eb5b7ed89da5fd9e72354e3523980ef00d439bc549c9e9"}, + {file = "SQLAlchemy-2.0.21-cp39-cp39-win32.whl", hash = "sha256:f9fefd6298433b6e9188252f3bff53b9ff0443c8fde27298b8a2b19f6617eeb9"}, + {file = "SQLAlchemy-2.0.21-cp39-cp39-win_amd64.whl", hash = "sha256:2e617727fe4091cedb3e4409b39368f424934c7faa78171749f704b49b4bb4ce"}, + {file = "SQLAlchemy-2.0.21-py3-none-any.whl", hash = "sha256:ea7da25ee458d8f404b93eb073116156fd7d8c2a776d8311534851f28277b4ce"}, + {file = "SQLAlchemy-2.0.21.tar.gz", hash = "sha256:05b971ab1ac2994a14c56b35eaaa91f86ba080e9ad481b20d99d77f381bb6258"}, ] [package.dependencies] -greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"win32\" or platform_machine == \"WIN32\" or platform_machine == \"AMD64\" or platform_machine == \"amd64\" or platform_machine == \"x86_64\" or platform_machine == \"ppc64le\" or platform_machine == \"aarch64\")"} +greenlet = {version = "!=0.4.17", markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\""} +typing-extensions = ">=4.2.0" [package.extras] -aiomysql = ["aiomysql", "greenlet (!=0.4.17)"] +aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing-extensions (!=3.10.0.1)"] asyncio = ["greenlet (!=0.4.17)"] -asyncmy = ["asyncmy (>=0.2.3,!=0.2.4)", "greenlet (!=0.4.17)"] -mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2)"] +asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5)"] mssql = ["pyodbc"] mssql-pymssql = ["pymssql"] mssql-pyodbc = ["pyodbc"] -mypy = ["mypy (>=0.910)", "sqlalchemy2-stubs"] -mysql = ["mysqlclient (>=1.4.0)", "mysqlclient (>=1.4.0,<2)"] +mypy = ["mypy (>=0.910)"] +mysql = ["mysqlclient (>=1.4.0)"] mysql-connector = ["mysql-connector-python"] -oracle = ["cx-oracle (>=7)", "cx-oracle (>=7,<8)"] +oracle = ["cx-oracle (>=7)"] +oracle-oracledb = ["oracledb (>=1.0.1)"] postgresql = ["psycopg2 (>=2.7)"] postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] -postgresql-pg8000 = ["pg8000 (>=1.16.6,!=1.29.0)"] +postgresql-pg8000 = ["pg8000 (>=1.29.1)"] +postgresql-psycopg = ["psycopg (>=3.0.7)"] postgresql-psycopg2binary = ["psycopg2-binary"] postgresql-psycopg2cffi = ["psycopg2cffi"] -pymysql = ["pymysql", "pymysql (<1)"] +postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] +pymysql = ["pymysql"] sqlcipher = ["sqlcipher3-binary"] [[package]] name = "stack-data" -version = "0.6.1" +version = "0.6.2" description = "Extract data from python stack frames and tracebacks for informative displays" optional = false python-versions = "*" files = [ - {file = "stack_data-0.6.1-py3-none-any.whl", hash = "sha256:960cb054d6a1b2fdd9cbd529e365b3c163e8dabf1272e02cfe36b58403cff5c6"}, - {file = "stack_data-0.6.1.tar.gz", hash = "sha256:6c9a10eb5f342415fe085db551d673955611afb821551f554d91772415464315"}, + {file = "stack_data-0.6.2-py3-none-any.whl", hash = "sha256:cbb2a53eb64e5785878201a97ed7c7b94883f48b87bfb0bbe8b623c74679e4a8"}, + {file = "stack_data-0.6.2.tar.gz", hash = "sha256:32d2dd0376772d01b6cb9fc996f3c8b57a357089dec328ed4b6553d037eaf815"}, ] [package.dependencies] @@ -2255,160 +2559,157 @@ files = [ [[package]] name = "tokenize-rt" -version = "5.0.0" +version = "5.2.0" description = "A wrapper around the stdlib `tokenize` which roundtrips." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tokenize_rt-5.0.0-py2.py3-none-any.whl", hash = "sha256:c67772c662c6b3dc65edf66808577968fb10badfc2042e3027196bed4daf9e5a"}, - {file = "tokenize_rt-5.0.0.tar.gz", hash = "sha256:3160bc0c3e8491312d0485171dea861fc160a240f5f5766b72a1165408d10740"}, + {file = "tokenize_rt-5.2.0-py2.py3-none-any.whl", hash = "sha256:b79d41a65cfec71285433511b50271b05da3584a1da144a0752e9c621a285289"}, + {file = "tokenize_rt-5.2.0.tar.gz", hash = "sha256:9fe80f8a5c1edad2d3ede0f37481cc0cc1538a2f442c9c2f9e4feacd2792d054"}, ] [[package]] name = "tornado" -version = "6.2" +version = "6.3.3" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." optional = false -python-versions = ">= 3.7" +python-versions = ">= 3.8" files = [ - {file = "tornado-6.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:20f638fd8cc85f3cbae3c732326e96addff0a15e22d80f049e00121651e82e72"}, - {file = "tornado-6.2-cp37-abi3-macosx_10_9_x86_64.whl", hash = "sha256:87dcafae3e884462f90c90ecc200defe5e580a7fbbb4365eda7c7c1eb809ebc9"}, - {file = "tornado-6.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba09ef14ca9893954244fd872798b4ccb2367c165946ce2dd7376aebdde8e3ac"}, - {file = "tornado-6.2-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b8150f721c101abdef99073bf66d3903e292d851bee51910839831caba341a75"}, - {file = "tornado-6.2-cp37-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3a2f5999215a3a06a4fc218026cd84c61b8b2b40ac5296a6db1f1451ef04c1e"}, - {file = "tornado-6.2-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:5f8c52d219d4995388119af7ccaa0bcec289535747620116a58d830e7c25d8a8"}, - {file = "tornado-6.2-cp37-abi3-musllinux_1_1_i686.whl", hash = "sha256:6fdfabffd8dfcb6cf887428849d30cf19a3ea34c2c248461e1f7d718ad30b66b"}, - {file = "tornado-6.2-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:1d54d13ab8414ed44de07efecb97d4ef7c39f7438cf5e976ccd356bebb1b5fca"}, - {file = "tornado-6.2-cp37-abi3-win32.whl", hash = "sha256:5c87076709343557ef8032934ce5f637dbb552efa7b21d08e89ae7619ed0eb23"}, - {file = "tornado-6.2-cp37-abi3-win_amd64.whl", hash = "sha256:e5f923aa6a47e133d1cf87d60700889d7eae68988704e20c75fb2d65677a8e4b"}, - {file = "tornado-6.2.tar.gz", hash = "sha256:9b630419bde84ec666bfd7ea0a4cb2a8a651c2d5cccdbdd1972a0c859dfc3c13"}, + {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:502fba735c84450974fec147340016ad928d29f1e91f49be168c0a4c18181e1d"}, + {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:805d507b1f588320c26f7f097108eb4023bbaa984d63176d1652e184ba24270a"}, + {file = "tornado-6.3.3-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bd19ca6c16882e4d37368e0152f99c099bad93e0950ce55e71daed74045908f"}, + {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ac51f42808cca9b3613f51ffe2a965c8525cb1b00b7b2d56828b8045354f76a"}, + {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71a8db65160a3c55d61839b7302a9a400074c9c753040455494e2af74e2501f2"}, + {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:ceb917a50cd35882b57600709dd5421a418c29ddc852da8bcdab1f0db33406b0"}, + {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:7d01abc57ea0dbb51ddfed477dfe22719d376119844e33c661d873bf9c0e4a16"}, + {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:9dc4444c0defcd3929d5c1eb5706cbe1b116e762ff3e0deca8b715d14bf6ec17"}, + {file = "tornado-6.3.3-cp38-abi3-win32.whl", hash = "sha256:65ceca9500383fbdf33a98c0087cb975b2ef3bfb874cb35b8de8740cf7f41bd3"}, + {file = "tornado-6.3.3-cp38-abi3-win_amd64.whl", hash = "sha256:22d3c2fa10b5793da13c807e6fc38ff49a4f6e1e3868b0a6f4164768bb8e20f5"}, + {file = "tornado-6.3.3.tar.gz", hash = "sha256:e7d8db41c0181c80d76c982aacc442c0783a2c54d6400fe028954201a2e032fe"}, ] [[package]] name = "traitlets" -version = "5.5.0" -description = "" +version = "5.9.0" +description = "Traitlets Python configuration system" optional = false python-versions = ">=3.7" files = [ - {file = "traitlets-5.5.0-py3-none-any.whl", hash = "sha256:1201b2c9f76097195989cdf7f65db9897593b0dfd69e4ac96016661bb6f0d30f"}, - {file = "traitlets-5.5.0.tar.gz", hash = "sha256:b122f9ff2f2f6c1709dab289a05555be011c87828e911c0cf4074b85cb780a79"}, + {file = "traitlets-5.9.0-py3-none-any.whl", hash = "sha256:9e6ec080259b9a5940c797d58b613b5e31441c2257b87c2e795c5228ae80d2d8"}, + {file = "traitlets-5.9.0.tar.gz", hash = "sha256:f6cde21a9c68cf756af02035f72d5a723bf607e862e7be33ece505abf4a3bad9"}, ] [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["pre-commit", "pytest"] +test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"] [[package]] name = "typing-extensions" -version = "4.4.0" +version = "4.7.1" description = "Backported and Experimental Type Hints for Python 3.7+" optional = false python-versions = ">=3.7" files = [ - {file = "typing_extensions-4.4.0-py3-none-any.whl", hash = "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"}, - {file = "typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"}, + {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, + {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, ] [[package]] name = "ujson" -version = "5.7.0" +version = "5.8.0" description = "Ultra fast JSON encoder and decoder for Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "ujson-5.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5eba5e69e4361ac3a311cf44fa71bc619361b6e0626768a494771aacd1c2f09b"}, - {file = "ujson-5.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aae4d9e1b4c7b61780f0a006c897a4a1904f862fdab1abb3ea8f45bd11aa58f3"}, - {file = "ujson-5.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2e43ccdba1cb5c6d3448eadf6fc0dae7be6c77e357a3abc968d1b44e265866d"}, - {file = "ujson-5.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54384ce4920a6d35fa9ea8e580bc6d359e3eb961fa7e43f46c78e3ed162d56ff"}, - {file = "ujson-5.7.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24ad1aa7fc4e4caa41d3d343512ce68e41411fb92adf7f434a4d4b3749dc8f58"}, - {file = "ujson-5.7.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:afff311e9f065a8f03c3753db7011bae7beb73a66189c7ea5fcb0456b7041ea4"}, - {file = "ujson-5.7.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6e80f0d03e7e8646fc3d79ed2d875cebd4c83846e129737fdc4c2532dbd43d9e"}, - {file = "ujson-5.7.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:137831d8a0db302fb6828ee21c67ad63ac537bddc4376e1aab1c8573756ee21c"}, - {file = "ujson-5.7.0-cp310-cp310-win32.whl", hash = "sha256:7df3fd35ebc14dafeea031038a99232b32f53fa4c3ecddb8bed132a43eefb8ad"}, - {file = "ujson-5.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:af4639f684f425177d09ae409c07602c4096a6287027469157bfb6f83e01448b"}, - {file = "ujson-5.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9b0f2680ce8a70f77f5d70aaf3f013d53e6af6d7058727a35d8ceb4a71cdd4e9"}, - {file = "ujson-5.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:67a19fd8e7d8cc58a169bea99fed5666023adf707a536d8f7b0a3c51dd498abf"}, - {file = "ujson-5.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6abb8e6d8f1ae72f0ed18287245f5b6d40094e2656d1eab6d99d666361514074"}, - {file = "ujson-5.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8cd622c069368d5074bd93817b31bdb02f8d818e57c29e206f10a1f9c6337dd"}, - {file = "ujson-5.7.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:14f9082669f90e18e64792b3fd0bf19f2b15e7fe467534a35ea4b53f3bf4b755"}, - {file = "ujson-5.7.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d7ff6ebb43bc81b057724e89550b13c9a30eda0f29c2f506f8b009895438f5a6"}, - {file = "ujson-5.7.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f7f241488879d91a136b299e0c4ce091996c684a53775e63bb442d1a8e9ae22a"}, - {file = "ujson-5.7.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5593263a7fcfb934107444bcfba9dde8145b282de0ee9f61e285e59a916dda0f"}, - {file = "ujson-5.7.0-cp311-cp311-win32.whl", hash = "sha256:26c2b32b489c393106e9cb68d0a02e1a7b9d05a07429d875c46b94ee8405bdb7"}, - {file = "ujson-5.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:ed24406454bb5a31df18f0a423ae14beb27b28cdfa34f6268e7ebddf23da807e"}, - {file = "ujson-5.7.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:18679484e3bf9926342b1c43a3bd640f93a9eeeba19ef3d21993af7b0c44785d"}, - {file = "ujson-5.7.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ee295761e1c6c30400641f0a20d381633d7622633cdf83a194f3c876a0e4b7e"}, - {file = "ujson-5.7.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b738282e12a05f400b291966630a98d622da0938caa4bc93cf65adb5f4281c60"}, - {file = "ujson-5.7.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00343501dbaa5172e78ef0e37f9ebd08040110e11c12420ff7c1f9f0332d939e"}, - {file = "ujson-5.7.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c0d1f7c3908357ee100aa64c4d1cf91edf99c40ac0069422a4fd5fd23b263263"}, - {file = "ujson-5.7.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a5d2f44331cf04689eafac7a6596c71d6657967c07ac700b0ae1c921178645da"}, - {file = "ujson-5.7.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:16b2254a77b310f118717715259a196662baa6b1f63b1a642d12ab1ff998c3d7"}, - {file = "ujson-5.7.0-cp37-cp37m-win32.whl", hash = "sha256:6faf46fa100b2b89e4db47206cf8a1ffb41542cdd34dde615b2fc2288954f194"}, - {file = "ujson-5.7.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ff0004c3f5a9a6574689a553d1b7819d1a496b4f005a7451f339dc2d9f4cf98c"}, - {file = "ujson-5.7.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:75204a1dd7ec6158c8db85a2f14a68d2143503f4bafb9a00b63fe09d35762a5e"}, - {file = "ujson-5.7.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7312731c7826e6c99cdd3ac503cd9acd300598e7a80bcf41f604fee5f49f566c"}, - {file = "ujson-5.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b9dc5a90e2149643df7f23634fe202fed5ebc787a2a1be95cf23632b4d90651"}, - {file = "ujson-5.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6a6961fc48821d84b1198a09516e396d56551e910d489692126e90bf4887d29"}, - {file = "ujson-5.7.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b01a9af52a0d5c46b2c68e3f258fdef2eacaa0ce6ae3e9eb97983f5b1166edb6"}, - {file = "ujson-5.7.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b7316d3edeba8a403686cdcad4af737b8415493101e7462a70ff73dd0609eafc"}, - {file = "ujson-5.7.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4ee997799a23227e2319a3f8817ce0b058923dbd31904761b788dc8f53bd3e30"}, - {file = "ujson-5.7.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:dda9aa4c33435147262cd2ea87c6b7a1ca83ba9b3933ff7df34e69fee9fced0c"}, - {file = "ujson-5.7.0-cp38-cp38-win32.whl", hash = "sha256:bea8d30e362180aafecabbdcbe0e1f0b32c9fa9e39c38e4af037b9d3ca36f50c"}, - {file = "ujson-5.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:c96e3b872bf883090ddf32cc41957edf819c5336ab0007d0cf3854e61841726d"}, - {file = "ujson-5.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6411aea4c94a8e93c2baac096fbf697af35ba2b2ed410b8b360b3c0957a952d3"}, - {file = "ujson-5.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3d3b3499c55911f70d4e074c626acdb79a56f54262c3c83325ffb210fb03e44d"}, - {file = "ujson-5.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:341f891d45dd3814d31764626c55d7ab3fd21af61fbc99d070e9c10c1190680b"}, - {file = "ujson-5.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f242eec917bafdc3f73a1021617db85f9958df80f267db69c76d766058f7b19"}, - {file = "ujson-5.7.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3af9f9f22a67a8c9466a32115d9073c72a33ae627b11de6f592df0ee09b98b6"}, - {file = "ujson-5.7.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4a3d794afbf134df3056a813e5c8a935208cddeae975bd4bc0ef7e89c52f0ce0"}, - {file = "ujson-5.7.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:800bf998e78dae655008dd10b22ca8dc93bdcfcc82f620d754a411592da4bbf2"}, - {file = "ujson-5.7.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b5ac3d5c5825e30b438ea92845380e812a476d6c2a1872b76026f2e9d8060fc2"}, - {file = "ujson-5.7.0-cp39-cp39-win32.whl", hash = "sha256:cd90027e6d93e8982f7d0d23acf88c896d18deff1903dd96140613389b25c0dd"}, - {file = "ujson-5.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:523ee146cdb2122bbd827f4dcc2a8e66607b3f665186bce9e4f78c9710b6d8ab"}, - {file = "ujson-5.7.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e87cec407ec004cf1b04c0ed7219a68c12860123dfb8902ef880d3d87a71c172"}, - {file = "ujson-5.7.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bab10165db6a7994e67001733f7f2caf3400b3e11538409d8756bc9b1c64f7e8"}, - {file = "ujson-5.7.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b522be14a28e6ac1cf818599aeff1004a28b42df4ed4d7bc819887b9dac915fc"}, - {file = "ujson-5.7.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7592f40175c723c032cdbe9fe5165b3b5903604f774ab0849363386e99e1f253"}, - {file = "ujson-5.7.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ed22f9665327a981f288a4f758a432824dc0314e4195a0eaeb0da56a477da94d"}, - {file = "ujson-5.7.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:adf445a49d9a97a5a4c9bb1d652a1528de09dd1c48b29f79f3d66cea9f826bf6"}, - {file = "ujson-5.7.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64772a53f3c4b6122ed930ae145184ebaed38534c60f3d859d8c3f00911eb122"}, - {file = "ujson-5.7.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35209cb2c13fcb9d76d249286105b4897b75a5e7f0efb0c0f4b90f222ce48910"}, - {file = "ujson-5.7.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:90712dfc775b2c7a07d4d8e059dd58636bd6ff1776d79857776152e693bddea6"}, - {file = "ujson-5.7.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:0e4e8981c6e7e9e637e637ad8ffe948a09e5434bc5f52ecbb82b4b4cfc092bfb"}, - {file = "ujson-5.7.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:581c945b811a3d67c27566539bfcb9705ea09cb27c4be0002f7a553c8886b817"}, - {file = "ujson-5.7.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d36a807a24c7d44f71686685ae6fbc8793d784bca1adf4c89f5f780b835b6243"}, - {file = "ujson-5.7.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b4257307e3662aa65e2644a277ca68783c5d51190ed9c49efebdd3cbfd5fa44"}, - {file = "ujson-5.7.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea7423d8a2f9e160c5e011119741682414c5b8dce4ae56590a966316a07a4618"}, - {file = "ujson-5.7.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4c592eb91a5968058a561d358d0fef59099ed152cfb3e1cd14eee51a7a93879e"}, - {file = "ujson-5.7.0.tar.gz", hash = "sha256:e788e5d5dcae8f6118ac9b45d0b891a0d55f7ac480eddcb7f07263f2bcf37b23"}, + {file = "ujson-5.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f4511560d75b15ecb367eef561554959b9d49b6ec3b8d5634212f9fed74a6df1"}, + {file = "ujson-5.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9399eaa5d1931a0ead49dce3ffacbea63f3177978588b956036bfe53cdf6af75"}, + {file = "ujson-5.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4e7bb7eba0e1963f8b768f9c458ecb193e5bf6977090182e2b4f4408f35ac76"}, + {file = "ujson-5.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40931d7c08c4ce99adc4b409ddb1bbb01635a950e81239c2382cfe24251b127a"}, + {file = "ujson-5.8.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d53039d39de65360e924b511c7ca1a67b0975c34c015dd468fca492b11caa8f7"}, + {file = "ujson-5.8.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:bdf04c6af3852161be9613e458a1fb67327910391de8ffedb8332e60800147a2"}, + {file = "ujson-5.8.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a70f776bda2e5072a086c02792c7863ba5833d565189e09fabbd04c8b4c3abba"}, + {file = "ujson-5.8.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f26629ac531d712f93192c233a74888bc8b8212558bd7d04c349125f10199fcf"}, + {file = "ujson-5.8.0-cp310-cp310-win32.whl", hash = "sha256:7ecc33b107ae88405aebdb8d82c13d6944be2331ebb04399134c03171509371a"}, + {file = "ujson-5.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:3b27a8da7a080add559a3b73ec9ebd52e82cc4419f7c6fb7266e62439a055ed0"}, + {file = "ujson-5.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:193349a998cd821483a25f5df30b44e8f495423840ee11b3b28df092ddfd0f7f"}, + {file = "ujson-5.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ddeabbc78b2aed531f167d1e70387b151900bc856d61e9325fcdfefb2a51ad8"}, + {file = "ujson-5.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ce24909a9c25062e60653073dd6d5e6ec9d6ad7ed6e0069450d5b673c854405"}, + {file = "ujson-5.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:27a2a3c7620ebe43641e926a1062bc04e92dbe90d3501687957d71b4bdddaec4"}, + {file = "ujson-5.8.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b852bdf920fe9f84e2a2c210cc45f1b64f763b4f7d01468b33f7791698e455e"}, + {file = "ujson-5.8.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:20768961a6a706170497129960762ded9c89fb1c10db2989c56956b162e2a8a3"}, + {file = "ujson-5.8.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e0147d41e9fb5cd174207c4a2895c5e24813204499fd0839951d4c8784a23bf5"}, + {file = "ujson-5.8.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e3673053b036fd161ae7a5a33358ccae6793ee89fd499000204676baafd7b3aa"}, + {file = "ujson-5.8.0-cp311-cp311-win32.whl", hash = "sha256:a89cf3cd8bf33a37600431b7024a7ccf499db25f9f0b332947fbc79043aad879"}, + {file = "ujson-5.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:3659deec9ab9eb19e8646932bfe6fe22730757c4addbe9d7d5544e879dc1b721"}, + {file = "ujson-5.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:102bf31c56f59538cccdfec45649780ae00657e86247c07edac434cb14d5388c"}, + {file = "ujson-5.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:299a312c3e85edee1178cb6453645217ba23b4e3186412677fa48e9a7f986de6"}, + {file = "ujson-5.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2e385a7679b9088d7bc43a64811a7713cc7c33d032d020f757c54e7d41931ae"}, + {file = "ujson-5.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad24ec130855d4430a682c7a60ca0bc158f8253ec81feed4073801f6b6cb681b"}, + {file = "ujson-5.8.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:16fde596d5e45bdf0d7de615346a102510ac8c405098e5595625015b0d4b5296"}, + {file = "ujson-5.8.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:6d230d870d1ce03df915e694dcfa3f4e8714369cce2346686dbe0bc8e3f135e7"}, + {file = "ujson-5.8.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:9571de0c53db5cbc265945e08f093f093af2c5a11e14772c72d8e37fceeedd08"}, + {file = "ujson-5.8.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:7cba16b26efe774c096a5e822e4f27097b7c81ed6fb5264a2b3f5fd8784bab30"}, + {file = "ujson-5.8.0-cp312-cp312-win32.whl", hash = "sha256:48c7d373ff22366eecfa36a52b9b55b0ee5bd44c2b50e16084aa88b9de038916"}, + {file = "ujson-5.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:5ac97b1e182d81cf395ded620528c59f4177eee024b4b39a50cdd7b720fdeec6"}, + {file = "ujson-5.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2a64cc32bb4a436e5813b83f5aab0889927e5ea1788bf99b930fad853c5625cb"}, + {file = "ujson-5.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e54578fa8838ddc722539a752adfce9372474114f8c127bb316db5392d942f8b"}, + {file = "ujson-5.8.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9721cd112b5e4687cb4ade12a7b8af8b048d4991227ae8066d9c4b3a6642a582"}, + {file = "ujson-5.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d9707e5aacf63fb919f6237d6490c4e0244c7f8d3dc2a0f84d7dec5db7cb54c"}, + {file = "ujson-5.8.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0be81bae295f65a6896b0c9030b55a106fb2dec69ef877253a87bc7c9c5308f7"}, + {file = "ujson-5.8.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ae7f4725c344bf437e9b881019c558416fe84ad9c6b67426416c131ad577df67"}, + {file = "ujson-5.8.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:9ab282d67ef3097105552bf151438b551cc4bedb3f24d80fada830f2e132aeb9"}, + {file = "ujson-5.8.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:94c7bd9880fa33fcf7f6d7f4cc032e2371adee3c5dba2922b918987141d1bf07"}, + {file = "ujson-5.8.0-cp38-cp38-win32.whl", hash = "sha256:bf5737dbcfe0fa0ac8fa599eceafae86b376492c8f1e4b84e3adf765f03fb564"}, + {file = "ujson-5.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:11da6bed916f9bfacf13f4fc6a9594abd62b2bb115acfb17a77b0f03bee4cfd5"}, + {file = "ujson-5.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:69b3104a2603bab510497ceabc186ba40fef38ec731c0ccaa662e01ff94a985c"}, + {file = "ujson-5.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9249fdefeb021e00b46025e77feed89cd91ffe9b3a49415239103fc1d5d9c29a"}, + {file = "ujson-5.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2873d196725a8193f56dde527b322c4bc79ed97cd60f1d087826ac3290cf9207"}, + {file = "ujson-5.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a4dafa9010c366589f55afb0fd67084acd8added1a51251008f9ff2c3e44042"}, + {file = "ujson-5.8.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7a42baa647a50fa8bed53d4e242be61023bd37b93577f27f90ffe521ac9dc7a3"}, + {file = "ujson-5.8.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f3554eaadffe416c6f543af442066afa6549edbc34fe6a7719818c3e72ebfe95"}, + {file = "ujson-5.8.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:fb87decf38cc82bcdea1d7511e73629e651bdec3a43ab40985167ab8449b769c"}, + {file = "ujson-5.8.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:407d60eb942c318482bbfb1e66be093308bb11617d41c613e33b4ce5be789adc"}, + {file = "ujson-5.8.0-cp39-cp39-win32.whl", hash = "sha256:0fe1b7edaf560ca6ab023f81cbeaf9946a240876a993b8c5a21a1c539171d903"}, + {file = "ujson-5.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:3f9b63530a5392eb687baff3989d0fb5f45194ae5b1ca8276282fb647f8dcdb3"}, + {file = "ujson-5.8.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:efeddf950fb15a832376c0c01d8d7713479fbeceaed1eaecb2665aa62c305aec"}, + {file = "ujson-5.8.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d8283ac5d03e65f488530c43d6610134309085b71db4f675e9cf5dff96a8282"}, + {file = "ujson-5.8.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb0142f6f10f57598655340a3b2c70ed4646cbe674191da195eb0985a9813b83"}, + {file = "ujson-5.8.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07d459aca895eb17eb463b00441986b021b9312c6c8cc1d06880925c7f51009c"}, + {file = "ujson-5.8.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:d524a8c15cfc863705991d70bbec998456a42c405c291d0f84a74ad7f35c5109"}, + {file = "ujson-5.8.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d6f84a7a175c75beecde53a624881ff618e9433045a69fcfb5e154b73cdaa377"}, + {file = "ujson-5.8.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b748797131ac7b29826d1524db1cc366d2722ab7afacc2ce1287cdafccddbf1f"}, + {file = "ujson-5.8.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e72ba76313d48a1a3a42e7dc9d1db32ea93fac782ad8dde6f8b13e35c229130"}, + {file = "ujson-5.8.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f504117a39cb98abba4153bf0b46b4954cc5d62f6351a14660201500ba31fe7f"}, + {file = "ujson-5.8.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a8c91b6f4bf23f274af9002b128d133b735141e867109487d17e344d38b87d94"}, + {file = "ujson-5.8.0.tar.gz", hash = "sha256:78e318def4ade898a461b3d92a79f9441e7e0e4d2ad5419abed4336d702c7425"}, ] [[package]] name = "urllib3" -version = "1.26.12" +version = "2.0.4" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, <4" +python-versions = ">=3.7" files = [ - {file = "urllib3-1.26.12-py2.py3-none-any.whl", hash = "sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997"}, - {file = "urllib3-1.26.12.tar.gz", hash = "sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e"}, + {file = "urllib3-2.0.4-py3-none-any.whl", hash = "sha256:de7df1803967d2c2a98e4b11bb7d6bd9210474c46e8a0401514e3a42a75ebde4"}, + {file = "urllib3-2.0.4.tar.gz", hash = "sha256:8d22f86aae8ef5e410d4f539fde9ce6b2113a001bb4d189e0aed70642d602b11"}, ] [package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] [[package]] name = "uvicorn" -version = "0.22.0" +version = "0.23.2" description = "The lightning-fast ASGI server." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "uvicorn-0.22.0-py3-none-any.whl", hash = "sha256:e9434d3bbf05f310e762147f769c9f21235ee118ba2d2bf1155a7196448bd996"}, - {file = "uvicorn-0.22.0.tar.gz", hash = "sha256:79277ae03db57ce7d9aa0567830bbb51d7a612f54d6e1e3e92da3ef24c2c8ed8"}, + {file = "uvicorn-0.23.2-py3-none-any.whl", hash = "sha256:1f9be6558f01239d4fdf22ef8126c39cb1ad0addf76c40e760549d2c2f43ab53"}, + {file = "uvicorn-0.23.2.tar.gz", hash = "sha256:4d3cc12d7727ba72b64d12d3cc7743124074c0a69f7b201512fc50c3e3f1569a"}, ] [package.dependencies] @@ -2471,33 +2772,33 @@ test = ["Cython (>=0.29.32,<0.30.0)", "aiohttp", "flake8 (>=3.9.2,<3.10.0)", "my [[package]] name = "watchfiles" -version = "0.19.0" +version = "0.20.0" description = "Simple, modern and high performance file watching and code reload in python." optional = false python-versions = ">=3.7" files = [ - {file = "watchfiles-0.19.0-cp37-abi3-macosx_10_7_x86_64.whl", hash = "sha256:91633e64712df3051ca454ca7d1b976baf842d7a3640b87622b323c55f3345e7"}, - {file = "watchfiles-0.19.0-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:b6577b8c6c8701ba8642ea9335a129836347894b666dd1ec2226830e263909d3"}, - {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:18b28f6ad871b82df9542ff958d0c86bb0d8310bb09eb8e87d97318a3b5273af"}, - {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fac19dc9cbc34052394dbe81e149411a62e71999c0a19e1e09ce537867f95ae0"}, - {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:09ea3397aecbc81c19ed7f025e051a7387feefdb789cf768ff994c1228182fda"}, - {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c0376deac92377817e4fb8f347bf559b7d44ff556d9bc6f6208dd3f79f104aaf"}, - {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c75eff897786ee262c9f17a48886f4e98e6cfd335e011c591c305e5d083c056"}, - {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb5d45c4143c1dd60f98a16187fd123eda7248f84ef22244818c18d531a249d1"}, - {file = "watchfiles-0.19.0-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:79c533ff593db861ae23436541f481ec896ee3da4e5db8962429b441bbaae16e"}, - {file = "watchfiles-0.19.0-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:3d7d267d27aceeeaa3de0dd161a0d64f0a282264d592e335fff7958cc0cbae7c"}, - {file = "watchfiles-0.19.0-cp37-abi3-win32.whl", hash = "sha256:176a9a7641ec2c97b24455135d58012a5be5c6217fc4d5fef0b2b9f75dbf5154"}, - {file = "watchfiles-0.19.0-cp37-abi3-win_amd64.whl", hash = "sha256:945be0baa3e2440151eb3718fd8846751e8b51d8de7b884c90b17d271d34cae8"}, - {file = "watchfiles-0.19.0-cp37-abi3-win_arm64.whl", hash = "sha256:0089c6dc24d436b373c3c57657bf4f9a453b13767150d17284fc6162b2791911"}, - {file = "watchfiles-0.19.0-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:cae3dde0b4b2078f31527acff6f486e23abed307ba4d3932466ba7cdd5ecec79"}, - {file = "watchfiles-0.19.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:7f3920b1285a7d3ce898e303d84791b7bf40d57b7695ad549dc04e6a44c9f120"}, - {file = "watchfiles-0.19.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9afd0d69429172c796164fd7fe8e821ade9be983f51c659a38da3faaaaac44dc"}, - {file = "watchfiles-0.19.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68dce92b29575dda0f8d30c11742a8e2b9b8ec768ae414b54f7453f27bdf9545"}, - {file = "watchfiles-0.19.0-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:5569fc7f967429d4bc87e355cdfdcee6aabe4b620801e2cf5805ea245c06097c"}, - {file = "watchfiles-0.19.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:5471582658ea56fca122c0f0d0116a36807c63fefd6fdc92c71ca9a4491b6b48"}, - {file = "watchfiles-0.19.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b538014a87f94d92f98f34d3e6d2635478e6be6423a9ea53e4dd96210065e193"}, - {file = "watchfiles-0.19.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20b44221764955b1e703f012c74015306fb7e79a00c15370785f309b1ed9aa8d"}, - {file = "watchfiles-0.19.0.tar.gz", hash = "sha256:d9b073073e048081e502b6c6b0b88714c026a1a4c890569238d04aca5f9ca74b"}, + {file = "watchfiles-0.20.0-cp37-abi3-macosx_10_7_x86_64.whl", hash = "sha256:3796312bd3587e14926013612b23066912cf45a14af71cf2b20db1c12dadf4e9"}, + {file = "watchfiles-0.20.0-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:d0002d81c89a662b595645fb684a371b98ff90a9c7d8f8630c82f0fde8310458"}, + {file = "watchfiles-0.20.0-cp37-abi3-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:570848706440373b4cd8017f3e850ae17f76dbdf1e9045fc79023b11e1afe490"}, + {file = "watchfiles-0.20.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a0351d20d03c6f7ad6b2e8a226a5efafb924c7755ee1e34f04c77c3682417fa"}, + {file = "watchfiles-0.20.0-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:007dcc4a401093010b389c044e81172c8a2520dba257c88f8828b3d460c6bb38"}, + {file = "watchfiles-0.20.0-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0d82dbc1832da83e441d112069833eedd4cf583d983fb8dd666fbefbea9d99c0"}, + {file = "watchfiles-0.20.0-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:99f4c65fd2fce61a571b2a6fcf747d6868db0bef8a934e8ca235cc8533944d95"}, + {file = "watchfiles-0.20.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5392dd327a05f538c56edb1c6ebba6af91afc81b40822452342f6da54907bbdf"}, + {file = "watchfiles-0.20.0-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:08dc702529bb06a2b23859110c214db245455532da5eaea602921687cfcd23db"}, + {file = "watchfiles-0.20.0-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:7d4e66a857621584869cfbad87039e65dadd7119f0d9bb9dbc957e089e32c164"}, + {file = "watchfiles-0.20.0-cp37-abi3-win32.whl", hash = "sha256:a03d1e6feb7966b417f43c3e3783188167fd69c2063e86bad31e62c4ea794cc5"}, + {file = "watchfiles-0.20.0-cp37-abi3-win_amd64.whl", hash = "sha256:eccc8942bcdc7d638a01435d915b913255bbd66f018f1af051cd8afddb339ea3"}, + {file = "watchfiles-0.20.0-cp37-abi3-win_arm64.whl", hash = "sha256:b17d4176c49d207865630da5b59a91779468dd3e08692fe943064da260de2c7c"}, + {file = "watchfiles-0.20.0-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:d97db179f7566dcf145c5179ddb2ae2a4450e3a634eb864b09ea04e68c252e8e"}, + {file = "watchfiles-0.20.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:835df2da7a5df5464c4a23b2d963e1a9d35afa422c83bf4ff4380b3114603644"}, + {file = "watchfiles-0.20.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:608cd94a8767f49521901aff9ae0c92cc8f5a24d528db7d6b0295290f9d41193"}, + {file = "watchfiles-0.20.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89d1de8218874925bce7bb2ae9657efc504411528930d7a83f98b1749864f2ef"}, + {file = "watchfiles-0.20.0-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:13f995d5152a8ba4ed7c2bbbaeee4e11a5944defc7cacd0ccb4dcbdcfd78029a"}, + {file = "watchfiles-0.20.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:9b5c8d3be7b502f8c43a33c63166ada8828dbb0c6d49c8f9ce990a96de2f5a49"}, + {file = "watchfiles-0.20.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e43af4464daa08723c04b43cf978ab86cc55c684c16172622bdac64b34e36af0"}, + {file = "watchfiles-0.20.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87d9e1f75c4f86c93d73b5bd1ebe667558357548f11b4f8af4e0e272f79413ce"}, + {file = "watchfiles-0.20.0.tar.gz", hash = "sha256:728575b6b94c90dd531514677201e8851708e6e4b5fe7028ac506a200b622019"}, ] [package.dependencies] @@ -2505,92 +2806,92 @@ anyio = ">=3.0.0" [[package]] name = "wcwidth" -version = "0.2.5" +version = "0.2.6" description = "Measures the displayed width of unicode strings in a terminal" optional = false python-versions = "*" files = [ - {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, - {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"}, + {file = "wcwidth-0.2.6-py2.py3-none-any.whl", hash = "sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e"}, + {file = "wcwidth-0.2.6.tar.gz", hash = "sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0"}, ] [[package]] name = "websockets" -version = "11.0.2" +version = "11.0.3" description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" optional = false python-versions = ">=3.7" files = [ - {file = "websockets-11.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:580cc95c58118f8c39106be71e24d0b7e1ad11a155f40a2ee687f99b3e5e432e"}, - {file = "websockets-11.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:143782041e95b63083b02107f31cda999f392903ae331de1307441f3a4557d51"}, - {file = "websockets-11.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8df63dcd955eb6b2e371d95aacf8b7c535e482192cff1b6ce927d8f43fb4f552"}, - {file = "websockets-11.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca9b2dced5cbbc5094678cc1ec62160f7b0fe4defd601cd28a36fde7ee71bbb5"}, - {file = "websockets-11.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e0eeeea3b01c97fd3b5049a46c908823f68b59bf0e18d79b231d8d6764bc81ee"}, - {file = "websockets-11.0.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:502683c5dedfc94b9f0f6790efb26aa0591526e8403ad443dce922cd6c0ec83b"}, - {file = "websockets-11.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d3cc3e48b6c9f7df8c3798004b9c4b92abca09eeea5e1b0a39698f05b7a33b9d"}, - {file = "websockets-11.0.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:808b8a33c961bbd6d33c55908f7c137569b09ea7dd024bce969969aa04ecf07c"}, - {file = "websockets-11.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:34a6f8996964ccaa40da42ee36aa1572adcb1e213665e24aa2f1037da6080909"}, - {file = "websockets-11.0.2-cp310-cp310-win32.whl", hash = "sha256:8f24cd758cbe1607a91b720537685b64e4d39415649cac9177cd1257317cf30c"}, - {file = "websockets-11.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:3b87cd302f08ea9e74fdc080470eddbed1e165113c1823fb3ee6328bc40ca1d3"}, - {file = "websockets-11.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3565a8f8c7bdde7c29ebe46146bd191290413ee6f8e94cf350609720c075b0a1"}, - {file = "websockets-11.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f97e03d4d5a4f0dca739ea274be9092822f7430b77d25aa02da6775e490f6846"}, - {file = "websockets-11.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8f392587eb2767afa8a34e909f2fec779f90b630622adc95d8b5e26ea8823cb8"}, - {file = "websockets-11.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7742cd4524622cc7aa71734b51294644492a961243c4fe67874971c4d3045982"}, - {file = "websockets-11.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:46dda4bc2030c335abe192b94e98686615f9274f6b56f32f2dd661fb303d9d12"}, - {file = "websockets-11.0.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6b2bfa1d884c254b841b0ff79373b6b80779088df6704f034858e4d705a4802"}, - {file = "websockets-11.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1df2413266bf48430ef2a752c49b93086c6bf192d708e4a9920544c74cd2baa6"}, - {file = "websockets-11.0.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cf45d273202b0c1cec0f03a7972c655b93611f2e996669667414557230a87b88"}, - {file = "websockets-11.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a09cce3dacb6ad638fdfa3154d9e54a98efe7c8f68f000e55ca9c716496ca67"}, - {file = "websockets-11.0.2-cp311-cp311-win32.whl", hash = "sha256:2174a75d579d811279855df5824676d851a69f52852edb0e7551e0eeac6f59a4"}, - {file = "websockets-11.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:c78ca3037a954a4209b9f900e0eabbc471fb4ebe96914016281df2c974a93e3e"}, - {file = "websockets-11.0.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3a2100b02d1aaf66dc48ff1b2a72f34f6ebc575a02bc0350cc8e9fbb35940166"}, - {file = "websockets-11.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dca9708eea9f9ed300394d4775beb2667288e998eb6f542cdb6c02027430c599"}, - {file = "websockets-11.0.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:320ddceefd2364d4afe6576195201a3632a6f2e6d207b0c01333e965b22dbc84"}, - {file = "websockets-11.0.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2a573c8d71b7af937852b61e7ccb37151d719974146b5dc734aad350ef55a02"}, - {file = "websockets-11.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:13bd5bebcd16a4b5e403061b8b9dcc5c77e7a71e3c57e072d8dff23e33f70fba"}, - {file = "websockets-11.0.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:95c09427c1c57206fe04277bf871b396476d5a8857fa1b99703283ee497c7a5d"}, - {file = "websockets-11.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2eb042734e710d39e9bc58deab23a65bd2750e161436101488f8af92f183c239"}, - {file = "websockets-11.0.2-cp37-cp37m-win32.whl", hash = "sha256:5875f623a10b9ba154cb61967f940ab469039f0b5e61c80dd153a65f024d9fb7"}, - {file = "websockets-11.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:634239bc844131863762865b75211a913c536817c0da27f691400d49d256df1d"}, - {file = "websockets-11.0.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3178d965ec204773ab67985a09f5696ca6c3869afeed0bb51703ea404a24e975"}, - {file = "websockets-11.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:955fcdb304833df2e172ce2492b7b47b4aab5dcc035a10e093d911a1916f2c87"}, - {file = "websockets-11.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cb46d2c7631b2e6f10f7c8bac7854f7c5e5288f024f1c137d4633c79ead1e3c0"}, - {file = "websockets-11.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25aae96c1060e85836552a113495db6d857400288161299d77b7b20f2ac569f2"}, - {file = "websockets-11.0.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2abeeae63154b7f63d9f764685b2d299e9141171b8b896688bd8baec6b3e2303"}, - {file = "websockets-11.0.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:daa1e8ea47507555ed7a34f8b49398d33dff5b8548eae3de1dc0ef0607273a33"}, - {file = "websockets-11.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:954eb789c960fa5daaed3cfe336abc066941a5d456ff6be8f0e03dd89886bb4c"}, - {file = "websockets-11.0.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3ffe251a31f37e65b9b9aca5d2d67fd091c234e530f13d9dce4a67959d5a3fba"}, - {file = "websockets-11.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:adf6385f677ed2e0b021845b36f55c43f171dab3a9ee0ace94da67302f1bc364"}, - {file = "websockets-11.0.2-cp38-cp38-win32.whl", hash = "sha256:aa7b33c1fb2f7b7b9820f93a5d61ffd47f5a91711bc5fa4583bbe0c0601ec0b2"}, - {file = "websockets-11.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:220d5b93764dd70d7617f1663da64256df7e7ea31fc66bc52c0e3750ee134ae3"}, - {file = "websockets-11.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0fb4480556825e4e6bf2eebdbeb130d9474c62705100c90e59f2f56459ddab42"}, - {file = "websockets-11.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ec00401846569aaf018700249996143f567d50050c5b7b650148989f956547af"}, - {file = "websockets-11.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87c69f50281126dcdaccd64d951fb57fbce272578d24efc59bce72cf264725d0"}, - {file = "websockets-11.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:232b6ba974f5d09b1b747ac232f3a3d8f86de401d7b565e837cc86988edf37ac"}, - {file = "websockets-11.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:392d409178db1e46d1055e51cc850136d302434e12d412a555e5291ab810f622"}, - {file = "websockets-11.0.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4fe2442091ff71dee0769a10449420fd5d3b606c590f78dd2b97d94b7455640"}, - {file = "websockets-11.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ede13a6998ba2568b21825809d96e69a38dc43184bdeebbde3699c8baa21d015"}, - {file = "websockets-11.0.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:4c54086b2d2aec3c3cb887ad97e9c02c6be9f1d48381c7419a4aa932d31661e4"}, - {file = "websockets-11.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e37a76ccd483a6457580077d43bc3dfe1fd784ecb2151fcb9d1c73f424deaeba"}, - {file = "websockets-11.0.2-cp39-cp39-win32.whl", hash = "sha256:d1881518b488a920434a271a6e8a5c9481a67c4f6352ebbdd249b789c0467ddc"}, - {file = "websockets-11.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:25e265686ea385f22a00cc2b719b880797cd1bb53b46dbde969e554fb458bfde"}, - {file = "websockets-11.0.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ce69f5c742eefd039dce8622e99d811ef2135b69d10f9aa79fbf2fdcc1e56cd7"}, - {file = "websockets-11.0.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b985ba2b9e972cf99ddffc07df1a314b893095f62c75bc7c5354a9c4647c6503"}, - {file = "websockets-11.0.2-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1b52def56d2a26e0e9c464f90cadb7e628e04f67b0ff3a76a4d9a18dfc35e3dd"}, - {file = "websockets-11.0.2-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d70a438ef2a22a581d65ad7648e949d4ccd20e3c8ed7a90bbc46df4e60320891"}, - {file = "websockets-11.0.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:752fbf420c71416fb1472fec1b4cb8631c1aa2be7149e0a5ba7e5771d75d2bb9"}, - {file = "websockets-11.0.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:dd906b0cdc417ea7a5f13bb3c6ca3b5fd563338dc596996cb0fdd7872d691c0a"}, - {file = "websockets-11.0.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e79065ff6549dd3c765e7916067e12a9c91df2affea0ac51bcd302aaf7ad207"}, - {file = "websockets-11.0.2-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:46388a050d9e40316e58a3f0838c63caacb72f94129eb621a659a6e49bad27ce"}, - {file = "websockets-11.0.2-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c7de298371d913824f71b30f7685bb07ad13969c79679cca5b1f7f94fec012f"}, - {file = "websockets-11.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:6d872c972c87c393e6a49c1afbdc596432df8c06d0ff7cd05aa18e885e7cfb7c"}, - {file = "websockets-11.0.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b444366b605d2885f0034dd889faf91b4b47668dd125591e2c64bfde611ac7e1"}, - {file = "websockets-11.0.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8b967a4849db6b567dec3f7dd5d97b15ce653e3497b8ce0814e470d5e074750"}, - {file = "websockets-11.0.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2acdc82099999e44fa7bd8c886f03c70a22b1d53ae74252f389be30d64fd6004"}, - {file = "websockets-11.0.2-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:518ed6782d9916c5721ebd61bb7651d244178b74399028302c8617d0620af291"}, - {file = "websockets-11.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:58477b041099bb504e1a5ddd8aa86302ed1d5c6995bdd3db2b3084ef0135d277"}, - {file = "websockets-11.0.2-py3-none-any.whl", hash = "sha256:5004c087d17251938a52cce21b3dbdabeecbbe432ce3f5bbbf15d8692c36eac9"}, - {file = "websockets-11.0.2.tar.gz", hash = "sha256:b1a69701eb98ed83dd099de4a686dc892c413d974fa31602bc00aca7cb988ac9"}, + {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3ccc8a0c387629aec40f2fc9fdcb4b9d5431954f934da3eaf16cdc94f67dbfac"}, + {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d67ac60a307f760c6e65dad586f556dde58e683fab03323221a4e530ead6f74d"}, + {file = "websockets-11.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84d27a4832cc1a0ee07cdcf2b0629a8a72db73f4cf6de6f0904f6661227f256f"}, + {file = "websockets-11.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffd7dcaf744f25f82190856bc26ed81721508fc5cbf2a330751e135ff1283564"}, + {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7622a89d696fc87af8e8d280d9b421db5133ef5b29d3f7a1ce9f1a7bf7fcfa11"}, + {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bceab846bac555aff6427d060f2fcfff71042dba6f5fca7dc4f75cac815e57ca"}, + {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:54c6e5b3d3a8936a4ab6870d46bdd6ec500ad62bde9e44462c32d18f1e9a8e54"}, + {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:41f696ba95cd92dc047e46b41b26dd24518384749ed0d99bea0a941ca87404c4"}, + {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:86d2a77fd490ae3ff6fae1c6ceaecad063d3cc2320b44377efdde79880e11526"}, + {file = "websockets-11.0.3-cp310-cp310-win32.whl", hash = "sha256:2d903ad4419f5b472de90cd2d40384573b25da71e33519a67797de17ef849b69"}, + {file = "websockets-11.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:1d2256283fa4b7f4c7d7d3e84dc2ece74d341bce57d5b9bf385df109c2a1a82f"}, + {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e848f46a58b9fcf3d06061d17be388caf70ea5b8cc3466251963c8345e13f7eb"}, + {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa5003845cdd21ac0dc6c9bf661c5beddd01116f6eb9eb3c8e272353d45b3288"}, + {file = "websockets-11.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b58cbf0697721120866820b89f93659abc31c1e876bf20d0b3d03cef14faf84d"}, + {file = "websockets-11.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:660e2d9068d2bedc0912af508f30bbeb505bbbf9774d98def45f68278cea20d3"}, + {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c1f0524f203e3bd35149f12157438f406eff2e4fb30f71221c8a5eceb3617b6b"}, + {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:def07915168ac8f7853812cc593c71185a16216e9e4fa886358a17ed0fd9fcf6"}, + {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b30c6590146e53149f04e85a6e4fcae068df4289e31e4aee1fdf56a0dead8f97"}, + {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:619d9f06372b3a42bc29d0cd0354c9bb9fb39c2cbc1a9c5025b4538738dbffaf"}, + {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:01f5567d9cf6f502d655151645d4e8b72b453413d3819d2b6f1185abc23e82dd"}, + {file = "websockets-11.0.3-cp311-cp311-win32.whl", hash = "sha256:e1459677e5d12be8bbc7584c35b992eea142911a6236a3278b9b5ce3326f282c"}, + {file = "websockets-11.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:e7837cb169eca3b3ae94cc5787c4fed99eef74c0ab9506756eea335e0d6f3ed8"}, + {file = "websockets-11.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9f59a3c656fef341a99e3d63189852be7084c0e54b75734cde571182c087b152"}, + {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2529338a6ff0eb0b50c7be33dc3d0e456381157a31eefc561771ee431134a97f"}, + {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34fd59a4ac42dff6d4681d8843217137f6bc85ed29722f2f7222bd619d15e95b"}, + {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:332d126167ddddec94597c2365537baf9ff62dfcc9db4266f263d455f2f031cb"}, + {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6505c1b31274723ccaf5f515c1824a4ad2f0d191cec942666b3d0f3aa4cb4007"}, + {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f467ba0050b7de85016b43f5a22b46383ef004c4f672148a8abf32bc999a87f0"}, + {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9d9acd80072abcc98bd2c86c3c9cd4ac2347b5a5a0cae7ed5c0ee5675f86d9af"}, + {file = "websockets-11.0.3-cp37-cp37m-win32.whl", hash = "sha256:e590228200fcfc7e9109509e4d9125eace2042fd52b595dd22bbc34bb282307f"}, + {file = "websockets-11.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:b16fff62b45eccb9c7abb18e60e7e446998093cdcb50fed33134b9b6878836de"}, + {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fb06eea71a00a7af0ae6aefbb932fb8a7df3cb390cc217d51a9ad7343de1b8d0"}, + {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8a34e13a62a59c871064dfd8ffb150867e54291e46d4a7cf11d02c94a5275bae"}, + {file = "websockets-11.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4841ed00f1026dfbced6fca7d963c4e7043aa832648671b5138008dc5a8f6d99"}, + {file = "websockets-11.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a073fc9ab1c8aff37c99f11f1641e16da517770e31a37265d2755282a5d28aa"}, + {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68b977f21ce443d6d378dbd5ca38621755f2063d6fdb3335bda981d552cfff86"}, + {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1a99a7a71631f0efe727c10edfba09ea6bee4166a6f9c19aafb6c0b5917d09c"}, + {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bee9fcb41db2a23bed96c6b6ead6489702c12334ea20a297aa095ce6d31370d0"}, + {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4b253869ea05a5a073ebfdcb5cb3b0266a57c3764cf6fe114e4cd90f4bfa5f5e"}, + {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1553cb82942b2a74dd9b15a018dce645d4e68674de2ca31ff13ebc2d9f283788"}, + {file = "websockets-11.0.3-cp38-cp38-win32.whl", hash = "sha256:f61bdb1df43dc9c131791fbc2355535f9024b9a04398d3bd0684fc16ab07df74"}, + {file = "websockets-11.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:03aae4edc0b1c68498f41a6772d80ac7c1e33c06c6ffa2ac1c27a07653e79d6f"}, + {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:777354ee16f02f643a4c7f2b3eff8027a33c9861edc691a2003531f5da4f6bc8"}, + {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8c82f11964f010053e13daafdc7154ce7385ecc538989a354ccc7067fd7028fd"}, + {file = "websockets-11.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3580dd9c1ad0701169e4d6fc41e878ffe05e6bdcaf3c412f9d559389d0c9e016"}, + {file = "websockets-11.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f1a3f10f836fab6ca6efa97bb952300b20ae56b409414ca85bff2ad241d2a61"}, + {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df41b9bc27c2c25b486bae7cf42fccdc52ff181c8c387bfd026624a491c2671b"}, + {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:279e5de4671e79a9ac877427f4ac4ce93751b8823f276b681d04b2156713b9dd"}, + {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1fdf26fa8a6a592f8f9235285b8affa72748dc12e964a5518c6c5e8f916716f7"}, + {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:69269f3a0b472e91125b503d3c0b3566bda26da0a3261c49f0027eb6075086d1"}, + {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:97b52894d948d2f6ea480171a27122d77af14ced35f62e5c892ca2fae9344311"}, + {file = "websockets-11.0.3-cp39-cp39-win32.whl", hash = "sha256:c7f3cb904cce8e1be667c7e6fef4516b98d1a6a0635a58a57528d577ac18a128"}, + {file = "websockets-11.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c792ea4eabc0159535608fc5658a74d1a81020eb35195dd63214dcf07556f67e"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f2e58f2c36cc52d41f2659e4c0cbf7353e28c8c9e63e30d8c6d3494dc9fdedcf"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de36fe9c02995c7e6ae6efe2e205816f5f00c22fd1fbf343d4d18c3d5ceac2f5"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ac56b661e60edd453585f4bd68eb6a29ae25b5184fd5ba51e97652580458998"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e052b8467dd07d4943936009f46ae5ce7b908ddcac3fda581656b1b19c083d9b"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:42cc5452a54a8e46a032521d7365da775823e21bfba2895fb7b77633cce031bb"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e6316827e3e79b7b8e7d8e3b08f4e331af91a48e794d5d8b099928b6f0b85f20"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8531fdcad636d82c517b26a448dcfe62f720e1922b33c81ce695d0edb91eb931"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c114e8da9b475739dde229fd3bc6b05a6537a88a578358bc8eb29b4030fac9c9"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e063b1865974611313a3849d43f2c3f5368093691349cf3c7c8f8f75ad7cb280"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:92b2065d642bf8c0a82d59e59053dd2fdde64d4ed44efe4870fa816c1232647b"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0ee68fe502f9031f19d495dae2c268830df2760c0524cbac5d759921ba8c8e82"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcacf2c7a6c3a84e720d1bb2b543c675bf6c40e460300b628bab1b1efc7c034c"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b67c6f5e5a401fc56394f191f00f9b3811fe843ee93f4a70df3c389d1adf857d"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d5023a4b6a5b183dc838808087033ec5df77580485fc533e7dab2567851b0a4"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ed058398f55163a79bb9f06a90ef9ccc063b204bb346c4de78efc5d15abfe602"}, + {file = "websockets-11.0.3-py3-none-any.whl", hash = "sha256:6681ba9e7f8f3b19440921e99efbb40fc89f26cd71bf539e45d8c8a25c976dc6"}, + {file = "websockets-11.0.3.tar.gz", hash = "sha256:88fc51d9a26b10fc331be344f1781224a375b78488fc343620184e95a4b27016"}, ] [[package]] @@ -2691,78 +2992,7 @@ files = [ {file = "wrapt-1.15.0.tar.gz", hash = "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a"}, ] -[[package]] -name = "zope-event" -version = "4.6" -description = "Very basic event publishing system" -optional = false -python-versions = "*" -files = [ - {file = "zope.event-4.6-py2.py3-none-any.whl", hash = "sha256:73d9e3ef750cca14816a9c322c7250b0d7c9dbc337df5d1b807ff8d3d0b9e97c"}, - {file = "zope.event-4.6.tar.gz", hash = "sha256:81d98813046fc86cc4136e3698fee628a3282f9c320db18658c21749235fce80"}, -] - -[package.dependencies] -setuptools = "*" - -[package.extras] -docs = ["Sphinx"] -test = ["zope.testrunner"] - -[[package]] -name = "zope-interface" -version = "5.5.2" -description = "Interfaces for Python" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "zope.interface-5.5.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:a2ad597c8c9e038a5912ac3cf166f82926feff2f6e0dabdab956768de0a258f5"}, - {file = "zope.interface-5.5.2-cp27-cp27m-win_amd64.whl", hash = "sha256:65c3c06afee96c654e590e046c4a24559e65b0a87dbff256cd4bd6f77e1a33f9"}, - {file = "zope.interface-5.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d514c269d1f9f5cd05ddfed15298d6c418129f3f064765295659798349c43e6f"}, - {file = "zope.interface-5.5.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5334e2ef60d3d9439c08baedaf8b84dc9bb9522d0dacbc10572ef5609ef8db6d"}, - {file = "zope.interface-5.5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc26c8d44472e035d59d6f1177eb712888447f5799743da9c398b0339ed90b1b"}, - {file = "zope.interface-5.5.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:17ebf6e0b1d07ed009738016abf0d0a0f80388e009d0ac6e0ead26fc162b3b9c"}, - {file = "zope.interface-5.5.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f98d4bd7bbb15ca701d19b93263cc5edfd480c3475d163f137385f49e5b3a3a7"}, - {file = "zope.interface-5.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:696f3d5493eae7359887da55c2afa05acc3db5fc625c49529e84bd9992313296"}, - {file = "zope.interface-5.5.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7579960be23d1fddecb53898035a0d112ac858c3554018ce615cefc03024e46d"}, - {file = "zope.interface-5.5.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:765d703096ca47aa5d93044bf701b00bbce4d903a95b41fff7c3796e747b1f1d"}, - {file = "zope.interface-5.5.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e945de62917acbf853ab968d8916290548df18dd62c739d862f359ecd25842a6"}, - {file = "zope.interface-5.5.2-cp311-cp311-win_amd64.whl", hash = "sha256:655796a906fa3ca67273011c9805c1e1baa047781fca80feeb710328cdbed87f"}, - {file = "zope.interface-5.5.2-cp35-cp35m-win_amd64.whl", hash = "sha256:0fb497c6b088818e3395e302e426850f8236d8d9f4ef5b2836feae812a8f699c"}, - {file = "zope.interface-5.5.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:008b0b65c05993bb08912f644d140530e775cf1c62a072bf9340c2249e613c32"}, - {file = "zope.interface-5.5.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:404d1e284eda9e233c90128697c71acffd55e183d70628aa0bbb0e7a3084ed8b"}, - {file = "zope.interface-5.5.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:3218ab1a7748327e08ef83cca63eea7cf20ea7e2ebcb2522072896e5e2fceedf"}, - {file = "zope.interface-5.5.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d169ccd0756c15bbb2f1acc012f5aab279dffc334d733ca0d9362c5beaebe88e"}, - {file = "zope.interface-5.5.2-cp36-cp36m-win_amd64.whl", hash = "sha256:e1574980b48c8c74f83578d1e77e701f8439a5d93f36a5a0af31337467c08fcf"}, - {file = "zope.interface-5.5.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:0217a9615531c83aeedb12e126611b1b1a3175013bbafe57c702ce40000eb9a0"}, - {file = "zope.interface-5.5.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:311196634bb9333aa06f00fc94f59d3a9fddd2305c2c425d86e406ddc6f2260d"}, - {file = "zope.interface-5.5.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6373d7eb813a143cb7795d3e42bd8ed857c82a90571567e681e1b3841a390d16"}, - {file = "zope.interface-5.5.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:959697ef2757406bff71467a09d940ca364e724c534efbf3786e86eee8591452"}, - {file = "zope.interface-5.5.2-cp37-cp37m-win_amd64.whl", hash = "sha256:dbaeb9cf0ea0b3bc4b36fae54a016933d64c6d52a94810a63c00f440ecb37dd7"}, - {file = "zope.interface-5.5.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:604cdba8f1983d0ab78edc29aa71c8df0ada06fb147cea436dc37093a0100a4e"}, - {file = "zope.interface-5.5.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e74a578172525c20d7223eac5f8ad187f10940dac06e40113d62f14f3adb1e8f"}, - {file = "zope.interface-5.5.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0980d44b8aded808bec5059018d64692f0127f10510eca71f2f0ace8fb11188"}, - {file = "zope.interface-5.5.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6e972493cdfe4ad0411fd9abfab7d4d800a7317a93928217f1a5de2bb0f0d87a"}, - {file = "zope.interface-5.5.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9d783213fab61832dbb10d385a319cb0e45451088abd45f95b5bb88ed0acca1a"}, - {file = "zope.interface-5.5.2-cp38-cp38-win_amd64.whl", hash = "sha256:a16025df73d24795a0bde05504911d306307c24a64187752685ff6ea23897cb0"}, - {file = "zope.interface-5.5.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:40f4065745e2c2fa0dff0e7ccd7c166a8ac9748974f960cd39f63d2c19f9231f"}, - {file = "zope.interface-5.5.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8a2ffadefd0e7206adc86e492ccc60395f7edb5680adedf17a7ee4205c530df4"}, - {file = "zope.interface-5.5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d692374b578360d36568dd05efb8a5a67ab6d1878c29c582e37ddba80e66c396"}, - {file = "zope.interface-5.5.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4087e253bd3bbbc3e615ecd0b6dd03c4e6a1e46d152d3be6d2ad08fbad742dcc"}, - {file = "zope.interface-5.5.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fb68d212efd057596dee9e6582daded9f8ef776538afdf5feceb3059df2d2e7b"}, - {file = "zope.interface-5.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:7e66f60b0067a10dd289b29dceabd3d0e6d68be1504fc9d0bc209cf07f56d189"}, - {file = "zope.interface-5.5.2.tar.gz", hash = "sha256:bfee1f3ff62143819499e348f5b8a7f3aa0259f9aca5e0ddae7391d059dce671"}, -] - -[package.dependencies] -setuptools = "*" - -[package.extras] -docs = ["Sphinx", "repoze.sphinx.autointerface"] -test = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] -testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] - [metadata] lock-version = "2.0" python-versions = "^3.11" -content-hash = "e415422a04cba65d655eaa24988796f9fb59253788ef550807d8f7d2e79dfa55" +content-hash = "077241047615034e7162ecc21070ac6e5fec699ba65383ba62362aac8f23d49a" diff --git a/backend/pyproject.toml b/backend/pyproject.toml index 0e72eeb8..146fac0c 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -7,27 +7,34 @@ authors = ["Terry Crapts ", "Lars Musters list[Organisation]: + return db.query(Organisation).filter(Organisation.type.is_(None)).all() + + +def assign_type(db: Session, org: Organisation): + """ + Translate all algorithms to English. + """ + assigned_type = None + + if org.code.startswith('gemeente'): + assigned_type = OrgType.gemeente + elif org.code.startswith('provincie'): + assigned_type = OrgType.provincie + elif org.code.startswith('waterschap'): + assigned_type = OrgType.waterschap + elif org.code.startswith('ministerie'): + assigned_type = OrgType.ministerie + elif org.code.startswith('omgevingsdienst'): + assigned_type = OrgType.regionaal_samenwerkingsorgaan + else: + assigned_type = mapping.get(org.code) + + if assigned_type == None: + logger.info(f"Could not assign {org.code} a type") + return + + logger.info(f"Assigned {org.code} as {assigned_type}") + db.query(Organisation).filter(Organisation.id == org.id).update({Organisation.type: assigned_type}, synchronize_session=False) + db.commit() + + +if __name__ == "__main__": + logger.info("Starting assigning types to orgs.") + db = SessionLocal() + orgs = get_orgs(db) + for org in orgs: + assign_type(db, org) + logger.info("Finished assigning types to orgs.") + db.close() diff --git a/backend/scripts/translate_existing.py b/backend/scripts/translate_existing.py new file mode 100644 index 00000000..cba3e9f2 --- /dev/null +++ b/backend/scripts/translate_existing.py @@ -0,0 +1,59 @@ +""" +This module translates all existing algorithms in the database. +It is meant to be run as a script once, and will not be used in the actual application. +""" +from sqlalchemy.orm import Session +from app.database.database import SessionLocal +import logging +from app.models import AlgoritmeVersion +from app import schemas +from app.controllers.algoritme_version.endpoints import apply_translation +from app.services.algoritme_version import db_list_to_python_list + +# initialize new independent logger +logger = logging.getLogger(__name__) +logger.setLevel(logging.INFO) +handler = logging.StreamHandler() +formatter = logging.Formatter( + fmt="%(levelname)s | %(asctime)s | %(name)s | %(message)s", +) +handler.setFormatter(formatter) +logger.addHandler(handler) + + +def get_all_published_versions(db): + """ + Get all algorithm versions from the database. + """ + model_list = ( + db.query(AlgoritmeVersion) + .filter(AlgoritmeVersion.language == schemas.Language.NLD) + .filter(AlgoritmeVersion.published) + .all() + ) + model_list = [db_list_to_python_list(model) for model in model_list] + return model_list + + +def apply(db: Session, algos: list[AlgoritmeVersion]): + """ + Translate all algorithms to English. + """ + for algo in algos: + logger.info(f"Translating {algo.name} to English.") + apply_translation( + algo, + db, + "BULK_TRANSLATOR", + ) + logger.info(f"Translated {algo.name} to English successfully.") + + +if __name__ == "__main__": + logger.info("Starting translation of existing algorithms.") + db = SessionLocal() + algos = get_all_published_versions(db) + logger.info(f"Found {len(algos)} Dutch algorithms to translate.") + apply(db, algos) + logger.info("Finished translation of existing algorithms.") + db.close() diff --git a/backend/tests/conftest.py b/backend/tests/conftest.py deleted file mode 100644 index e1d7b6d1..00000000 --- a/backend/tests/conftest.py +++ /dev/null @@ -1 +0,0 @@ -# Define any fixtures or OS variables here \ No newline at end of file diff --git a/backend/tests/samples/test_db.py b/backend/tests/samples/test_db.py deleted file mode 100644 index bf4bbfd8..00000000 --- a/backend/tests/samples/test_db.py +++ /dev/null @@ -1,18 +0,0 @@ -from app.middleware.middleware import get_db -import app.models as models - - -def test_get_db(): - """Test if the db is reachable""" - db = next(get_db()) - assert db - assert db.execute("SELECT 1") - - -def test_alembic(): - """Test if the alembic has properly initialized tables""" - db = next(get_db()) - try: - db.query(models.Algoritme).all() - except Exception: - assert False diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index c8a8480b..00000000 --- a/docker-compose.yml +++ /dev/null @@ -1,10 +0,0 @@ -version: "3.7" - -services: - nuxt-static: - image: httpd:2.4 - restart: always - volumes: - - ./frontend/.output/public/:/usr/local/apache2/htdocs - ports: - - 8080:80 diff --git a/etl/.flake8 b/etl/.flake8 new file mode 100644 index 00000000..6deafc26 --- /dev/null +++ b/etl/.flake8 @@ -0,0 +1,2 @@ +[flake8] +max-line-length = 120 diff --git a/etl/.python-version b/etl/.python-version new file mode 100644 index 00000000..d2c96c0a --- /dev/null +++ b/etl/.python-version @@ -0,0 +1 @@ +3.11.3 diff --git a/etl/Dockerfile b/etl/Dockerfile new file mode 100644 index 00000000..fd116c3a --- /dev/null +++ b/etl/Dockerfile @@ -0,0 +1,51 @@ +FROM harbor.cicd.s15m.nl/ictu-devops-pub/algreg_etl_base AS buildstep + +# Make sure these are set, either here or in the base image. +ENV YOUR_ENV=${YOUR_ENV} +# ENV YOUR_ENV=${YOUR_ENV} \ +# PYTHONFAULTHANDLER=1 \ +# PYTHONUNBUFFERED=1 \ +# PYTHONHASHSEED=random \ +# PIP_NO_CACHE_DIR=off \ +# PIP_DISABLE_PIP_VERSION_CHECK=on \ +# PIP_DEFAULT_TIMEOUT=100 \ +# POETRY_VERSION=1.2.2 + +WORKDIR /etl + +ADD /etl/app /etl/app +ADD /etl/common /etl/common +COPY /etl/poetry.lock /etl/poetry.lock +COPY /etl/pyproject.toml /etl/pyproject.toml +COPY /etl/start.sh /etl/start.sh + + +RUN poetry config virtualenvs.create false +RUN poetry install --without dev --no-interaction --no-ansi + +FROM harbor.cicd.s15m.nl/ictu-devops-pub/python:3.11.1-lunar-devops_base_0.2 +WORKDIR /etl +COPY --from=buildstep /etl /etl + +# Copy python binaries ensuring a clean install without overhead +COPY --from=buildstep /usr/local/lib /usr/local/lib +RUN ln -f -s /usr/bin/python3.11 /usr/bin/python3 +ENV PYTHONPATH="${PYTHONPATH}:/usr/local/lib/python3.11/site-packages" + +# remove unused dist-packages to prevent false positives for trivy +RUN rm -rf /usr/local/lib/python3.11/dist-packages + +# add testing tools +# RUN pip install pytest==7.3.1 coverage==7.2.7 + +# # add non root user for security with home directory for test files +RUN groupadd -r nonroot &&\ + useradd -r -g nonroot nonroot +RUN chown -R nonroot:nonroot /etl + +# make start.sh executable +RUN chmod 777 /etl/start.sh + +USER nonroot +EXPOSE 8000:8000 +CMD ["./start.sh"] diff --git a/etl/app/config/config.py b/etl/app/config/config.py new file mode 100644 index 00000000..f3ef2e82 --- /dev/null +++ b/etl/app/config/config.py @@ -0,0 +1,55 @@ +# columns will be renamed, but these are needed from the json +df_organisation_columns = ["owner", "organization"] + +df_algoritme_columns = ["lars", "create_dt"] + +df_algoritme_version_columns = [ + "name", + "organization", + "department", + "description_short", + "type", + "category", + "website", + "status", + "goal", + "impact", + "proportionality", + "decision_making_process", + "documentation", + "competent_authority", + "lawful_basis", + "iama", + "iama_description", + "dpia", + "dpia_description", + "objection_procedure", + "standard_version", + "uuid", + "url", + "contact_email", + "area", + "lang", + "revision_date", + "description", + "application_url", + "publiccode", + "mprd", + "source_data", + "methods_and_models", + "monitoring", + "human_intervention", + "risks", + "performance_standard", + "create_dt", + "published", + "provider", + "process_index_url", + "tags", + "source_id", + "begin_date", + "end_date", + "lawful_basis_link", + "impacttoetsen", + "source_data_link", +] diff --git a/etl/app/database/__init__.py b/etl/app/database/__init__.py new file mode 100644 index 00000000..870db83c --- /dev/null +++ b/etl/app/database/__init__.py @@ -0,0 +1 @@ +from .config import * # noqa diff --git a/etl/app/database/config.py b/etl/app/database/config.py new file mode 100644 index 00000000..5e882959 --- /dev/null +++ b/etl/app/database/config.py @@ -0,0 +1,9 @@ +from sqlalchemy import create_engine +from common.database_url import get_database_url + +SQLALCHEMY_DATABASE_URL = get_database_url() +engine = create_engine( + SQLALCHEMY_DATABASE_URL, + max_overflow=40, + pool_timeout=10, +) diff --git a/etl/app/main.py b/etl/app/main.py new file mode 100644 index 00000000..a4fcd9d4 --- /dev/null +++ b/etl/app/main.py @@ -0,0 +1,34 @@ +from fastapi import FastAPI +from fastapi.responses import FileResponse +from fastapi.staticfiles import StaticFiles +from app.services import Extractor, Transformer, Loader + +app = FastAPI( + docs_url="/api-docs", + title="ETL Algoritmeregister", + swagger_ui_parameters={ + "displayRequestDuration": True, + "defaultModelsExpandDepth": -1, + }, +) + +app.mount("/static", StaticFiles(directory="app/static"), name="static") + + +@app.get("/") +async def read_index(): + return FileResponse("app/static/index.html") + + +@app.get("/load", response_model=dict[str, str]) +async def load() -> dict[str, str]: + json = Extractor().get_json() + + transformer = Transformer(json) + df_organisation = transformer.json_to_df(table_name="organisation") + df_algoritme = transformer.json_to_df(table_name="algoritme") + df_algoritme_version = transformer.json_to_df(table_name="algoritme_version") + + Loader().update_database(df_organisation, df_algoritme, df_algoritme_version) + + return {"message": "Update gelukt!"} diff --git a/etl/app/report/logger.py b/etl/app/report/logger.py new file mode 100644 index 00000000..38d8947c --- /dev/null +++ b/etl/app/report/logger.py @@ -0,0 +1,30 @@ +import logging + + +def get_logger(name: str): + """ + Inspired by: https://docs.python.org/3/howto/logging.html#configuring-logging + """ + + logger = logging.getLogger(name) + logger.setLevel(logging.INFO) + + # create console handler and set level to debug + ch = logging.StreamHandler() + ch.setLevel(logging.INFO) + + # create formatter + formatter = logging.Formatter( + fmt="%(levelname)s | %(asctime)s | %(name)s | %(message)s", + ) + + # add formatter to ch + ch.setFormatter(formatter) + + # remove existing handlers + logger.handlers = [] + + # add ch to logger + logger.addHandler(ch) + + return logger diff --git a/etl/app/services/__init__.py b/etl/app/services/__init__.py new file mode 100644 index 00000000..35d450b4 --- /dev/null +++ b/etl/app/services/__init__.py @@ -0,0 +1,3 @@ +from .extractor import * # noqa +from .transformer import * # noqa +from .loader import * # noqa diff --git a/etl/app/services/extractor.py b/etl/app/services/extractor.py new file mode 100644 index 00000000..e6d85f03 --- /dev/null +++ b/etl/app/services/extractor.py @@ -0,0 +1,14 @@ +import requests + + +class Extractor: + def get_json(self): + response = requests.get("https://algoritmes.overheid.nl/api/json/algoritme") + if response.status_code == 200: + return response.json() + else: + raise RuntimeError("Fetching data failed") + + +if __name__ == "__main__": + json = Extractor().get_json() diff --git a/etl/app/services/loader.py b/etl/app/services/loader.py new file mode 100644 index 00000000..79ffbb29 --- /dev/null +++ b/etl/app/services/loader.py @@ -0,0 +1,40 @@ +import pandas as pd +from sqlalchemy import text +from typing import Literal +from app.report.logger import get_logger +from app.database.config import engine + +logger = get_logger(__name__) + + +class Loader: + def load( + self, + df: pd.DataFrame | None, + table_name: Literal["algoritme", "algoritme_version"], + ) -> None: + if df is None: + return + + with engine.connect() as conn: + conn.execute(text(f"DELETE FROM {table_name};")) + conn.commit() + + df.to_sql(table_name, engine, if_exists="append", index=False) + + # auto-increment must be reset. + max_value_sql = f"SELECT MAX(id) FROM {table_name}" + with engine.connect() as conn: + max_value = conn.execute(text(max_value_sql)).scalar() + reset_sequence_sql = f"SELECT setval('{table_name}_id_seq', {max_value})" + conn.execute(text(reset_sequence_sql)) + + def update_database( + self, + df_organisation: pd.DataFrame, + df_algoritme: pd.DataFrame, + df_algoritme_version: pd.DataFrame, + ) -> None: + self.load(df_organisation, "organisation") + self.load(df_algoritme, "algoritme") + self.load(df_algoritme_version, "algoritme_version") diff --git a/etl/app/services/transformer.py b/etl/app/services/transformer.py new file mode 100644 index 00000000..66227470 --- /dev/null +++ b/etl/app/services/transformer.py @@ -0,0 +1,67 @@ +import pandas as pd +from typing import Literal +import app.config.config as configuration + + +class Transformer: + def __init__(self, json: list[dict]): + self.json = json + self.df_organisation_columns = configuration.df_organisation_columns + self.df_algoritme_columns = configuration.df_algoritme_columns + self.df_algoritme_version_columns = configuration.df_algoritme_version_columns + + def json_to_df( + self, table_name: Literal["algoritme", "algoritme_version", "organisation"] + ): + match table_name: + case "organisation": + return self.get_organisation_df() + case "algoritme": + return self.get_algoritme_df() + case "algoritme_version": + return self.get_algoritme_version_df() + + def get_organisation_df(self) -> pd.DataFrame: + df = pd.DataFrame(self.json)[self.df_organisation_columns].copy() + + df.drop_duplicates(subset="owner", keep="first", inplace=True) + df = df.reset_index(drop=True).reset_index() + df.rename( + columns={"index": "id", "owner": "code", "organization": "name"}, + inplace=True, + ) + self.df_organisation = df + return self.df_organisation + + def get_algoritme_df(self) -> pd.DataFrame: + # Should be based on df_organisation... is not yet + df = pd.DataFrame(self.json)[[*self.df_algoritme_columns, "owner"]].copy() + + # The column rename allows merging. + df.rename(columns={"owner": "code"}, inplace=True) + merged_df = pd.merge(self.df_organisation, df, on="code", how="inner") + + # Clean-up merge + merged_df.rename(columns={"id": "organisation_id"}, inplace=True) + merged_df.drop(["code", "name"], axis=1, inplace=True) + + # Have an explicit id column, because it is a foreign key. So you need to be able to merge with it. + merged_df.reset_index(inplace=True) + merged_df.rename(columns={"index": "id"}, inplace=True) + self.df_algoritme = merged_df + return self.df_algoritme + + def get_algoritme_version_df(self) -> pd.DataFrame: + df = pd.DataFrame(self.json) + + # Column 'lars' is needed to match foreign keys. + df = df[[*self.df_algoritme_version_columns, "lars"]].copy() + + # Add id from the df_algoritme to this df as foreign key. + merged_df = pd.merge(self.df_algoritme, df, on="lars", how="inner") + merged_df.rename( + columns={"id": "algoritme_id", "create_dt_x": "create_dt"}, inplace=True + ) + merged_df.drop(["lars", "create_dt_y", "organisation_id"], axis=1, inplace=True) + merged_df["language"] = "NLD" + return merged_df diff --git a/etl/app/static/index.html b/etl/app/static/index.html new file mode 100644 index 00000000..a3a963e6 --- /dev/null +++ b/etl/app/static/index.html @@ -0,0 +1,78 @@ + + + + Algoritme synchronisatie + + +
+ +

Algoritmeregister synchronisatie

+
Met de knop hieronder kan je de data van het webformulier ophalen en in de publieke database van de relevante namespace laden.
+
Omgeving:
+
+ +
+
+ + + + + + \ No newline at end of file diff --git a/etl/base_image/Dockerfile b/etl/base_image/Dockerfile new file mode 100644 index 00000000..79829c6e --- /dev/null +++ b/etl/base_image/Dockerfile @@ -0,0 +1,25 @@ +FROM python:3.11.3-slim + +ENV YOUR_ENV=production \ + PYTHONFAULTHANDLER=1 \ + PYTHONUNBUFFERED=1 \ + PYTHONHASHSEED=random \ + PIP_NO_CACHE_DIR=off \ + PIP_DISABLE_PIP_VERSION_CHECK=on \ + PIP_DEFAULT_TIMEOUT=100 \ + POETRY_VERSION=1.2.2 + +WORKDIR /etl + +COPY ./requirements.txt /backend/requirements.txt + +RUN apt-get update +RUN apt-get -y install sudo +RUN sudo apt-get -y install gcc g++ python3-dev +RUN pip install -r /backend/requirements.txt +RUN pip install "poetry==$POETRY_VERSION" + +# Cleans up cache -> Reduces size for download. +RUN sudo apt-get clean + + diff --git a/etl/base_image/README.md b/etl/base_image/README.md new file mode 100644 index 00000000..2d3b51a2 --- /dev/null +++ b/etl/base_image/README.md @@ -0,0 +1,11 @@ +Does the base image need refreshing? + +Update the packages in requirements.txt and follow these steps: + +`docker build --file=Dockerfile -t algreg_etl_base . ` + +`docker tag algreg_etl_base harbor.cicd.s15m.nl/ictu-devops-pub/algreg_etl_base` + +`docker login harbor.cicd.s15m.nl` + +`docker push harbor.cicd.s15m.nl/ictu-devops-pub/algreg_etl_base` diff --git a/etl/base_image/requirements.txt b/etl/base_image/requirements.txt new file mode 100644 index 00000000..2a4971ea --- /dev/null +++ b/etl/base_image/requirements.txt @@ -0,0 +1,32 @@ +annotated-types==0.5.0 +anyio==3.7.1 +black==23.7.0 +click==8.1.6 +fastapi==0.100.1 +flake8==6.1.0 +greenlet==2.0.2 +h11==0.14.0 +idna==3.4 +mccabe==0.7.0 +mypy-extensions==1.0.0 +numpy==1.25.2 +packaging==23.1 +pandas==2.0.3 +pathspec==0.11.2 +platformdirs==3.10.0 +psycopg2-binary==2.9.6 +pycodestyle==2.11.0 +pydantic==2.1.1 +pydantic-settings==2.0.2 +pydantic_core==2.4.0 +pyflakes==3.1.0 +python-dateutil==2.8.2 +python-dotenv==1.0.0 +pytz==2023.3 +six==1.16.0 +sniffio==1.3.0 +SQLAlchemy==2.0.19 +starlette==0.27.0 +typing_extensions==4.7.1 +tzdata==2023.3 +uvicorn==0.23.2 diff --git a/etl/common/database_url.py b/etl/common/database_url.py new file mode 100644 index 00000000..0c3ad643 --- /dev/null +++ b/etl/common/database_url.py @@ -0,0 +1,15 @@ +from dotenv import load_dotenv +import os +import urllib.parse + +load_dotenv() + + +def get_database_url() -> str: + USERNAME = os.getenv("POSTGRES_USER", "postgres") + PASSWORD = urllib.parse.quote(os.getenv("POSTGRES_PASSWORD", "postgres")) + HOST = os.getenv("POSTGRES_SERVER", "localhost") + SCHEMA = os.getenv("POSTGRES_DB", "algreg_db") + PORT = os.getenv("POSTGRES_PORT", "5432") + connection_string = f"postgresql://{USERNAME}:{PASSWORD}@{HOST}:{PORT}/{SCHEMA}" + return connection_string diff --git a/etl/poetry.lock b/etl/poetry.lock new file mode 100644 index 00000000..db272d21 --- /dev/null +++ b/etl/poetry.lock @@ -0,0 +1,831 @@ +# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. + +[[package]] +name = "annotated-types" +version = "0.5.0" +description = "Reusable constraint types to use with typing.Annotated" +optional = false +python-versions = ">=3.7" +files = [ + {file = "annotated_types-0.5.0-py3-none-any.whl", hash = "sha256:58da39888f92c276ad970249761ebea80ba544b77acddaa1a4d6cf78287d45fd"}, + {file = "annotated_types-0.5.0.tar.gz", hash = "sha256:47cdc3490d9ac1506ce92c7aaa76c579dc3509ff11e098fc867e5130ab7be802"}, +] + +[[package]] +name = "anyio" +version = "3.7.1" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.7" +files = [ + {file = "anyio-3.7.1-py3-none-any.whl", hash = "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5"}, + {file = "anyio-3.7.1.tar.gz", hash = "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780"}, +] + +[package.dependencies] +idna = ">=2.8" +sniffio = ">=1.1" + +[package.extras] +doc = ["Sphinx", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme (>=1.2.2)", "sphinxcontrib-jquery"] +test = ["anyio[trio]", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (<0.22)"] + +[[package]] +name = "black" +version = "23.7.0" +description = "The uncompromising code formatter." +optional = false +python-versions = ">=3.8" +files = [ + {file = "black-23.7.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:5c4bc552ab52f6c1c506ccae05681fab58c3f72d59ae6e6639e8885e94fe2587"}, + {file = "black-23.7.0-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:552513d5cd5694590d7ef6f46e1767a4df9af168d449ff767b13b084c020e63f"}, + {file = "black-23.7.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:86cee259349b4448adb4ef9b204bb4467aae74a386bce85d56ba4f5dc0da27be"}, + {file = "black-23.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:501387a9edcb75d7ae8a4412bb8749900386eaef258f1aefab18adddea1936bc"}, + {file = "black-23.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:fb074d8b213749fa1d077d630db0d5f8cc3b2ae63587ad4116e8a436e9bbe995"}, + {file = "black-23.7.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:b5b0ee6d96b345a8b420100b7d71ebfdd19fab5e8301aff48ec270042cd40ac2"}, + {file = "black-23.7.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:893695a76b140881531062d48476ebe4a48f5d1e9388177e175d76234ca247cd"}, + {file = "black-23.7.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:c333286dc3ddca6fdff74670b911cccedacb4ef0a60b34e491b8a67c833b343a"}, + {file = "black-23.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:831d8f54c3a8c8cf55f64d0422ee875eecac26f5f649fb6c1df65316b67c8926"}, + {file = "black-23.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:7f3bf2dec7d541b4619b8ce526bda74a6b0bffc480a163fed32eb8b3c9aed8ad"}, + {file = "black-23.7.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:f9062af71c59c004cd519e2fb8f5d25d39e46d3af011b41ab43b9c74e27e236f"}, + {file = "black-23.7.0-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:01ede61aac8c154b55f35301fac3e730baf0c9cf8120f65a9cd61a81cfb4a0c3"}, + {file = "black-23.7.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:327a8c2550ddc573b51e2c352adb88143464bb9d92c10416feb86b0f5aee5ff6"}, + {file = "black-23.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d1c6022b86f83b632d06f2b02774134def5d4d4f1dac8bef16d90cda18ba28a"}, + {file = "black-23.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:27eb7a0c71604d5de083757fbdb245b1a4fae60e9596514c6ec497eb63f95320"}, + {file = "black-23.7.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:8417dbd2f57b5701492cd46edcecc4f9208dc75529bcf76c514864e48da867d9"}, + {file = "black-23.7.0-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:47e56d83aad53ca140da0af87678fb38e44fd6bc0af71eebab2d1f59b1acf1d3"}, + {file = "black-23.7.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:25cc308838fe71f7065df53aedd20327969d05671bac95b38fdf37ebe70ac087"}, + {file = "black-23.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:642496b675095d423f9b8448243336f8ec71c9d4d57ec17bf795b67f08132a91"}, + {file = "black-23.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:ad0014efc7acf0bd745792bd0d8857413652979200ab924fbf239062adc12491"}, + {file = "black-23.7.0-py3-none-any.whl", hash = "sha256:9fd59d418c60c0348505f2ddf9609c1e1de8e7493eab96198fc89d9f865e7a96"}, + {file = "black-23.7.0.tar.gz", hash = "sha256:022a582720b0d9480ed82576c920a8c1dde97cc38ff11d8d8859b3bd6ca9eedb"}, +] + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +packaging = ">=22.0" +pathspec = ">=0.9.0" +platformdirs = ">=2" + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.7.4)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + +[[package]] +name = "click" +version = "8.1.6" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.6-py3-none-any.whl", hash = "sha256:fa244bb30b3b5ee2cae3da8f55c9e5e0c0e86093306301fb418eb9dc40fbded5"}, + {file = "click-8.1.6.tar.gz", hash = "sha256:48ee849951919527a045bfe3bf7baa8a959c423134e1a5b98c05c20ba75a1cbd"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "fastapi" +version = "0.100.1" +description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" +optional = false +python-versions = ">=3.7" +files = [ + {file = "fastapi-0.100.1-py3-none-any.whl", hash = "sha256:ec6dd52bfc4eff3063cfcd0713b43c87640fefb2687bbbe3d8a08d94049cdf32"}, + {file = "fastapi-0.100.1.tar.gz", hash = "sha256:522700d7a469e4a973d92321ab93312448fbe20fca9c8da97effc7e7bc56df23"}, +] + +[package.dependencies] +pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<3.0.0" +starlette = ">=0.27.0,<0.28.0" +typing-extensions = ">=4.5.0" + +[package.extras] +all = ["email-validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] + +[[package]] +name = "flake8" +version = "6.1.0" +description = "the modular source code checker: pep8 pyflakes and co" +optional = false +python-versions = ">=3.8.1" +files = [ + {file = "flake8-6.1.0-py2.py3-none-any.whl", hash = "sha256:ffdfce58ea94c6580c77888a86506937f9a1a227dfcd15f245d694ae20a6b6e5"}, + {file = "flake8-6.1.0.tar.gz", hash = "sha256:d5b3857f07c030bdb5bf41c7f53799571d75c4491748a3adcd47de929e34cd23"}, +] + +[package.dependencies] +mccabe = ">=0.7.0,<0.8.0" +pycodestyle = ">=2.11.0,<2.12.0" +pyflakes = ">=3.1.0,<3.2.0" + +[[package]] +name = "greenlet" +version = "2.0.2" +description = "Lightweight in-process concurrent programming" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +files = [ + {file = "greenlet-2.0.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:bdfea8c661e80d3c1c99ad7c3ff74e6e87184895bbaca6ee8cc61209f8b9b85d"}, + {file = "greenlet-2.0.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:9d14b83fab60d5e8abe587d51c75b252bcc21683f24699ada8fb275d7712f5a9"}, + {file = "greenlet-2.0.2-cp27-cp27m-win32.whl", hash = "sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74"}, + {file = "greenlet-2.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343"}, + {file = "greenlet-2.0.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae"}, + {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d75209eed723105f9596807495d58d10b3470fa6732dd6756595e89925ce2470"}, + {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a51c9751078733d88e013587b108f1b7a1fb106d402fb390740f002b6f6551a"}, + {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91"}, + {file = "greenlet-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645"}, + {file = "greenlet-2.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2"}, + {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:eff4eb9b7eb3e4d0cae3d28c283dc16d9bed6b193c2e1ace3ed86ce48ea8df19"}, + {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5454276c07d27a740c5892f4907c86327b632127dd9abec42ee62e12427ff7e3"}, + {file = "greenlet-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:7cafd1208fdbe93b67c7086876f061f660cfddc44f404279c1585bbf3cdc64c5"}, + {file = "greenlet-2.0.2-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:910841381caba4f744a44bf81bfd573c94e10b3045ee00de0cbf436fe50673a6"}, + {file = "greenlet-2.0.2-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:18a7f18b82b52ee85322d7a7874e676f34ab319b9f8cce5de06067384aa8ff43"}, + {file = "greenlet-2.0.2-cp35-cp35m-win32.whl", hash = "sha256:03a8f4f3430c3b3ff8d10a2a86028c660355ab637cee9333d63d66b56f09d52a"}, + {file = "greenlet-2.0.2-cp35-cp35m-win_amd64.whl", hash = "sha256:4b58adb399c4d61d912c4c331984d60eb66565175cdf4a34792cd9600f21b394"}, + {file = "greenlet-2.0.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:703f18f3fda276b9a916f0934d2fb6d989bf0b4fb5a64825260eb9bfd52d78f0"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:32e5b64b148966d9cccc2c8d35a671409e45f195864560829f395a54226408d3"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dd11f291565a81d71dab10b7033395b7a3a5456e637cf997a6f33ebdf06f8db"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0f72c9ddb8cd28532185f54cc1453f2c16fb417a08b53a855c4e6a418edd099"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd021c754b162c0fb55ad5d6b9d960db667faad0fa2ff25bb6e1301b0b6e6a75"}, + {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:3c9b12575734155d0c09d6c3e10dbd81665d5c18e1a7c6597df72fd05990c8cf"}, + {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b9ec052b06a0524f0e35bd8790686a1da006bd911dd1ef7d50b77bfbad74e292"}, + {file = "greenlet-2.0.2-cp36-cp36m-win32.whl", hash = "sha256:dbfcfc0218093a19c252ca8eb9aee3d29cfdcb586df21049b9d777fd32c14fd9"}, + {file = "greenlet-2.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:9f35ec95538f50292f6d8f2c9c9f8a3c6540bbfec21c9e5b4b751e0a7c20864f"}, + {file = "greenlet-2.0.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:d5508f0b173e6aa47273bdc0a0b5ba055b59662ba7c7ee5119528f466585526b"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9c59a2120b55788e800d82dfa99b9e156ff8f2227f07c5e3012a45a399620b7"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2780572ec463d44c1d3ae850239508dbeb9fed38e294c68d19a24d925d9223ca"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:937e9020b514ceedb9c830c55d5c9872abc90f4b5862f89c0887033ae33c6f73"}, + {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:36abbf031e1c0f79dd5d596bfaf8e921c41df2bdf54ee1eed921ce1f52999a86"}, + {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:18e98fb3de7dba1c0a852731c3070cf022d14f0d68b4c87a19cc1016f3bb8b33"}, + {file = "greenlet-2.0.2-cp37-cp37m-win32.whl", hash = "sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7"}, + {file = "greenlet-2.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3"}, + {file = "greenlet-2.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acd2162a36d3de67ee896c43effcd5ee3de247eb00354db411feb025aa319857"}, + {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0bf60faf0bc2468089bdc5edd10555bab6e85152191df713e2ab1fcc86382b5a"}, + {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a"}, + {file = "greenlet-2.0.2-cp38-cp38-win32.whl", hash = "sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249"}, + {file = "greenlet-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40"}, + {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be4ed120b52ae4d974aa40215fcdfde9194d63541c7ded40ee12eb4dda57b76b"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94c817e84245513926588caf1152e3b559ff794d505555211ca041f032abbb6b"}, + {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1a819eef4b0e0b96bb0d98d797bef17dc1b4a10e8d7446be32d1da33e095dbb8"}, + {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7efde645ca1cc441d6dc4b48c0f7101e8d86b54c8530141b09fd31cef5149ec9"}, + {file = "greenlet-2.0.2-cp39-cp39-win32.whl", hash = "sha256:ea9872c80c132f4663822dd2a08d404073a5a9b5ba6155bea72fb2a79d1093b5"}, + {file = "greenlet-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:db1a39669102a1d8d12b57de2bb7e2ec9066a6f2b3da35ae511ff93b01b5d564"}, + {file = "greenlet-2.0.2.tar.gz", hash = "sha256:e7c8dc13af7db097bed64a051d2dd49e9f0af495c26995c00a9ee842690d34c0"}, +] + +[package.extras] +docs = ["Sphinx", "docutils (<0.18)"] +test = ["objgraph", "psutil"] + +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" +optional = false +python-versions = ">=3.6" +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +optional = false +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + +[[package]] +name = "numpy" +version = "1.25.2" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numpy-1.25.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:db3ccc4e37a6873045580d413fe79b68e47a681af8db2e046f1dacfa11f86eb3"}, + {file = "numpy-1.25.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:90319e4f002795ccfc9050110bbbaa16c944b1c37c0baeea43c5fb881693ae1f"}, + {file = "numpy-1.25.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfe4a913e29b418d096e696ddd422d8a5d13ffba4ea91f9f60440a3b759b0187"}, + {file = "numpy-1.25.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f08f2e037bba04e707eebf4bc934f1972a315c883a9e0ebfa8a7756eabf9e357"}, + {file = "numpy-1.25.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bec1e7213c7cb00d67093247f8c4db156fd03075f49876957dca4711306d39c9"}, + {file = "numpy-1.25.2-cp310-cp310-win32.whl", hash = "sha256:7dc869c0c75988e1c693d0e2d5b26034644399dd929bc049db55395b1379e044"}, + {file = "numpy-1.25.2-cp310-cp310-win_amd64.whl", hash = "sha256:834b386f2b8210dca38c71a6e0f4fd6922f7d3fcff935dbe3a570945acb1b545"}, + {file = "numpy-1.25.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c5462d19336db4560041517dbb7759c21d181a67cb01b36ca109b2ae37d32418"}, + {file = "numpy-1.25.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c5652ea24d33585ea39eb6a6a15dac87a1206a692719ff45d53c5282e66d4a8f"}, + {file = "numpy-1.25.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d60fbae8e0019865fc4784745814cff1c421df5afee233db6d88ab4f14655a2"}, + {file = "numpy-1.25.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60e7f0f7f6d0eee8364b9a6304c2845b9c491ac706048c7e8cf47b83123b8dbf"}, + {file = "numpy-1.25.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bb33d5a1cf360304754913a350edda36d5b8c5331a8237268c48f91253c3a364"}, + {file = "numpy-1.25.2-cp311-cp311-win32.whl", hash = "sha256:5883c06bb92f2e6c8181df7b39971a5fb436288db58b5a1c3967702d4278691d"}, + {file = "numpy-1.25.2-cp311-cp311-win_amd64.whl", hash = "sha256:5c97325a0ba6f9d041feb9390924614b60b99209a71a69c876f71052521d42a4"}, + {file = "numpy-1.25.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b79e513d7aac42ae918db3ad1341a015488530d0bb2a6abcbdd10a3a829ccfd3"}, + {file = "numpy-1.25.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:eb942bfb6f84df5ce05dbf4b46673ffed0d3da59f13635ea9b926af3deb76926"}, + {file = "numpy-1.25.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e0746410e73384e70d286f93abf2520035250aad8c5714240b0492a7302fdca"}, + {file = "numpy-1.25.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7806500e4f5bdd04095e849265e55de20d8cc4b661b038957354327f6d9b295"}, + {file = "numpy-1.25.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8b77775f4b7df768967a7c8b3567e309f617dd5e99aeb886fa14dc1a0791141f"}, + {file = "numpy-1.25.2-cp39-cp39-win32.whl", hash = "sha256:2792d23d62ec51e50ce4d4b7d73de8f67a2fd3ea710dcbc8563a51a03fb07b01"}, + {file = "numpy-1.25.2-cp39-cp39-win_amd64.whl", hash = "sha256:76b4115d42a7dfc5d485d358728cdd8719be33cc5ec6ec08632a5d6fca2ed380"}, + {file = "numpy-1.25.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1a1329e26f46230bf77b02cc19e900db9b52f398d6722ca853349a782d4cff55"}, + {file = "numpy-1.25.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c3abc71e8b6edba80a01a52e66d83c5d14433cbcd26a40c329ec7ed09f37901"}, + {file = "numpy-1.25.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1b9735c27cea5d995496f46a8b1cd7b408b3f34b6d50459d9ac8fe3a20cc17bf"}, + {file = "numpy-1.25.2.tar.gz", hash = "sha256:fd608e19c8d7c55021dffd43bfe5492fab8cc105cc8986f813f8c3c048b38760"}, +] + +[[package]] +name = "packaging" +version = "23.1" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] + +[[package]] +name = "pandas" +version = "2.0.3" +description = "Powerful data structures for data analysis, time series, and statistics" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pandas-2.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e4c7c9f27a4185304c7caf96dc7d91bc60bc162221152de697c98eb0b2648dd8"}, + {file = "pandas-2.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f167beed68918d62bffb6ec64f2e1d8a7d297a038f86d4aed056b9493fca407f"}, + {file = "pandas-2.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce0c6f76a0f1ba361551f3e6dceaff06bde7514a374aa43e33b588ec10420183"}, + {file = "pandas-2.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba619e410a21d8c387a1ea6e8a0e49bb42216474436245718d7f2e88a2f8d7c0"}, + {file = "pandas-2.0.3-cp310-cp310-win32.whl", hash = "sha256:3ef285093b4fe5058eefd756100a367f27029913760773c8bf1d2d8bebe5d210"}, + {file = "pandas-2.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:9ee1a69328d5c36c98d8e74db06f4ad518a1840e8ccb94a4ba86920986bb617e"}, + {file = "pandas-2.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b084b91d8d66ab19f5bb3256cbd5ea661848338301940e17f4492b2ce0801fe8"}, + {file = "pandas-2.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:37673e3bdf1551b95bf5d4ce372b37770f9529743d2498032439371fc7b7eb26"}, + {file = "pandas-2.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9cb1e14fdb546396b7e1b923ffaeeac24e4cedd14266c3497216dd4448e4f2d"}, + {file = "pandas-2.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9cd88488cceb7635aebb84809d087468eb33551097d600c6dad13602029c2df"}, + {file = "pandas-2.0.3-cp311-cp311-win32.whl", hash = "sha256:694888a81198786f0e164ee3a581df7d505024fbb1f15202fc7db88a71d84ebd"}, + {file = "pandas-2.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:6a21ab5c89dcbd57f78d0ae16630b090eec626360085a4148693def5452d8a6b"}, + {file = "pandas-2.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9e4da0d45e7f34c069fe4d522359df7d23badf83abc1d1cef398895822d11061"}, + {file = "pandas-2.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:32fca2ee1b0d93dd71d979726b12b61faa06aeb93cf77468776287f41ff8fdc5"}, + {file = "pandas-2.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:258d3624b3ae734490e4d63c430256e716f488c4fcb7c8e9bde2d3aa46c29089"}, + {file = "pandas-2.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eae3dc34fa1aa7772dd3fc60270d13ced7346fcbcfee017d3132ec625e23bb0"}, + {file = "pandas-2.0.3-cp38-cp38-win32.whl", hash = "sha256:f3421a7afb1a43f7e38e82e844e2bca9a6d793d66c1a7f9f0ff39a795bbc5e02"}, + {file = "pandas-2.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:69d7f3884c95da3a31ef82b7618af5710dba95bb885ffab339aad925c3e8ce78"}, + {file = "pandas-2.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5247fb1ba347c1261cbbf0fcfba4a3121fbb4029d95d9ef4dc45406620b25c8b"}, + {file = "pandas-2.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:81af086f4543c9d8bb128328b5d32e9986e0c84d3ee673a2ac6fb57fd14f755e"}, + {file = "pandas-2.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1994c789bf12a7c5098277fb43836ce090f1073858c10f9220998ac74f37c69b"}, + {file = "pandas-2.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ec591c48e29226bcbb316e0c1e9423622bc7a4eaf1ef7c3c9fa1a3981f89641"}, + {file = "pandas-2.0.3-cp39-cp39-win32.whl", hash = "sha256:04dbdbaf2e4d46ca8da896e1805bc04eb85caa9a82e259e8eed00254d5e0c682"}, + {file = "pandas-2.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:1168574b036cd8b93abc746171c9b4f1b83467438a5e45909fed645cf8692dbc"}, + {file = "pandas-2.0.3.tar.gz", hash = "sha256:c02f372a88e0d17f36d3093a644c73cfc1788e876a7c4bcb4020a77512e2043c"}, +] + +[package.dependencies] +numpy = [ + {version = ">=1.21.0", markers = "python_version >= \"3.10\""}, + {version = ">=1.23.2", markers = "python_version >= \"3.11\""}, +] +python-dateutil = ">=2.8.2" +pytz = ">=2020.1" +tzdata = ">=2022.1" + +[package.extras] +all = ["PyQt5 (>=5.15.1)", "SQLAlchemy (>=1.4.16)", "beautifulsoup4 (>=4.9.3)", "bottleneck (>=1.3.2)", "brotlipy (>=0.7.0)", "fastparquet (>=0.6.3)", "fsspec (>=2021.07.0)", "gcsfs (>=2021.07.0)", "html5lib (>=1.1)", "hypothesis (>=6.34.2)", "jinja2 (>=3.0.0)", "lxml (>=4.6.3)", "matplotlib (>=3.6.1)", "numba (>=0.53.1)", "numexpr (>=2.7.3)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pandas-gbq (>=0.15.0)", "psycopg2 (>=2.8.6)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.2)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)", "python-snappy (>=0.6.0)", "pyxlsb (>=1.0.8)", "qtpy (>=2.2.0)", "s3fs (>=2021.08.0)", "scipy (>=1.7.1)", "tables (>=3.6.1)", "tabulate (>=0.8.9)", "xarray (>=0.21.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)", "zstandard (>=0.15.2)"] +aws = ["s3fs (>=2021.08.0)"] +clipboard = ["PyQt5 (>=5.15.1)", "qtpy (>=2.2.0)"] +compression = ["brotlipy (>=0.7.0)", "python-snappy (>=0.6.0)", "zstandard (>=0.15.2)"] +computation = ["scipy (>=1.7.1)", "xarray (>=0.21.0)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pyxlsb (>=1.0.8)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)"] +feather = ["pyarrow (>=7.0.0)"] +fss = ["fsspec (>=2021.07.0)"] +gcp = ["gcsfs (>=2021.07.0)", "pandas-gbq (>=0.15.0)"] +hdf5 = ["tables (>=3.6.1)"] +html = ["beautifulsoup4 (>=4.9.3)", "html5lib (>=1.1)", "lxml (>=4.6.3)"] +mysql = ["SQLAlchemy (>=1.4.16)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.0.0)", "tabulate (>=0.8.9)"] +parquet = ["pyarrow (>=7.0.0)"] +performance = ["bottleneck (>=1.3.2)", "numba (>=0.53.1)", "numexpr (>=2.7.1)"] +plot = ["matplotlib (>=3.6.1)"] +postgresql = ["SQLAlchemy (>=1.4.16)", "psycopg2 (>=2.8.6)"] +spss = ["pyreadstat (>=1.1.2)"] +sql-other = ["SQLAlchemy (>=1.4.16)"] +test = ["hypothesis (>=6.34.2)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.6.3)"] + +[[package]] +name = "pathspec" +version = "0.11.2" +description = "Utility library for gitignore style pattern matching of file paths." +optional = false +python-versions = ">=3.7" +files = [ + {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, + {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, +] + +[[package]] +name = "platformdirs" +version = "3.10.0" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +optional = false +python-versions = ">=3.7" +files = [ + {file = "platformdirs-3.10.0-py3-none-any.whl", hash = "sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d"}, + {file = "platformdirs-3.10.0.tar.gz", hash = "sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d"}, +] + +[package.extras] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] + +[[package]] +name = "psycopg2-binary" +version = "2.9.6" +description = "psycopg2 - Python-PostgreSQL Database Adapter" +optional = false +python-versions = ">=3.6" +files = [ + {file = "psycopg2-binary-2.9.6.tar.gz", hash = "sha256:1f64dcfb8f6e0c014c7f55e51c9759f024f70ea572fbdef123f85318c297947c"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d26e0342183c762de3276cca7a530d574d4e25121ca7d6e4a98e4f05cb8e4df7"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c48d8f2db17f27d41fb0e2ecd703ea41984ee19362cbce52c097963b3a1b4365"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffe9dc0a884a8848075e576c1de0290d85a533a9f6e9c4e564f19adf8f6e54a7"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a76e027f87753f9bd1ab5f7c9cb8c7628d1077ef927f5e2446477153a602f2c"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6460c7a99fc939b849431f1e73e013d54aa54293f30f1109019c56a0b2b2ec2f"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae102a98c547ee2288637af07393dd33f440c25e5cd79556b04e3fca13325e5f"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9972aad21f965599ed0106f65334230ce826e5ae69fda7cbd688d24fa922415e"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7a40c00dbe17c0af5bdd55aafd6ff6679f94a9be9513a4c7e071baf3d7d22a70"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:cacbdc5839bdff804dfebc058fe25684cae322987f7a38b0168bc1b2df703fb1"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7f0438fa20fb6c7e202863e0d5ab02c246d35efb1d164e052f2f3bfe2b152bd0"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-win32.whl", hash = "sha256:b6c8288bb8a84b47e07013bb4850f50538aa913d487579e1921724631d02ea1b"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-win_amd64.whl", hash = "sha256:61b047a0537bbc3afae10f134dc6393823882eb263088c271331602b672e52e9"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:964b4dfb7c1c1965ac4c1978b0f755cc4bd698e8aa2b7667c575fb5f04ebe06b"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:afe64e9b8ea66866a771996f6ff14447e8082ea26e675a295ad3bdbffdd72afb"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15e2ee79e7cf29582ef770de7dab3d286431b01c3bb598f8e05e09601b890081"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfa74c903a3c1f0d9b1c7e7b53ed2d929a4910e272add6700c38f365a6002820"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b83456c2d4979e08ff56180a76429263ea254c3f6552cd14ada95cff1dec9bb8"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0645376d399bfd64da57148694d78e1f431b1e1ee1054872a5713125681cf1be"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e99e34c82309dd78959ba3c1590975b5d3c862d6f279f843d47d26ff89d7d7e1"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4ea29fc3ad9d91162c52b578f211ff1c931d8a38e1f58e684c45aa470adf19e2"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:4ac30da8b4f57187dbf449294d23b808f8f53cad6b1fc3623fa8a6c11d176dd0"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e78e6e2a00c223e164c417628572a90093c031ed724492c763721c2e0bc2a8df"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-win32.whl", hash = "sha256:1876843d8e31c89c399e31b97d4b9725a3575bb9c2af92038464231ec40f9edb"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-win_amd64.whl", hash = "sha256:b4b24f75d16a89cc6b4cdff0eb6a910a966ecd476d1e73f7ce5985ff1328e9a6"}, + {file = "psycopg2_binary-2.9.6-cp36-cp36m-win32.whl", hash = "sha256:498807b927ca2510baea1b05cc91d7da4718a0f53cb766c154c417a39f1820a0"}, + {file = "psycopg2_binary-2.9.6-cp36-cp36m-win_amd64.whl", hash = "sha256:0d236c2825fa656a2d98bbb0e52370a2e852e5a0ec45fc4f402977313329174d"}, + {file = "psycopg2_binary-2.9.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:34b9ccdf210cbbb1303c7c4db2905fa0319391bd5904d32689e6dd5c963d2ea8"}, + {file = "psycopg2_binary-2.9.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84d2222e61f313c4848ff05353653bf5f5cf6ce34df540e4274516880d9c3763"}, + {file = "psycopg2_binary-2.9.6-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30637a20623e2a2eacc420059be11527f4458ef54352d870b8181a4c3020ae6b"}, + {file = "psycopg2_binary-2.9.6-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8122cfc7cae0da9a3077216528b8bb3629c43b25053284cc868744bfe71eb141"}, + {file = "psycopg2_binary-2.9.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38601cbbfe600362c43714482f43b7c110b20cb0f8172422c616b09b85a750c5"}, + {file = "psycopg2_binary-2.9.6-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c7e62ab8b332147a7593a385d4f368874d5fe4ad4e341770d4983442d89603e3"}, + {file = "psycopg2_binary-2.9.6-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2ab652e729ff4ad76d400df2624d223d6e265ef81bb8aa17fbd63607878ecbee"}, + {file = "psycopg2_binary-2.9.6-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:c83a74b68270028dc8ee74d38ecfaf9c90eed23c8959fca95bd703d25b82c88e"}, + {file = "psycopg2_binary-2.9.6-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d4e6036decf4b72d6425d5b29bbd3e8f0ff1059cda7ac7b96d6ac5ed34ffbacd"}, + {file = "psycopg2_binary-2.9.6-cp37-cp37m-win32.whl", hash = "sha256:a8c28fd40a4226b4a84bdf2d2b5b37d2c7bd49486b5adcc200e8c7ec991dfa7e"}, + {file = "psycopg2_binary-2.9.6-cp37-cp37m-win_amd64.whl", hash = "sha256:51537e3d299be0db9137b321dfb6a5022caaab275775680e0c3d281feefaca6b"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cf4499e0a83b7b7edcb8dabecbd8501d0d3a5ef66457200f77bde3d210d5debb"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7e13a5a2c01151f1208d5207e42f33ba86d561b7a89fca67c700b9486a06d0e2"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e0f754d27fddcfd74006455b6e04e6705d6c31a612ec69ddc040a5468e44b4e"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d57c3fd55d9058645d26ae37d76e61156a27722097229d32a9e73ed54819982a"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71f14375d6f73b62800530b581aed3ada394039877818b2d5f7fc77e3bb6894d"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:441cc2f8869a4f0f4bb408475e5ae0ee1f3b55b33f350406150277f7f35384fc"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:65bee1e49fa6f9cf327ce0e01c4c10f39165ee76d35c846ade7cb0ec6683e303"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:af335bac6b666cc6aea16f11d486c3b794029d9df029967f9938a4bed59b6a19"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:cfec476887aa231b8548ece2e06d28edc87c1397ebd83922299af2e051cf2827"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:65c07febd1936d63bfde78948b76cd4c2a411572a44ac50719ead41947d0f26b"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-win32.whl", hash = "sha256:4dfb4be774c4436a4526d0c554af0cc2e02082c38303852a36f6456ece7b3503"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-win_amd64.whl", hash = "sha256:02c6e3cf3439e213e4ee930308dc122d6fb4d4bea9aef4a12535fbd605d1a2fe"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e9182eb20f41417ea1dd8e8f7888c4d7c6e805f8a7c98c1081778a3da2bee3e4"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8a6979cf527e2603d349a91060f428bcb135aea2be3201dff794813256c274f1"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8338a271cb71d8da40b023a35d9c1e919eba6cbd8fa20a54b748a332c355d896"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3ed340d2b858d6e6fb5083f87c09996506af483227735de6964a6100b4e6a54"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f81e65376e52f03422e1fb475c9514185669943798ed019ac50410fb4c4df232"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfb13af3c5dd3a9588000910178de17010ebcccd37b4f9794b00595e3a8ddad3"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4c727b597c6444a16e9119386b59388f8a424223302d0c06c676ec8b4bc1f963"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:4d67fbdaf177da06374473ef6f7ed8cc0a9dc640b01abfe9e8a2ccb1b1402c1f"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0892ef645c2fabb0c75ec32d79f4252542d0caec1d5d949630e7d242ca4681a3"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:02c0f3757a4300cf379eb49f543fb7ac527fb00144d39246ee40e1df684ab514"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-win32.whl", hash = "sha256:c3dba7dab16709a33a847e5cd756767271697041fbe3fe97c215b1fc1f5c9848"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-win_amd64.whl", hash = "sha256:f6a88f384335bb27812293fdb11ac6aee2ca3f51d3c7820fe03de0a304ab6249"}, +] + +[[package]] +name = "pycodestyle" +version = "2.11.0" +description = "Python style guide checker" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pycodestyle-2.11.0-py2.py3-none-any.whl", hash = "sha256:5d1013ba8dc7895b548be5afb05740ca82454fd899971563d2ef625d090326f8"}, + {file = "pycodestyle-2.11.0.tar.gz", hash = "sha256:259bcc17857d8a8b3b4a2327324b79e5f020a13c16074670f9c8c8f872ea76d0"}, +] + +[[package]] +name = "pydantic" +version = "2.1.1" +description = "Data validation using Python type hints" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pydantic-2.1.1-py3-none-any.whl", hash = "sha256:43bdbf359d6304c57afda15c2b95797295b702948082d4c23851ce752f21da70"}, + {file = "pydantic-2.1.1.tar.gz", hash = "sha256:22d63db5ce4831afd16e7c58b3192d3faf8f79154980d9397d9867254310ba4b"}, +] + +[package.dependencies] +annotated-types = ">=0.4.0" +pydantic-core = "2.4.0" +typing-extensions = ">=4.6.1" + +[package.extras] +email = ["email-validator (>=2.0.0)"] + +[[package]] +name = "pydantic-core" +version = "2.4.0" +description = "" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pydantic_core-2.4.0-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:2ca4687dd996bde7f3c420def450797feeb20dcee2b9687023e3323c73fc14a2"}, + {file = "pydantic_core-2.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:782fced7d61469fd1231b184a80e4f2fa7ad54cd7173834651a453f96f29d673"}, + {file = "pydantic_core-2.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6213b471b68146af97b8551294e59e7392c2117e28ffad9c557c65087f4baee3"}, + {file = "pydantic_core-2.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63797499a219d8e81eb4e0c42222d0a4c8ec896f5c76751d4258af95de41fdf1"}, + {file = "pydantic_core-2.4.0-cp310-cp310-manylinux_2_24_armv7l.whl", hash = "sha256:0455876d575a35defc4da7e0a199596d6c773e20d3d42fa1fc29f6aa640369ed"}, + {file = "pydantic_core-2.4.0-cp310-cp310-manylinux_2_24_ppc64le.whl", hash = "sha256:8c938c96294d983dcf419b54dba2d21056959c22911d41788efbf949a29ae30d"}, + {file = "pydantic_core-2.4.0-cp310-cp310-manylinux_2_24_s390x.whl", hash = "sha256:878a5017d93e776c379af4e7b20f173c82594d94fa073059bcc546789ad50bf8"}, + {file = "pydantic_core-2.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:69159afc2f2dc43285725f16143bc5df3c853bc1cb7df6021fce7ef1c69e8171"}, + {file = "pydantic_core-2.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:54df7df399b777c1fd144f541c95d351b3aa110535a6810a6a569905d106b6f3"}, + {file = "pydantic_core-2.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e412607ca89a0ced10758dfb8f9adcc365ce4c1c377e637c01989a75e9a9ec8a"}, + {file = "pydantic_core-2.4.0-cp310-none-win32.whl", hash = "sha256:853f103e2b9a58832fdd08a587a51de8b552ae90e1a5d167f316b7eabf8d7dde"}, + {file = "pydantic_core-2.4.0-cp310-none-win_amd64.whl", hash = "sha256:3ba2c9c94a9176f6321a879c8b864d7c5b12d34f549a4c216c72ce213d7d953c"}, + {file = "pydantic_core-2.4.0-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:a8b7acd04896e8f161e1500dc5f218017db05c1d322f054e89cbd089ce5d0071"}, + {file = "pydantic_core-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:16468bd074fa4567592d3255bf25528ed41e6b616d69bf07096bdb5b66f947d1"}, + {file = "pydantic_core-2.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cba5ad5eef02c86a1f3da00544cbc59a510d596b27566479a7cd4d91c6187a11"}, + {file = "pydantic_core-2.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7206e41e04b443016e930e01685bab7a308113c0b251b3f906942c8d4b48fcb"}, + {file = "pydantic_core-2.4.0-cp311-cp311-manylinux_2_24_armv7l.whl", hash = "sha256:c1375025f0bfc9155286ebae8eecc65e33e494c90025cda69e247c3ccd2bab00"}, + {file = "pydantic_core-2.4.0-cp311-cp311-manylinux_2_24_ppc64le.whl", hash = "sha256:3534118289e33130ed3f1cc487002e8d09b9f359be48b02e9cd3de58ce58fba9"}, + {file = "pydantic_core-2.4.0-cp311-cp311-manylinux_2_24_s390x.whl", hash = "sha256:94d2b36a74623caab262bf95f0e365c2c058396082bd9d6a9e825657d0c1e7fa"}, + {file = "pydantic_core-2.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:af24ad4fbaa5e4a2000beae0c3b7fd1c78d7819ab90f9370a1cfd8998e3f8a3c"}, + {file = "pydantic_core-2.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bf10963d8aed8bbe0165b41797c9463d4c5c8788ae6a77c68427569be6bead41"}, + {file = "pydantic_core-2.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:68199ada7c310ddb8c76efbb606a0de656b40899388a7498954f423e03fc38be"}, + {file = "pydantic_core-2.4.0-cp311-none-win32.whl", hash = "sha256:6f855bcc96ed3dd56da7373cfcc9dcbabbc2073cac7f65c185772d08884790ce"}, + {file = "pydantic_core-2.4.0-cp311-none-win_amd64.whl", hash = "sha256:de39eb3bab93a99ddda1ac1b9aa331b944d8bcc4aa9141148f7fd8ee0299dafc"}, + {file = "pydantic_core-2.4.0-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:f773b39780323a0499b53ebd91a28ad11cde6705605d98d999dfa08624caf064"}, + {file = "pydantic_core-2.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a297c0d6c61963c5c3726840677b798ca5b7dfc71bc9c02b9a4af11d23236008"}, + {file = "pydantic_core-2.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:546064c55264156b973b5e65e5fafbe5e62390902ce3cf6b4005765505e8ff56"}, + {file = "pydantic_core-2.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36ba9e728588588f0196deaf6751b9222492331b5552f865a8ff120869d372e0"}, + {file = "pydantic_core-2.4.0-cp312-cp312-manylinux_2_24_armv7l.whl", hash = "sha256:57a53a75010c635b3ad6499e7721eaa3b450e03f6862afe2dbef9c8f66e46ec8"}, + {file = "pydantic_core-2.4.0-cp312-cp312-manylinux_2_24_ppc64le.whl", hash = "sha256:4b262bbc13022f2097c48a21adcc360a81d83dc1d854c11b94953cd46d7d3c07"}, + {file = "pydantic_core-2.4.0-cp312-cp312-manylinux_2_24_s390x.whl", hash = "sha256:01947ad728f426fa07fcb26457ebf90ce29320259938414bc0edd1476e75addb"}, + {file = "pydantic_core-2.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b2799c2eaf182769889761d4fb4d78b82bc47dae833799fedbf69fc7de306faa"}, + {file = "pydantic_core-2.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a08fd490ba36d1fbb2cd5dcdcfb9f3892deb93bd53456724389135712b5fc735"}, + {file = "pydantic_core-2.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1e8a7c62d15a5c4b307271e4252d76ebb981d6251c6ecea4daf203ef0179ea4f"}, + {file = "pydantic_core-2.4.0-cp312-none-win32.whl", hash = "sha256:9206c14a67c38de7b916e486ae280017cf394fa4b1aa95cfe88621a4e1d79725"}, + {file = "pydantic_core-2.4.0-cp312-none-win_amd64.whl", hash = "sha256:884235507549a6b2d3c4113fb1877ae263109e787d9e0eb25c35982ab28d0399"}, + {file = "pydantic_core-2.4.0-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:4cbe929efa77a806e8f1a97793f2dc3ea3475ae21a9ed0f37c21320fe93f6f50"}, + {file = "pydantic_core-2.4.0-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:9137289de8fe845c246a8c3482dd0cb40338846ba683756d8f489a4bd8fddcae"}, + {file = "pydantic_core-2.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5d8e764b5646623e57575f624f8ebb8f7a9f7fd1fae682ef87869ca5fec8dcf"}, + {file = "pydantic_core-2.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fba0aff4c407d0274e43697e785bcac155ad962be57518d1c711f45e72da70f"}, + {file = "pydantic_core-2.4.0-cp37-cp37m-manylinux_2_24_armv7l.whl", hash = "sha256:30527d173e826f2f7651f91c821e337073df1555e3b5a0b7b1e2c39e26e50678"}, + {file = "pydantic_core-2.4.0-cp37-cp37m-manylinux_2_24_ppc64le.whl", hash = "sha256:bd7d1dde70ff3e09e4bc7a1cbb91a7a538add291bfd5b3e70ef1e7b45192440f"}, + {file = "pydantic_core-2.4.0-cp37-cp37m-manylinux_2_24_s390x.whl", hash = "sha256:72f1216ca8cef7b8adacd4c4c6b89c3b0c4f97503197f5284c80f36d6e4edd30"}, + {file = "pydantic_core-2.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b013c7861a7c7bfcec48fd709513fea6f9f31727e7a0a93ca0dd12e056740717"}, + {file = "pydantic_core-2.4.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:478f5f6d7e32bd4a04d102160efb2d389432ecf095fe87c555c0a6fc4adfc1a4"}, + {file = "pydantic_core-2.4.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d9610b47b5fe4aacbbba6a9cb5f12cbe864eec99dbfed5710bd32ef5dd8a5d5b"}, + {file = "pydantic_core-2.4.0-cp37-none-win32.whl", hash = "sha256:ff246c0111076c8022f9ba325c294f2cb5983403506989253e04dbae565e019b"}, + {file = "pydantic_core-2.4.0-cp37-none-win_amd64.whl", hash = "sha256:d0c2b713464a8e263a243ae7980d81ce2de5ac59a9f798a282e44350b42dc516"}, + {file = "pydantic_core-2.4.0-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:12ef6838245569fd60a179fade81ca4b90ae2fa0ef355d616f519f7bb27582db"}, + {file = "pydantic_core-2.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:49db206eb8fdc4b4f30e6e3e410584146d813c151928f94ec0db06c4f2595538"}, + {file = "pydantic_core-2.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a507d7fa44688bbac76af6521e488b3da93de155b9cba6f2c9b7833ce243d59"}, + {file = "pydantic_core-2.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffe18407a4d000c568182ce5388bbbedeb099896904e43fc14eee76cfae6dec5"}, + {file = "pydantic_core-2.4.0-cp38-cp38-manylinux_2_24_armv7l.whl", hash = "sha256:fa8e48001b39d54d97d7b380a0669fa99fc0feeb972e35a2d677ba59164a9a22"}, + {file = "pydantic_core-2.4.0-cp38-cp38-manylinux_2_24_ppc64le.whl", hash = "sha256:394f12a2671ff8c4dfa2e85be6c08be0651ad85bc1e6aa9c77c21671baaf28cd"}, + {file = "pydantic_core-2.4.0-cp38-cp38-manylinux_2_24_s390x.whl", hash = "sha256:2f9ea0355f90db2a76af530245fa42f04d98f752a1236ed7c6809ec484560d5b"}, + {file = "pydantic_core-2.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:61d4e713f467abcdd59b47665d488bb898ad3dd47ce7446522a50e0cbd8e8279"}, + {file = "pydantic_core-2.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:453862ab268f6326b01f067ed89cb3a527d34dc46f6f4eeec46a15bbc706d0da"}, + {file = "pydantic_core-2.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:56a85fa0dab1567bd0cac10f0c3837b03e8a0d939e6a8061a3a420acd97e9421"}, + {file = "pydantic_core-2.4.0-cp38-none-win32.whl", hash = "sha256:0d726108c1c0380b88b6dd4db559f0280e0ceda9e077f46ff90bc85cd4d03e77"}, + {file = "pydantic_core-2.4.0-cp38-none-win_amd64.whl", hash = "sha256:047580388644c473b934d27849f8ed8dbe45df0adb72104e78b543e13bf69762"}, + {file = "pydantic_core-2.4.0-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:867d3eea954bea807cabba83cfc939c889a18576d66d197c60025b15269d7cc0"}, + {file = "pydantic_core-2.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:664402ef0c238a7f8a46efb101789d5f2275600fb18114446efec83cfadb5b66"}, + {file = "pydantic_core-2.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64e8012ad60a5f0da09ed48725e6e923d1be25f2f091a640af6079f874663813"}, + {file = "pydantic_core-2.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac2b680de398f293b68183317432b3d67ab3faeba216aec18de0c395cb5e3060"}, + {file = "pydantic_core-2.4.0-cp39-cp39-manylinux_2_24_armv7l.whl", hash = "sha256:8efc1be43b036c2b6bcfb1451df24ee0ddcf69c31351003daf2699ed93f5687b"}, + {file = "pydantic_core-2.4.0-cp39-cp39-manylinux_2_24_ppc64le.whl", hash = "sha256:d93aedbc4614cc21b9ab0d0c4ccd7143354c1f7cffbbe96ae5216ad21d1b21b5"}, + {file = "pydantic_core-2.4.0-cp39-cp39-manylinux_2_24_s390x.whl", hash = "sha256:af788b64e13d52fc3600a68b16d31fa8d8573e3ff2fc9a38f8a60b8d94d1f012"}, + {file = "pydantic_core-2.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:97c6349c81cee2e69ef59eba6e6c08c5936e6b01c2d50b9e4ac152217845ae09"}, + {file = "pydantic_core-2.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:cc086ddb6dc654a15deeed1d1f2bcb1cb924ebd70df9dca738af19f64229b06c"}, + {file = "pydantic_core-2.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e953353180bec330c3b830891d260b6f8e576e2d18db3c78d314e56bb2276066"}, + {file = "pydantic_core-2.4.0-cp39-none-win32.whl", hash = "sha256:6feb4b64d11d5420e517910d60a907d08d846cacaf4e029668725cd21d16743c"}, + {file = "pydantic_core-2.4.0-cp39-none-win_amd64.whl", hash = "sha256:153a61ac4030fa019b70b31fb7986461119230d3ba0ab661c757cfea652f4332"}, + {file = "pydantic_core-2.4.0-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:3fcf529382b282a30b466bd7af05be28e22aa620e016135ac414f14e1ee6b9e1"}, + {file = "pydantic_core-2.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2edef05b63d82568b877002dc4cb5cc18f8929b59077120192df1e03e0c633f8"}, + {file = "pydantic_core-2.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da055a1b0bfa8041bb2ff586b2cb0353ed03944a3472186a02cc44a557a0e661"}, + {file = "pydantic_core-2.4.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:77dadc764cf7c5405e04866181c5bd94a447372a9763e473abb63d1dfe9b7387"}, + {file = "pydantic_core-2.4.0-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:a4ea23b07f29487a7bef2a869f68c7ee0e05424d81375ce3d3de829314c6b5ec"}, + {file = "pydantic_core-2.4.0-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:382f0baa044d674ad59455a5eff83d7965572b745cc72df35c52c2ce8c731d37"}, + {file = "pydantic_core-2.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:08f89697625e453421401c7f661b9d1eb4c9e4c0a12fd256eeb55b06994ac6af"}, + {file = "pydantic_core-2.4.0-pp37-pypy37_pp73-macosx_10_7_x86_64.whl", hash = "sha256:43a405ce520b45941df9ff55d0cd09762017756a7b413bbad3a6e8178e64a2c2"}, + {file = "pydantic_core-2.4.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:584a7a818c84767af16ce8bda5d4f7fedb37d3d231fc89928a192f567e4ef685"}, + {file = "pydantic_core-2.4.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:04922fea7b13cd480586fa106345fe06e43220b8327358873c22d8dfa7a711c7"}, + {file = "pydantic_core-2.4.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17156abac20a9feed10feec867fddd91a80819a485b0107fe61f09f2117fe5f3"}, + {file = "pydantic_core-2.4.0-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4e562cc63b04636cde361fd47569162f1daa94c759220ff202a8129902229114"}, + {file = "pydantic_core-2.4.0-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:90f3785146f701e053bb6b9e8f53acce2c919aca91df88bd4975be0cb926eb41"}, + {file = "pydantic_core-2.4.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:e40b1e97edd3dc127aa53d8a5e539a3d0c227d71574d3f9ac1af02d58218a122"}, + {file = "pydantic_core-2.4.0-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:b27f3e67f6e031f6620655741b7d0d6bebea8b25d415924b3e8bfef2dd7bd841"}, + {file = "pydantic_core-2.4.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be86c2eb12fb0f846262ace9d8f032dc6978b8cb26a058920ecb723dbcb87d05"}, + {file = "pydantic_core-2.4.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4665f7ed345012a8d2eddf4203ef145f5f56a291d010382d235b94e91813f88a"}, + {file = "pydantic_core-2.4.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:79262be5a292d1df060f29b9a7cdd66934801f987a817632d7552534a172709a"}, + {file = "pydantic_core-2.4.0-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:5fd905a69ac74eaba5041e21a1e8b1a479dab2b41c93bdcc4c1cede3c12a8d86"}, + {file = "pydantic_core-2.4.0-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:2ad538b7e07343001934417cdc8584623b4d8823c5b8b258e75ec8d327cec969"}, + {file = "pydantic_core-2.4.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:dd2429f7635ad4857b5881503f9c310be7761dc681c467a9d27787b674d1250a"}, + {file = "pydantic_core-2.4.0-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:efff8b6761a1f6e45cebd1b7a6406eb2723d2d5710ff0d1b624fe11313693989"}, + {file = "pydantic_core-2.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32a1e0352558cd7ccc014ffe818c7d87b15ec6145875e2cc5fa4bb7351a1033d"}, + {file = "pydantic_core-2.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a027f41c5008571314861744d83aff75a34cf3a07022e0be32b214a5bc93f7f1"}, + {file = "pydantic_core-2.4.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1927f0e15d190f11f0b8344373731e28fd774c6d676d8a6cfadc95c77214a48b"}, + {file = "pydantic_core-2.4.0-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:7aa82d483d5fb867d4fb10a138ffd57b0f1644e99f2f4f336e48790ada9ada5e"}, + {file = "pydantic_core-2.4.0-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b85778308bf945e9b33ac604e6793df9b07933108d20bdf53811bc7c2798a4af"}, + {file = "pydantic_core-2.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3ded19dcaefe2f6706d81e0db787b59095f4ad0fbadce1edffdf092294c8a23f"}, + {file = "pydantic_core-2.4.0.tar.gz", hash = "sha256:ec3473c9789cc00c7260d840c3db2c16dbfc816ca70ec87a00cddfa3e1a1cdd5"}, +] + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" + +[[package]] +name = "pydantic-settings" +version = "2.0.2" +description = "Settings management using Pydantic" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pydantic_settings-2.0.2-py3-none-any.whl", hash = "sha256:6183a2abeab465d5a3ab69758e9a22d38b0cc2ba193f0b85f6971a252ea630f6"}, + {file = "pydantic_settings-2.0.2.tar.gz", hash = "sha256:342337fff50b23585e807a86dec85037900972364435c55c2fc00d16ff080539"}, +] + +[package.dependencies] +pydantic = ">=2.0.1" +python-dotenv = ">=0.21.0" + +[[package]] +name = "pyflakes" +version = "3.1.0" +description = "passive checker of Python programs" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyflakes-3.1.0-py2.py3-none-any.whl", hash = "sha256:4132f6d49cb4dae6819e5379898f2b8cce3c5f23994194c24b77d5da2e36f774"}, + {file = "pyflakes-3.1.0.tar.gz", hash = "sha256:a0aae034c444db0071aa077972ba4768d40c830d9539fd45bf4cd3f8f6992efc"}, +] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-dotenv" +version = "1.0.0" +description = "Read key-value pairs from a .env file and set them as environment variables" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python-dotenv-1.0.0.tar.gz", hash = "sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba"}, + {file = "python_dotenv-1.0.0-py3-none-any.whl", hash = "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a"}, +] + +[package.extras] +cli = ["click (>=5.0)"] + +[[package]] +name = "pytz" +version = "2023.3" +description = "World timezone definitions, modern and historical" +optional = false +python-versions = "*" +files = [ + {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"}, + {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"}, +] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "sniffio" +version = "1.3.0" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, + {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, +] + +[[package]] +name = "sqlalchemy" +version = "2.0.19" +description = "Database Abstraction Library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "SQLAlchemy-2.0.19-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9deaae357edc2091a9ed5d25e9ee8bba98bcfae454b3911adeaf159c2e9ca9e3"}, + {file = "SQLAlchemy-2.0.19-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0bf0fd65b50a330261ec7fe3d091dfc1c577483c96a9fa1e4323e932961aa1b5"}, + {file = "SQLAlchemy-2.0.19-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d90ccc15ba1baa345796a8fb1965223ca7ded2d235ccbef80a47b85cea2d71a"}, + {file = "SQLAlchemy-2.0.19-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb4e688f6784427e5f9479d1a13617f573de8f7d4aa713ba82813bcd16e259d1"}, + {file = "SQLAlchemy-2.0.19-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:584f66e5e1979a7a00f4935015840be627e31ca29ad13f49a6e51e97a3fb8cae"}, + {file = "SQLAlchemy-2.0.19-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2c69ce70047b801d2aba3e5ff3cba32014558966109fecab0c39d16c18510f15"}, + {file = "SQLAlchemy-2.0.19-cp310-cp310-win32.whl", hash = "sha256:96f0463573469579d32ad0c91929548d78314ef95c210a8115346271beeeaaa2"}, + {file = "SQLAlchemy-2.0.19-cp310-cp310-win_amd64.whl", hash = "sha256:22bafb1da60c24514c141a7ff852b52f9f573fb933b1e6b5263f0daa28ce6db9"}, + {file = "SQLAlchemy-2.0.19-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d6894708eeb81f6d8193e996257223b6bb4041cb05a17cd5cf373ed836ef87a2"}, + {file = "SQLAlchemy-2.0.19-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8f2afd1aafded7362b397581772c670f20ea84d0a780b93a1a1529da7c3d369"}, + {file = "SQLAlchemy-2.0.19-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15afbf5aa76f2241184c1d3b61af1a72ba31ce4161013d7cb5c4c2fca04fd6e"}, + {file = "SQLAlchemy-2.0.19-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fc05b59142445a4efb9c1fd75c334b431d35c304b0e33f4fa0ff1ea4890f92e"}, + {file = "SQLAlchemy-2.0.19-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5831138f0cc06b43edf5f99541c64adf0ab0d41f9a4471fd63b54ae18399e4de"}, + {file = "SQLAlchemy-2.0.19-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3afa8a21a9046917b3a12ffe016ba7ebe7a55a6fc0c7d950beb303c735c3c3ad"}, + {file = "SQLAlchemy-2.0.19-cp311-cp311-win32.whl", hash = "sha256:c896d4e6ab2eba2afa1d56be3d0b936c56d4666e789bfc59d6ae76e9fcf46145"}, + {file = "SQLAlchemy-2.0.19-cp311-cp311-win_amd64.whl", hash = "sha256:024d2f67fb3ec697555e48caeb7147cfe2c08065a4f1a52d93c3d44fc8e6ad1c"}, + {file = "SQLAlchemy-2.0.19-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:89bc2b374ebee1a02fd2eae6fd0570b5ad897ee514e0f84c5c137c942772aa0c"}, + {file = "SQLAlchemy-2.0.19-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd4d410a76c3762511ae075d50f379ae09551d92525aa5bb307f8343bf7c2c12"}, + {file = "SQLAlchemy-2.0.19-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f469f15068cd8351826df4080ffe4cc6377c5bf7d29b5a07b0e717dddb4c7ea2"}, + {file = "SQLAlchemy-2.0.19-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:cda283700c984e699e8ef0fcc5c61f00c9d14b6f65a4f2767c97242513fcdd84"}, + {file = "SQLAlchemy-2.0.19-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:43699eb3f80920cc39a380c159ae21c8a8924fe071bccb68fc509e099420b148"}, + {file = "SQLAlchemy-2.0.19-cp37-cp37m-win32.whl", hash = "sha256:61ada5831db36d897e28eb95f0f81814525e0d7927fb51145526c4e63174920b"}, + {file = "SQLAlchemy-2.0.19-cp37-cp37m-win_amd64.whl", hash = "sha256:57d100a421d9ab4874f51285c059003292433c648df6abe6c9c904e5bd5b0828"}, + {file = "SQLAlchemy-2.0.19-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:16a310f5bc75a5b2ce7cb656d0e76eb13440b8354f927ff15cbaddd2523ee2d1"}, + {file = "SQLAlchemy-2.0.19-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cf7b5e3856cbf1876da4e9d9715546fa26b6e0ba1a682d5ed2fc3ca4c7c3ec5b"}, + {file = "SQLAlchemy-2.0.19-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e7b69d9ced4b53310a87117824b23c509c6fc1f692aa7272d47561347e133b6"}, + {file = "SQLAlchemy-2.0.19-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f9eb4575bfa5afc4b066528302bf12083da3175f71b64a43a7c0badda2be365"}, + {file = "SQLAlchemy-2.0.19-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6b54d1ad7a162857bb7c8ef689049c7cd9eae2f38864fc096d62ae10bc100c7d"}, + {file = "SQLAlchemy-2.0.19-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5d6afc41ca0ecf373366fd8e10aee2797128d3ae45eb8467b19da4899bcd1ee0"}, + {file = "SQLAlchemy-2.0.19-cp38-cp38-win32.whl", hash = "sha256:430614f18443b58ceb9dedec323ecddc0abb2b34e79d03503b5a7579cd73a531"}, + {file = "SQLAlchemy-2.0.19-cp38-cp38-win_amd64.whl", hash = "sha256:eb60699de43ba1a1f77363f563bb2c652f7748127ba3a774f7cf2c7804aa0d3d"}, + {file = "SQLAlchemy-2.0.19-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a752b7a9aceb0ba173955d4f780c64ee15a1a991f1c52d307d6215c6c73b3a4c"}, + {file = "SQLAlchemy-2.0.19-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7351c05db355da112e056a7b731253cbeffab9dfdb3be1e895368513c7d70106"}, + {file = "SQLAlchemy-2.0.19-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa51ce4aea583b0c6b426f4b0563d3535c1c75986c4373a0987d84d22376585b"}, + {file = "SQLAlchemy-2.0.19-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae7473a67cd82a41decfea58c0eac581209a0aa30f8bc9190926fbf628bb17f7"}, + {file = "SQLAlchemy-2.0.19-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:851a37898a8a39783aab603c7348eb5b20d83c76a14766a43f56e6ad422d1ec8"}, + {file = "SQLAlchemy-2.0.19-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:539010665c90e60c4a1650afe4ab49ca100c74e6aef882466f1de6471d414be7"}, + {file = "SQLAlchemy-2.0.19-cp39-cp39-win32.whl", hash = "sha256:f82c310ddf97b04e1392c33cf9a70909e0ae10a7e2ddc1d64495e3abdc5d19fb"}, + {file = "SQLAlchemy-2.0.19-cp39-cp39-win_amd64.whl", hash = "sha256:8e712cfd2e07b801bc6b60fdf64853bc2bd0af33ca8fa46166a23fe11ce0dbb0"}, + {file = "SQLAlchemy-2.0.19-py3-none-any.whl", hash = "sha256:314145c1389b021a9ad5aa3a18bac6f5d939f9087d7fc5443be28cba19d2c972"}, + {file = "SQLAlchemy-2.0.19.tar.gz", hash = "sha256:77a14fa20264af73ddcdb1e2b9c5a829b8cc6b8304d0f093271980e36c200a3f"}, +] + +[package.dependencies] +greenlet = {version = "!=0.4.17", markers = "platform_machine == \"win32\" or platform_machine == \"WIN32\" or platform_machine == \"AMD64\" or platform_machine == \"amd64\" or platform_machine == \"x86_64\" or platform_machine == \"ppc64le\" or platform_machine == \"aarch64\""} +typing-extensions = ">=4.2.0" + +[package.extras] +aiomysql = ["aiomysql", "greenlet (!=0.4.17)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing-extensions (!=3.10.0.1)"] +asyncio = ["greenlet (!=0.4.17)"] +asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5)"] +mssql = ["pyodbc"] +mssql-pymssql = ["pymssql"] +mssql-pyodbc = ["pyodbc"] +mypy = ["mypy (>=0.910)"] +mysql = ["mysqlclient (>=1.4.0)"] +mysql-connector = ["mysql-connector-python"] +oracle = ["cx-oracle (>=7)"] +oracle-oracledb = ["oracledb (>=1.0.1)"] +postgresql = ["psycopg2 (>=2.7)"] +postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] +postgresql-pg8000 = ["pg8000 (>=1.29.1)"] +postgresql-psycopg = ["psycopg (>=3.0.7)"] +postgresql-psycopg2binary = ["psycopg2-binary"] +postgresql-psycopg2cffi = ["psycopg2cffi"] +postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] +pymysql = ["pymysql"] +sqlcipher = ["sqlcipher3-binary"] + +[[package]] +name = "starlette" +version = "0.27.0" +description = "The little ASGI library that shines." +optional = false +python-versions = ">=3.7" +files = [ + {file = "starlette-0.27.0-py3-none-any.whl", hash = "sha256:918416370e846586541235ccd38a474c08b80443ed31c578a418e2209b3eef91"}, + {file = "starlette-0.27.0.tar.gz", hash = "sha256:6a6b0d042acb8d469a01eba54e9cda6cbd24ac602c4cd016723117d6a7e73b75"}, +] + +[package.dependencies] +anyio = ">=3.4.0,<5" + +[package.extras] +full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyaml"] + +[[package]] +name = "typing-extensions" +version = "4.7.1" +description = "Backported and Experimental Type Hints for Python 3.7+" +optional = false +python-versions = ">=3.7" +files = [ + {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, + {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, +] + +[[package]] +name = "tzdata" +version = "2023.3" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +files = [ + {file = "tzdata-2023.3-py2.py3-none-any.whl", hash = "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda"}, + {file = "tzdata-2023.3.tar.gz", hash = "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a"}, +] + +[[package]] +name = "uvicorn" +version = "0.23.2" +description = "The lightning-fast ASGI server." +optional = false +python-versions = ">=3.8" +files = [ + {file = "uvicorn-0.23.2-py3-none-any.whl", hash = "sha256:1f9be6558f01239d4fdf22ef8126c39cb1ad0addf76c40e760549d2c2f43ab53"}, + {file = "uvicorn-0.23.2.tar.gz", hash = "sha256:4d3cc12d7727ba72b64d12d3cc7743124074c0a69f7b201512fc50c3e3f1569a"}, +] + +[package.dependencies] +click = ">=7.0" +h11 = ">=0.8" + +[package.extras] +standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] + +[metadata] +lock-version = "2.0" +python-versions = "^3.11" +content-hash = "234bde5720cd08c3bd69b9883a31177fd774ea451d9f421f0499f539a067013c" diff --git a/etl/pyproject.toml b/etl/pyproject.toml new file mode 100644 index 00000000..4cef3dbd --- /dev/null +++ b/etl/pyproject.toml @@ -0,0 +1,23 @@ +[tool.poetry] +name = "etl" +version = "0.1.0" +description = "" +authors = ["Your Name "] +readme = "README.md" + +[tool.poetry.dependencies] +python = "^3.11" +fastapi = "^0.100.1" +uvicorn = "^0.23.2" +flake8 = "^6.1.0" +black = "^23.7.0" +sqlalchemy = "^2.0.19" +python-dotenv = "^1.0.0" +pandas = "^2.0.3" +psycopg2-binary = "^2.9.5" +pydantic-settings = "^2.0.2" + + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/etl/start.sh b/etl/start.sh new file mode 100644 index 00000000..bf84485e --- /dev/null +++ b/etl/start.sh @@ -0,0 +1,4 @@ +#! /usr/bin/env bash + +# Start the backend server +uvicorn app.main:app --host 0.0.0.0 --port 8000 diff --git a/frontend-beheer/.env b/frontend-beheer/.env deleted file mode 100644 index 1bd15da3..00000000 --- a/frontend-beheer/.env +++ /dev/null @@ -1,2 +0,0 @@ -VITE_BASE_URL='/webformulier' -VITE_APP_NAME='Algoritmeregister webformulier' diff --git a/frontend-beheer/.env.dummy b/frontend-beheer/.env.dummy deleted file mode 100644 index 31c68068..00000000 --- a/frontend-beheer/.env.dummy +++ /dev/null @@ -1,2 +0,0 @@ -VITE_BASE_URL='/webformulier' -VITE_APP_NAME= \ No newline at end of file diff --git a/frontend-beheer/.gitignore b/frontend-beheer/.gitignore index 403adbc1..616a2ade 100644 --- a/frontend-beheer/.gitignore +++ b/frontend-beheer/.gitignore @@ -1,6 +1,7 @@ .DS_Store node_modules /dist +*.css.map # local env files diff --git a/frontend-beheer/Dockerfile b/frontend-beheer/Dockerfile index 6049f8dd..a1145ade 100644 --- a/frontend-beheer/Dockerfile +++ b/frontend-beheer/Dockerfile @@ -1,6 +1,7 @@ FROM harbor.cicd.s15m.nl/ocw-lsp-pub/nginxinc/nginx-unprivileged:1.21.6-alpine_lsp USER root + RUN apk update RUN apk upgrade RUN rm /etc/nginx/conf.d/default.conf diff --git a/frontend-beheer/nginx/nginx.conf b/frontend-beheer/nginx/nginx.conf index ebb45842..c5ff4589 100644 --- a/frontend-beheer/nginx/nginx.conf +++ b/frontend-beheer/nginx/nginx.conf @@ -25,7 +25,7 @@ http { } add_header X-Frame-Options "SAMEORIGIN" always; add_header X-Content-Type-Options nosniff always; - add_header Content-Security-Policy "default-src 'self'; connect-src 'self'; img-src 'self' data:; form-action 'self'; frame-ancestors 'self'; script-src 'self'; object-src 'self'; font-src 'self' https://cdn.jsdelivr.net https://fonts.gstatic.com; style-src 'self' https://cdn.jsdelivr.net https://fonts.googleapis.com 'nonce-eQw4j9WgXcB'" always; + add_header Content-Security-Policy "default-src 'self'; connect-src 'self' https://svc.webspellchecker.net/api; img-src 'self' data:; form-action 'self'; frame-ancestors 'self'; script-src 'self' https://svc.webspellchecker.net/api; object-src 'self'; font-src 'self' https://cdn.jsdelivr.net https://fonts.gstatic.com; style-src 'self' https://cdn.jsdelivr.net https://fonts.googleapis.com 'nonce-eQw4j9WgXcB'" always; add_header Referrer-Policy "no-referrer, strict-origin-when-cross-origin" always; add_header Permissions-Policy "geolocation=(),midi=(),sync-xhr=(),microphone=(),camera=(),magnetometer=(),gyroscope=(),fullscreen=(self),payment=()" always; } diff --git a/frontend-beheer/package-lock.json b/frontend-beheer/package-lock.json index 5723ed98..b7b2668a 100644 --- a/frontend-beheer/package-lock.json +++ b/frontend-beheer/package-lock.json @@ -1,7 +1,7 @@ { "name": "frontend-beheer", "version": "0.0.0", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -10,11 +10,13 @@ "dependencies": { "@mdi/font": "7.0.96", "@vueuse/core": "^9.13.0", + "@webspellchecker/wproofreader-sdk-js": "^1.0.2", "axios": "^1.3.4", "keycloak-js": "^21.0.1", "pinia": "^2.0.23", + "primevue": "^3.40.1", + "quill": "^1.3.7", "roboto-fontface": "*", - "sass": "^1.59.3", "vue": "^3.2.38", "vue-router": "^4.0.0", "vuetify": "^3.1.11", @@ -22,14 +24,17 @@ }, "devDependencies": { "@types/node": "^18.11.9", + "@types/quill": "^2.0.14", "@types/webfontloader": "^1.6.35", "@vitejs/plugin-vue": "^3.0.3", "@vue/eslint-config-typescript": "^11.0.0", "eslint": "^8.7.0", "eslint-plugin-vue": "^9.3.0", "prettier": "^2.5.1", + "sass": "^1.63.3", "typescript": "^4.0.0", "vite": "^3.0.9", + "vite-plugin-sass": "^0.1.0", "vite-plugin-vuetify": "^1.0.0-alpha.12", "vue-eslint-parser": "^8.0.0", "vue-tsc": "^1.0.9" @@ -37,7 +42,7 @@ }, "node_modules/@babel/parser": { "version": "7.21.4", - "integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==", + "license": "MIT", "bin": { "parser": "bin/babel-parser.js" }, @@ -47,8 +52,8 @@ }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, + "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.3.0" }, @@ -61,16 +66,16 @@ }, "node_modules/@eslint-community/regexpp": { "version": "4.5.0", - "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { "version": "2.0.2", - "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -91,16 +96,16 @@ }, "node_modules/@eslint/js": { "version": "8.37.0", - "integrity": "sha512-x5vzdtOOGgFVDCUs81QRB2+liax8rFg3+7hqM+QhBG0/G3F1ZsoYl97UrqgHgQ9KKT7G6c4V+aTUCgu/n22v1A==", "dev": true, + "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.8", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", @@ -112,8 +117,8 @@ }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -124,17 +129,17 @@ }, "node_modules/@humanwhocodes/object-schema": { "version": "1.2.1", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@mdi/font": { "version": "7.0.96", - "integrity": "sha512-rzlxTfR64hqY8yiBzDjmANfcd8rv+T5C0Yedv/TWk2QyAQYdc66e0kaN1ipmnYU3RukHRTRcBARHzzm+tIhL7w==" + "license": "Apache-2.0" }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -145,16 +150,16 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -165,33 +170,62 @@ }, "node_modules/@types/json-schema": { "version": "7.0.11", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/node": { "version": "18.15.11", - "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==", - "devOptional": true + "devOptional": true, + "license": "MIT" + }, + "node_modules/@types/quill": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@types/quill/-/quill-2.0.14.tgz", + "integrity": "sha512-zvoXCRnc2Dl8g+7/9VSAmRWPN6oH+MVhTPizmCR+GJCITplZ5VRVzMs4+a/nOE3yzNwEZqylJJrMB07bwbM1/g==", + "dev": true, + "dependencies": { + "parchment": "^1.1.2", + "quill-delta": "^5.1.0" + } + }, + "node_modules/@types/quill/node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "node_modules/@types/quill/node_modules/quill-delta": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-5.1.0.tgz", + "integrity": "sha512-X74oCeRI4/p0ucjb5Ma8adTXd9Scumz367kkMK5V/IatcX6A0vlgLgKbzXWy5nZmCGeNJm2oQX0d2Eqj+ZIlCA==", + "dev": true, + "dependencies": { + "fast-diff": "^1.3.0", + "lodash.clonedeep": "^4.5.0", + "lodash.isequal": "^4.5.0" + }, + "engines": { + "node": ">= 12.0.0" + } }, "node_modules/@types/semver": { "version": "7.3.13", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/web-bluetooth": { "version": "0.0.16", - "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", - "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==" + "license": "MIT" }, "node_modules/@types/webfontloader": { "version": "1.6.35", - "integrity": "sha512-IJlrsiDWq6KghQ7tPlL5tcwSUyOxLDceT+AFUY7Ylj0Fcv3/h3QkANqQxZ0B5mEpEKxhTw76vDmvrruSMV9n9Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "5.57.0", - "integrity": "sha512-itag0qpN6q2UMM6Xgk6xoHa0D0/P+M17THnr4SVgqn9Rgam5k/He33MA7/D7QoJcdMxHFyX7U9imaBonAX/6qA==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.4.0", "@typescript-eslint/scope-manager": "5.57.0", @@ -223,8 +257,8 @@ }, "node_modules/@typescript-eslint/parser": { "version": "5.57.0", - "integrity": "sha512-orrduvpWYkgLCyAdNtR1QIWovcNZlEm6yL8nwH/eTxWLd8gsP+25pdLHYzL2QdkqrieaDwLpytHqycncv0woUQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/scope-manager": "5.57.0", "@typescript-eslint/types": "5.57.0", @@ -249,8 +283,8 @@ }, "node_modules/@typescript-eslint/scope-manager": { "version": "5.57.0", - "integrity": "sha512-NANBNOQvllPlizl9LatX8+MHi7bx7WGIWYjPHDmQe5Si/0YEYfxSljJpoTyTWFTgRy3X8gLYSE4xQ2U+aCozSw==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "5.57.0", "@typescript-eslint/visitor-keys": "5.57.0" @@ -265,8 +299,8 @@ }, "node_modules/@typescript-eslint/type-utils": { "version": "5.57.0", - "integrity": "sha512-kxXoq9zOTbvqzLbdNKy1yFrxLC6GDJFE2Yuo3KqSwTmDOFjUGeWSakgoXT864WcK5/NAJkkONCiKb1ddsqhLXQ==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/typescript-estree": "5.57.0", "@typescript-eslint/utils": "5.57.0", @@ -291,8 +325,8 @@ }, "node_modules/@typescript-eslint/types": { "version": "5.57.0", - "integrity": "sha512-mxsod+aZRSyLT+jiqHw1KK6xrANm19/+VFALVFP5qa/aiJnlP38qpyaTd0fEKhWvQk6YeNZ5LGwI1pDpBRBhtQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -303,8 +337,8 @@ }, "node_modules/@typescript-eslint/typescript-estree": { "version": "5.57.0", - "integrity": "sha512-LTzQ23TV82KpO8HPnWuxM2V7ieXW8O142I7hQTxWIHDcCEIjtkat6H96PFkYBQqGFLW/G/eVVOB9Z8rcvdY/Vw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/types": "5.57.0", "@typescript-eslint/visitor-keys": "5.57.0", @@ -329,8 +363,8 @@ }, "node_modules/@typescript-eslint/utils": { "version": "5.57.0", - "integrity": "sha512-ps/4WohXV7C+LTSgAL5CApxvxbMkl9B9AUZRtnEFonpIxZDIT7wC1xfvuJONMidrkB9scs4zhtRyIwHh4+18kw==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", @@ -354,8 +388,8 @@ }, "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { "version": "5.1.1", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -366,16 +400,16 @@ }, "node_modules/@typescript-eslint/utils/node_modules/estraverse": { "version": "4.3.0", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/@typescript-eslint/visitor-keys": { "version": "5.57.0", - "integrity": "sha512-ery2g3k0hv5BLiKpPuwYt9KBkAp2ugT6VvyShXdLOkax895EC55sP0Tx5L0fZaQueiK3fBLvHVvEl3jFS5ia+g==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "5.57.0", "eslint-visitor-keys": "^3.3.0" @@ -390,8 +424,8 @@ }, "node_modules/@vitejs/plugin-vue": { "version": "3.2.0", - "integrity": "sha512-E0tnaL4fr+qkdCNxJ+Xd0yM31UwMkQje76fsDVBBUCoGOUPexu2VDUYHL8P4CwV+zMvWw6nlRw19OnRKmYAJpw==", "dev": true, + "license": "MIT", "engines": { "node": "^14.18.0 || >=16.0.0" }, @@ -402,32 +436,32 @@ }, "node_modules/@volar/language-core": { "version": "1.3.0-alpha.0", - "integrity": "sha512-W3uMzecHPcbwddPu4SJpUcPakRBK/y/BP+U0U6NiPpUX1tONLC4yCawt+QBJqtgJ+sfD6ztf5PyvPL3hQRqfOA==", "dev": true, + "license": "MIT", "dependencies": { "@volar/source-map": "1.3.0-alpha.0" } }, "node_modules/@volar/source-map": { "version": "1.3.0-alpha.0", - "integrity": "sha512-jSdizxWFvDTvkPYZnO6ew3sBZUnS0abKCbuopkc0JrIlFbznWC/fPH3iPFIMS8/IIkRxq1Jh9VVG60SmtsdaMQ==", "dev": true, + "license": "MIT", "dependencies": { "muggle-string": "^0.2.2" } }, "node_modules/@volar/typescript": { "version": "1.3.0-alpha.0", - "integrity": "sha512-5UItyW2cdH2mBLu4RrECRNJRgtvvzKrSCn2y3v/D61QwIDkGx4aeil6x8RFuUL5TFtV6QvVHXnsOHxNgd+sCow==", "dev": true, + "license": "MIT", "dependencies": { "@volar/language-core": "1.3.0-alpha.0" } }, "node_modules/@volar/vue-language-core": { "version": "1.2.0", - "integrity": "sha512-w7yEiaITh2WzKe6u8ZdeLKCUz43wdmY/OqAmsB/PGDvvhTcVhCJ6f0W/RprZL1IhqH8wALoWiwEh/Wer7ZviMQ==", "dev": true, + "license": "MIT", "dependencies": { "@volar/language-core": "1.3.0-alpha.0", "@volar/source-map": "1.3.0-alpha.0", @@ -442,16 +476,16 @@ }, "node_modules/@volar/vue-language-core/node_modules/brace-expansion": { "version": "2.0.1", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/@volar/vue-language-core/node_modules/minimatch": { "version": "6.2.0", - "integrity": "sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -464,8 +498,8 @@ }, "node_modules/@volar/vue-typescript": { "version": "1.2.0", - "integrity": "sha512-zjmRi9y3J1EkG+pfuHp8IbHmibihrKK485cfzsHjiuvJMGrpkWvlO5WVEk8oslMxxeGC5XwBFE9AOlvh378EPA==", "dev": true, + "license": "MIT", "dependencies": { "@volar/typescript": "1.3.0-alpha.0", "@volar/vue-language-core": "1.2.0" @@ -473,7 +507,7 @@ }, "node_modules/@vue/compiler-core": { "version": "3.2.47", - "integrity": "sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==", + "license": "MIT", "dependencies": { "@babel/parser": "^7.16.4", "@vue/shared": "3.2.47", @@ -483,7 +517,7 @@ }, "node_modules/@vue/compiler-dom": { "version": "3.2.47", - "integrity": "sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==", + "license": "MIT", "dependencies": { "@vue/compiler-core": "3.2.47", "@vue/shared": "3.2.47" @@ -491,7 +525,7 @@ }, "node_modules/@vue/compiler-sfc": { "version": "3.2.47", - "integrity": "sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==", + "license": "MIT", "dependencies": { "@babel/parser": "^7.16.4", "@vue/compiler-core": "3.2.47", @@ -507,7 +541,7 @@ }, "node_modules/@vue/compiler-ssr": { "version": "3.2.47", - "integrity": "sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==", + "license": "MIT", "dependencies": { "@vue/compiler-dom": "3.2.47", "@vue/shared": "3.2.47" @@ -515,12 +549,12 @@ }, "node_modules/@vue/devtools-api": { "version": "6.5.0", - "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==" + "license": "MIT" }, "node_modules/@vue/eslint-config-typescript": { "version": "11.0.2", - "integrity": "sha512-EiKud1NqlWmSapBFkeSrE994qpKx7/27uCGnhdqzllYDpQZroyX/O6bwjEpeuyKamvLbsGdO6PMR2faIf+zFnw==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/eslint-plugin": "^5.0.0", "@typescript-eslint/parser": "^5.0.0", @@ -542,8 +576,8 @@ }, "node_modules/@vue/eslint-config-typescript/node_modules/vue-eslint-parser": { "version": "9.1.1", - "integrity": "sha512-C2aI/r85Q6tYcz4dpgvrs4wH/MqVrRAVIdpYedrxnATDHHkb+TroeRcDpKWGZCx/OcECMWfz7tVwQ8e+Opy6rA==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.3.4", "eslint-scope": "^7.1.1", @@ -565,14 +599,14 @@ }, "node_modules/@vue/reactivity": { "version": "3.2.47", - "integrity": "sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==", + "license": "MIT", "dependencies": { "@vue/shared": "3.2.47" } }, "node_modules/@vue/reactivity-transform": { "version": "3.2.47", - "integrity": "sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==", + "license": "MIT", "dependencies": { "@babel/parser": "^7.16.4", "@vue/compiler-core": "3.2.47", @@ -583,7 +617,7 @@ }, "node_modules/@vue/runtime-core": { "version": "3.2.47", - "integrity": "sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==", + "license": "MIT", "dependencies": { "@vue/reactivity": "3.2.47", "@vue/shared": "3.2.47" @@ -591,7 +625,7 @@ }, "node_modules/@vue/runtime-dom": { "version": "3.2.47", - "integrity": "sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==", + "license": "MIT", "dependencies": { "@vue/runtime-core": "3.2.47", "@vue/shared": "3.2.47", @@ -600,7 +634,7 @@ }, "node_modules/@vue/server-renderer": { "version": "3.2.47", - "integrity": "sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==", + "license": "MIT", "dependencies": { "@vue/compiler-ssr": "3.2.47", "@vue/shared": "3.2.47" @@ -611,12 +645,12 @@ }, "node_modules/@vue/shared": { "version": "3.2.47", - "integrity": "sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==" + "license": "MIT" }, "node_modules/@vuetify/loader-shared": { "version": "1.7.1", - "integrity": "sha512-kLUvuAed6RCvkeeTNJzuy14pqnkur8lTuner7v7pNE/kVhPR97TuyXwBSBMR1cJeiLiOfu6SF5XlCYbXByEx1g==", "devOptional": true, + "license": "MIT", "dependencies": { "find-cache-dir": "^3.3.2", "upath": "^2.0.1" @@ -628,8 +662,7 @@ }, "node_modules/@vueuse/core": { "version": "9.13.0", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.13.0.tgz", - "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==", + "license": "MIT", "dependencies": { "@types/web-bluetooth": "^0.0.16", "@vueuse/metadata": "9.13.0", @@ -642,16 +675,14 @@ }, "node_modules/@vueuse/metadata": { "version": "9.13.0", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.13.0.tgz", - "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@vueuse/shared": { "version": "9.13.0", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.13.0.tgz", - "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==", + "license": "MIT", "dependencies": { "vue-demi": "*" }, @@ -659,10 +690,15 @@ "url": "https://github.com/sponsors/antfu" } }, + "node_modules/@webspellchecker/wproofreader-sdk-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@webspellchecker/wproofreader-sdk-js/-/wproofreader-sdk-js-1.0.2.tgz", + "integrity": "sha512-0woPAttYGm7PVVrRMs+wqVMC9xeUEjslPENAgKNN4b0qrenSu2Y8VidmChFrlLFyAMRgVuNILz+XHR1xGBl6Bg==" + }, "node_modules/acorn": { "version": "8.8.2", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -672,16 +708,16 @@ }, "node_modules/acorn-jsx": { "version": "5.3.2", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/ajv": { "version": "6.12.6", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -695,16 +731,16 @@ }, "node_modules/ansi-regex": { "version": "5.0.1", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/ansi-styles": { "version": "4.3.0", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -717,7 +753,8 @@ }, "node_modules/anymatch": { "version": "3.1.3", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "devOptional": true, + "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -728,24 +765,25 @@ }, "node_modules/argparse": { "version": "2.0.1", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "dev": true, + "license": "Python-2.0" }, "node_modules/array-union": { "version": "2.1.0", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/asynckit": { "version": "0.4.0", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "license": "MIT" }, "node_modules/axios": { - "version": "1.3.4", - "integrity": "sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", + "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", "dependencies": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -754,12 +792,11 @@ }, "node_modules/balanced-match": { "version": "1.0.2", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/base64-js": { "version": "1.5.1", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "funding": [ { "type": "github", @@ -773,24 +810,26 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/binary-extensions": { "version": "2.2.0", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "devOptional": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/boolbase": { "version": "1.0.0", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/brace-expansion": { "version": "1.1.11", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -798,7 +837,8 @@ }, "node_modules/braces": { "version": "3.0.2", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "devOptional": true, + "license": "MIT", "dependencies": { "fill-range": "^7.0.1" }, @@ -806,18 +846,31 @@ "node": ">=8" } }, + "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==", + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/callsites": { "version": "3.1.0", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/chalk": { "version": "4.1.2", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -831,13 +884,14 @@ }, "node_modules/chokidar": { "version": "3.5.3", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "devOptional": true, "funding": [ { "type": "individual", "url": "https://paulmillr.com/funding/" } ], + "license": "MIT", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -854,10 +908,18 @@ "fsevents": "~2.3.2" } }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "engines": { + "node": ">=0.8" + } + }, "node_modules/color-convert": { "version": "2.0.1", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -867,12 +929,12 @@ }, "node_modules/color-name": { "version": "1.1.4", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/combined-stream": { "version": "1.0.8", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -882,18 +944,18 @@ }, "node_modules/commondir": { "version": "1.0.1", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cross-spawn": { "version": "7.0.3", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -905,8 +967,8 @@ }, "node_modules/cssesc": { "version": "3.0.0", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true, + "license": "MIT", "bin": { "cssesc": "bin/cssesc" }, @@ -916,17 +978,17 @@ }, "node_modules/csstype": { "version": "2.6.21", - "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" + "license": "MIT" }, "node_modules/de-indent": { "version": "1.0.2", - "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/debug": { "version": "4.3.4", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "devOptional": true, + "license": "MIT", "dependencies": { "ms": "2.1.2" }, @@ -939,22 +1001,70 @@ } } }, + "node_modules/deep-equal": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz", + "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==", + "dependencies": { + "is-arguments": "^1.1.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.5.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/deep-is": { "version": "0.1.4", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "dev": true, + "license": "MIT" + }, + "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==", + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/delayed-stream": { "version": "1.0.0", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/dir-glob": { "version": "3.0.1", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, + "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -964,8 +1074,8 @@ }, "node_modules/doctrine": { "version": "3.0.0", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -975,9 +1085,9 @@ }, "node_modules/esbuild": { "version": "0.15.18", - "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", "devOptional": true, "hasInstallScript": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -1011,10 +1121,10 @@ }, "node_modules/esbuild-linux-64": { "version": "0.15.18", - "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -1025,8 +1135,8 @@ }, "node_modules/escape-string-regexp": { "version": "4.0.0", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -1036,8 +1146,8 @@ }, "node_modules/eslint": { "version": "8.37.0", - "integrity": "sha512-NU3Ps9nI05GUoVMxcZx1J8CNR6xOvUT4jAUMH5+z8lpp3aEdPVCImKw6PWG4PY+Vfkpr+jvMpxs/qoE7wq0sPw==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", @@ -1092,8 +1202,8 @@ }, "node_modules/eslint-plugin-vue": { "version": "9.10.0", - "integrity": "sha512-2MgP31OBf8YilUvtakdVMc8xVbcMp7z7/iQj8LHVpXrSXHPXSJRUIGSPFI6b6pyCx/buKaFJ45ycqfHvQRiW2g==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.3.0", "natural-compare": "^1.4.0", @@ -1112,8 +1222,8 @@ }, "node_modules/eslint-plugin-vue/node_modules/vue-eslint-parser": { "version": "9.1.1", - "integrity": "sha512-C2aI/r85Q6tYcz4dpgvrs4wH/MqVrRAVIdpYedrxnATDHHkb+TroeRcDpKWGZCx/OcECMWfz7tVwQ8e+Opy6rA==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.3.4", "eslint-scope": "^7.1.1", @@ -1135,8 +1245,8 @@ }, "node_modules/eslint-scope": { "version": "7.1.1", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -1147,8 +1257,8 @@ }, "node_modules/eslint-visitor-keys": { "version": "3.4.0", - "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -1158,8 +1268,8 @@ }, "node_modules/eslint/node_modules/glob-parent": { "version": "6.0.2", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -1169,8 +1279,8 @@ }, "node_modules/espree": { "version": "9.5.1", - "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", @@ -1185,8 +1295,8 @@ }, "node_modules/esquery": { "version": "1.5.0", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -1196,8 +1306,8 @@ }, "node_modules/esrecurse": { "version": "4.3.0", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -1207,33 +1317,48 @@ }, "node_modules/estraverse": { "version": "5.3.0", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/estree-walker": { "version": "2.0.2", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + "license": "MIT" }, "node_modules/esutils": { "version": "2.0.3", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } }, + "node_modules/eventemitter3": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz", + "integrity": "sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg==" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/fast-diff": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz", + "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==" }, "node_modules/fast-glob": { "version": "3.2.12", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -1247,26 +1372,26 @@ }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fastq": { "version": "1.15.0", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dev": true, + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, "node_modules/file-entry-cache": { "version": "6.0.1", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, + "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" }, @@ -1276,7 +1401,8 @@ }, "node_modules/fill-range": { "version": "7.0.1", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "devOptional": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -1286,8 +1412,8 @@ }, "node_modules/find-cache-dir": { "version": "3.3.2", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "devOptional": true, + "license": "MIT", "dependencies": { "commondir": "^1.0.1", "make-dir": "^3.0.2", @@ -1302,8 +1428,8 @@ }, "node_modules/find-up": { "version": "5.0.0", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -1317,8 +1443,8 @@ }, "node_modules/flat-cache": { "version": "3.0.4", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, + "license": "MIT", "dependencies": { "flatted": "^3.1.0", "rimraf": "^3.0.2" @@ -1329,18 +1455,18 @@ }, "node_modules/flatted": { "version": "3.2.7", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/follow-redirects": { "version": "1.15.2", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -1352,7 +1478,7 @@ }, "node_modules/form-data": { "version": "4.0.0", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -1364,18 +1490,56 @@ }, "node_modules/fs.realpath": { "version": "1.0.0", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "dev": 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==", + "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", - "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==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/glob": { "version": "7.2.3", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -1393,7 +1557,8 @@ }, "node_modules/glob-parent": { "version": "5.1.2", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "devOptional": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -1403,8 +1568,8 @@ }, "node_modules/globals": { "version": "13.20.0", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -1417,8 +1582,8 @@ }, "node_modules/globby": { "version": "11.1.0", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, + "license": "MIT", "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -1434,15 +1599,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/grapheme-splitter": { "version": "1.0.4", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/has": { "version": "1.0.3", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "devOptional": true, + "license": "MIT", "dependencies": { "function-bind": "^1.1.1" }, @@ -1452,36 +1628,95 @@ }, "node_modules/has-flag": { "version": "4.0.0", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, + "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==", + "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", + "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/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/he": { "version": "1.2.0", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, + "license": "MIT", "bin": { "he": "bin/he" } }, "node_modules/ignore": { "version": "5.2.4", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/immutable": { "version": "4.3.0", - "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==" + "devOptional": true, + "license": "MIT" }, "node_modules/import-fresh": { "version": "3.3.0", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -1495,16 +1730,16 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } }, "node_modules/inflight": { "version": "1.0.6", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -1512,12 +1747,28 @@ }, "node_modules/inherits": { "version": "2.0.4", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "dev": true, + "license": "ISC" + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/is-binary-path": { "version": "2.1.0", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "devOptional": true, + "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -1527,8 +1778,8 @@ }, "node_modules/is-core-module": { "version": "2.11.0", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", "devOptional": true, + "license": "MIT", "dependencies": { "has": "^1.0.3" }, @@ -1536,16 +1787,32 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-extglob": { "version": "2.1.1", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "devOptional": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-glob": { "version": "4.0.3", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "devOptional": true, + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -1555,28 +1822,44 @@ }, "node_modules/is-number": { "version": "7.0.0", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "devOptional": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } }, "node_modules/is-path-inside": { "version": "3.0.3", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/isexe": { "version": "2.0.0", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/js-sdsl": { "version": "4.4.0", - "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", "dev": true, + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/js-sdsl" @@ -1584,12 +1867,12 @@ }, "node_modules/js-sha256": { "version": "0.9.0", - "integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==" + "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.0", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -1599,17 +1882,17 @@ }, "node_modules/json-schema-traverse": { "version": "0.4.1", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/keycloak-js": { "version": "21.0.2", - "integrity": "sha512-i05i3VBPhQ867EgjA+OYPlf8YUPiUwtrU2zv4j8tvZIdRvhJY8f+mp1ZvRJl/GMRb+XhJs9BDknyBMrIspwDkw==", + "license": "Apache-2.0", "dependencies": { "base64-js": "^1.5.1", "js-sha256": "^0.9.0" @@ -1617,8 +1900,8 @@ }, "node_modules/levn": { "version": "0.4.1", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -1629,8 +1912,8 @@ }, "node_modules/locate-path": { "version": "6.0.0", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -1643,18 +1926,30 @@ }, "node_modules/lodash": { "version": "4.17.21", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "dev": true + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", "dev": true }, "node_modules/lodash.merge": { "version": "4.6.2", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lru-cache": { "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -1664,15 +1959,15 @@ }, "node_modules/magic-string": { "version": "0.25.9", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "license": "MIT", "dependencies": { "sourcemap-codec": "^1.4.8" } }, "node_modules/make-dir": { "version": "3.1.0", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "devOptional": true, + "license": "MIT", "dependencies": { "semver": "^6.0.0" }, @@ -1684,25 +1979,25 @@ } }, "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", "devOptional": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/merge2": { "version": "1.4.1", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/micromatch": { "version": "4.0.5", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, + "license": "MIT", "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -1713,14 +2008,14 @@ }, "node_modules/mime-db": { "version": "1.52.0", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { "version": "2.1.35", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -1730,8 +2025,8 @@ }, "node_modules/minimatch": { "version": "3.1.2", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -1741,23 +2036,23 @@ }, "node_modules/ms": { "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/muggle-string": { "version": "0.2.2", - "integrity": "sha512-YVE1mIJ4VpUMqZObFndk9CJu6DBJR/GB13p3tXuNbwD4XExaI5EOuRl6BHeIDxIqXZVxSfAC+y6U1Z/IxCfKUg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/nanoid": { "version": "3.3.6", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -1767,25 +2062,26 @@ }, "node_modules/natural-compare": { "version": "1.4.0", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/natural-compare-lite": { "version": "1.4.0", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/normalize-path": { "version": "3.0.0", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "devOptional": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/nth-check": { "version": "2.1.1", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0" }, @@ -1793,18 +2089,41 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/once": { "version": "1.4.0", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, + "license": "ISC", "dependencies": { "wrappy": "1" } }, "node_modules/optionator": { "version": "0.9.1", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "dev": true, + "license": "MIT", "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -1819,8 +2138,8 @@ }, "node_modules/p-limit": { "version": "3.1.0", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -1833,8 +2152,8 @@ }, "node_modules/p-locate": { "version": "5.0.0", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -1847,16 +2166,21 @@ }, "node_modules/p-try": { "version": "2.2.0", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/parchment": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/parchment/-/parchment-1.1.4.tgz", + "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==" + }, "node_modules/parent-module": { "version": "1.0.1", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -1866,48 +2190,49 @@ }, "node_modules/path-exists": { "version": "4.0.0", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/path-is-absolute": { "version": "1.0.1", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/path-key": { "version": "3.1.1", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/path-parse": { "version": "1.0.7", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/path-type": { "version": "4.0.0", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/picocolors": { "version": "1.0.0", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "devOptional": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -1917,7 +2242,7 @@ }, "node_modules/pinia": { "version": "2.0.33", - "integrity": "sha512-HOj1yVV2itw6rNIrR2f7+MirGNxhORjrULL8GWgRwXsGSvEqIQ+SE0MYt6cwtpegzCda3i+rVTZM+AM7CG+kRg==", + "license": "MIT", "dependencies": { "@vue/devtools-api": "^6.5.0", "vue-demi": "*" @@ -1941,8 +2266,8 @@ }, "node_modules/pkg-dir": { "version": "4.2.0", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "devOptional": true, + "license": "MIT", "dependencies": { "find-up": "^4.0.0" }, @@ -1952,8 +2277,8 @@ }, "node_modules/pkg-dir/node_modules/find-up": { "version": "4.1.0", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "devOptional": true, + "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -1964,8 +2289,8 @@ }, "node_modules/pkg-dir/node_modules/locate-path": { "version": "5.0.0", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "devOptional": true, + "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -1975,8 +2300,8 @@ }, "node_modules/pkg-dir/node_modules/p-limit": { "version": "2.3.0", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "devOptional": true, + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -1989,8 +2314,8 @@ }, "node_modules/pkg-dir/node_modules/p-locate": { "version": "4.1.0", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "devOptional": true, + "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -1999,8 +2324,9 @@ } }, "node_modules/postcss": { - "version": "8.4.21", - "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "funding": [ { "type": "opencollective", @@ -2009,10 +2335,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" }, @@ -2022,8 +2352,8 @@ }, "node_modules/postcss-selector-parser": { "version": "6.0.11", - "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", "dev": true, + "license": "MIT", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -2034,16 +2364,16 @@ }, "node_modules/prelude-ls": { "version": "1.2.1", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8.0" } }, "node_modules/prettier": { "version": "2.8.7", - "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", "dev": true, + "license": "MIT", "bin": { "prettier": "bin-prettier.js" }, @@ -2054,21 +2384,28 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/primevue": { + "version": "3.40.1", + "resolved": "https://registry.npmjs.org/primevue/-/primevue-3.40.1.tgz", + "integrity": "sha512-TIFjoSUDiTmlxwQddaWckzcPIpj0F8a6ZMnm0tpAD/ieyUIHnNpbAi5de8LQf8eF0b+x5EkOkdjdngSlD+iPCw==", + "peerDependencies": { + "vue": "^3.0.0" + } + }, "node_modules/proxy-from-env": { "version": "1.1.0", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + "license": "MIT" }, "node_modules/punycode": { "version": "2.3.0", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/queue-microtask": { "version": "1.2.3", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, "funding": [ { @@ -2083,22 +2420,66 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, - "node_modules/readdirp": { - "version": "3.6.0", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "node_modules/quill": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/quill/-/quill-1.3.7.tgz", + "integrity": "sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==", "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { + "clone": "^2.1.1", + "deep-equal": "^1.0.1", + "eventemitter3": "^2.0.3", + "extend": "^3.0.2", + "parchment": "^1.1.4", + "quill-delta": "^3.6.2" + } + }, + "node_modules/quill-delta": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-3.6.3.tgz", + "integrity": "sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==", + "dependencies": { + "deep-equal": "^1.0.1", + "extend": "^3.0.2", + "fast-diff": "1.1.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "devOptional": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { "node": ">=8.10.0" } }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/resolve": { "version": "1.22.1", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", "devOptional": true, + "license": "MIT", "dependencies": { "is-core-module": "^2.9.0", "path-parse": "^1.0.7", @@ -2113,16 +2494,16 @@ }, "node_modules/resolve-from": { "version": "4.0.0", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/reusify": { "version": "1.0.4", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -2130,8 +2511,8 @@ }, "node_modules/rimraf": { "version": "3.0.2", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, + "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -2144,12 +2525,12 @@ }, "node_modules/roboto-fontface": { "version": "0.10.0", - "integrity": "sha512-OlwfYEgA2RdboZohpldlvJ1xngOins5d7ejqnIBWr9KaMxsnBqotpptRXTyfNRLnFpqzX6sTDt+X+a+6udnU8g==" + "license": "Apache-2.0" }, "node_modules/rollup": { "version": "2.79.1", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", "devOptional": true, + "license": "MIT", "bin": { "rollup": "dist/bin/rollup" }, @@ -2162,7 +2543,6 @@ }, "node_modules/run-parallel": { "version": "1.2.0", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "funding": [ { @@ -2178,13 +2558,15 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } }, "node_modules/sass": { - "version": "1.60.0", - "integrity": "sha512-updbwW6fNb5gGm8qMXzVO7V4sWf7LMXnMly/JEyfbfERbVH46Fn6q02BX7/eHTdKpE7d+oTkMMQpFWNUMfFbgQ==", + "version": "1.63.3", + "devOptional": true, + "license": "MIT", "dependencies": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", @@ -2194,13 +2576,13 @@ "sass": "sass.js" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" } }, "node_modules/semver": { - "version": "7.3.8", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", "dev": true, + "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -2211,10 +2593,37 @@ "node": ">=10" } }, + "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==", + "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/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/shebang-command": { "version": "2.0.0", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -2224,43 +2633,42 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/slash": { "version": "3.0.0", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/source-map": { "version": "0.6.1", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-js": { "version": "1.0.2", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/sourcemap-codec": { "version": "1.4.8", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "deprecated": "Please use @jridgewell/sourcemap-codec instead" + "license": "MIT" }, "node_modules/strip-ansi": { "version": "6.0.1", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -2270,8 +2678,8 @@ }, "node_modules/strip-json-comments": { "version": "3.1.1", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -2281,8 +2689,8 @@ }, "node_modules/supports-color": { "version": "7.2.0", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -2292,8 +2700,8 @@ }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "devOptional": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -2303,12 +2711,13 @@ }, "node_modules/text-table": { "version": "0.2.0", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/to-regex-range": { "version": "5.0.1", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "devOptional": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -2318,13 +2727,13 @@ }, "node_modules/tslib": { "version": "1.14.1", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "dev": true, + "license": "0BSD" }, "node_modules/tsutils": { "version": "3.21.0", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "^1.8.1" }, @@ -2337,8 +2746,8 @@ }, "node_modules/type-check": { "version": "0.4.0", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -2348,8 +2757,8 @@ }, "node_modules/type-fest": { "version": "0.20.2", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -2359,8 +2768,8 @@ }, "node_modules/typescript": { "version": "4.9.5", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "devOptional": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -2371,8 +2780,8 @@ }, "node_modules/upath": { "version": "2.0.1", - "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=4", "yarn": "*" @@ -2380,21 +2789,21 @@ }, "node_modules/uri-js": { "version": "4.4.1", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, "node_modules/util-deprecate": { "version": "1.0.2", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/vite": { - "version": "3.2.5", - "integrity": "sha512-4mVEpXpSOgrssFZAOmGIr85wPHKvaDAcXqxVxVRZhljkJOMZi1ibLibzjLHzJvcok8BMguLc7g1W6W/GqZbLdQ==", + "version": "3.2.7", "devOptional": true, + "license": "MIT", "dependencies": { "esbuild": "^0.15.9", "postcss": "^8.4.18", @@ -2439,10 +2848,15 @@ } } }, + "node_modules/vite-plugin-sass": { + "version": "0.1.0", + "dev": true, + "license": "ISC" + }, "node_modules/vite-plugin-vuetify": { "version": "1.0.2", - "integrity": "sha512-MubIcKD33O8wtgQXlbEXE7ccTEpHZ8nPpe77y9Wy3my2MWw/PgehP9VqTp92BLqr0R1dSL970Lynvisx3UxBFw==", "devOptional": true, + "license": "MIT", "dependencies": { "@vuetify/loader-shared": "^1.7.1", "debug": "^4.3.3", @@ -2458,7 +2872,7 @@ }, "node_modules/vue": { "version": "3.2.47", - "integrity": "sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==", + "license": "MIT", "dependencies": { "@vue/compiler-dom": "3.2.47", "@vue/compiler-sfc": "3.2.47", @@ -2469,8 +2883,8 @@ }, "node_modules/vue-demi": { "version": "0.13.11", - "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==", "hasInstallScript": true, + "license": "MIT", "bin": { "vue-demi-fix": "bin/vue-demi-fix.js", "vue-demi-switch": "bin/vue-demi-switch.js" @@ -2493,8 +2907,8 @@ }, "node_modules/vue-eslint-parser": { "version": "8.3.0", - "integrity": "sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.3.2", "eslint-scope": "^7.0.0", @@ -2516,7 +2930,7 @@ }, "node_modules/vue-router": { "version": "4.1.6", - "integrity": "sha512-DYWYwsG6xNPmLq/FmZn8Ip+qrhFEzA14EI12MsMgVxvHFDYvlr4NXpVF5hrRH1wVcDP8fGi5F4rxuJSl8/r+EQ==", + "license": "MIT", "dependencies": { "@vue/devtools-api": "^6.4.5" }, @@ -2529,8 +2943,8 @@ }, "node_modules/vue-template-compiler": { "version": "2.7.14", - "integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==", "dev": true, + "license": "MIT", "dependencies": { "de-indent": "^1.0.2", "he": "^1.2.0" @@ -2538,8 +2952,8 @@ }, "node_modules/vue-tsc": { "version": "1.2.0", - "integrity": "sha512-rIlzqdrhyPYyLG9zxsVRa+JEseeS9s8F2BbVVVWRRsTZvJO2BbhLEb2HW3MY+DFma0378tnIqs+vfTzbcQtRFw==", "dev": true, + "license": "MIT", "dependencies": { "@volar/vue-language-core": "1.2.0", "@volar/vue-typescript": "1.2.0" @@ -2553,7 +2967,7 @@ }, "node_modules/vuetify": { "version": "3.1.12", - "integrity": "sha512-6SOMWzNtziDdi/Noeg0l9Q5o20amIuqmj9V5W8fV1nCNdQUZsi6mt9iN+UcfjqwAaALS/z5Nbd4v5OJxy8M4Rw==", + "license": "MIT", "engines": { "node": "^12.20 || >=14.13" }, @@ -2581,12 +2995,12 @@ }, "node_modules/webfontloader": { "version": "1.6.28", - "integrity": "sha512-Egb0oFEga6f+nSgasH3E0M405Pzn6y3/9tOVanv/DLfa1YBIgcv90L18YyWnvXkRbIM17v5Kv6IT2N6g1x5tvQ==" + "license": "Apache-2.0" }, "node_modules/which": { "version": "2.0.2", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -2598,35 +3012,35 @@ } }, "node_modules/word-wrap": { - "version": "1.2.3", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "version": "1.2.5", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/wrappy": { "version": "1.0.2", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/xml-name-validator": { "version": "4.0.0", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12" } }, "node_modules/yallist": { "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/yocto-queue": { "version": "0.1.0", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -2634,1736 +3048,5 @@ "url": "https://github.com/sponsors/sindresorhus" } } - }, - "dependencies": { - "@babel/parser": { - "version": "7.21.4", - "integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==" - }, - "@eslint-community/eslint-utils": { - "version": "4.4.0", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^3.3.0" - } - }, - "@eslint-community/regexpp": { - "version": "4.5.0", - "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", - "dev": true - }, - "@eslint/eslintrc": { - "version": "2.0.2", - "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.5.1", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - } - }, - "@eslint/js": { - "version": "8.37.0", - "integrity": "sha512-x5vzdtOOGgFVDCUs81QRB2+liax8rFg3+7hqM+QhBG0/G3F1ZsoYl97UrqgHgQ9KKT7G6c4V+aTUCgu/n22v1A==", - "dev": true - }, - "@humanwhocodes/config-array": { - "version": "0.11.8", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - } - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@mdi/font": { - "version": "7.0.96", - "integrity": "sha512-rzlxTfR64hqY8yiBzDjmANfcd8rv+T5C0Yedv/TWk2QyAQYdc66e0kaN1ipmnYU3RukHRTRcBARHzzm+tIhL7w==" - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "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", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@types/json-schema": { - "version": "7.0.11", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "@types/node": { - "version": "18.15.11", - "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==", - "devOptional": true - }, - "@types/semver": { - "version": "7.3.13", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", - "dev": true - }, - "@types/web-bluetooth": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", - "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==" - }, - "@types/webfontloader": { - "version": "1.6.35", - "integrity": "sha512-IJlrsiDWq6KghQ7tPlL5tcwSUyOxLDceT+AFUY7Ylj0Fcv3/h3QkANqQxZ0B5mEpEKxhTw76vDmvrruSMV9n9Q==", - "dev": true - }, - "@typescript-eslint/eslint-plugin": { - "version": "5.57.0", - "integrity": "sha512-itag0qpN6q2UMM6Xgk6xoHa0D0/P+M17THnr4SVgqn9Rgam5k/He33MA7/D7QoJcdMxHFyX7U9imaBonAX/6qA==", - "dev": true, - "requires": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.57.0", - "@typescript-eslint/type-utils": "5.57.0", - "@typescript-eslint/utils": "5.57.0", - "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/parser": { - "version": "5.57.0", - "integrity": "sha512-orrduvpWYkgLCyAdNtR1QIWovcNZlEm6yL8nwH/eTxWLd8gsP+25pdLHYzL2QdkqrieaDwLpytHqycncv0woUQ==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.57.0", - "@typescript-eslint/types": "5.57.0", - "@typescript-eslint/typescript-estree": "5.57.0", - "debug": "^4.3.4" - } - }, - "@typescript-eslint/scope-manager": { - "version": "5.57.0", - "integrity": "sha512-NANBNOQvllPlizl9LatX8+MHi7bx7WGIWYjPHDmQe5Si/0YEYfxSljJpoTyTWFTgRy3X8gLYSE4xQ2U+aCozSw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.57.0", - "@typescript-eslint/visitor-keys": "5.57.0" - } - }, - "@typescript-eslint/type-utils": { - "version": "5.57.0", - "integrity": "sha512-kxXoq9zOTbvqzLbdNKy1yFrxLC6GDJFE2Yuo3KqSwTmDOFjUGeWSakgoXT864WcK5/NAJkkONCiKb1ddsqhLXQ==", - "dev": true, - "requires": { - "@typescript-eslint/typescript-estree": "5.57.0", - "@typescript-eslint/utils": "5.57.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/types": { - "version": "5.57.0", - "integrity": "sha512-mxsod+aZRSyLT+jiqHw1KK6xrANm19/+VFALVFP5qa/aiJnlP38qpyaTd0fEKhWvQk6YeNZ5LGwI1pDpBRBhtQ==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.57.0", - "integrity": "sha512-LTzQ23TV82KpO8HPnWuxM2V7ieXW8O142I7hQTxWIHDcCEIjtkat6H96PFkYBQqGFLW/G/eVVOB9Z8rcvdY/Vw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.57.0", - "@typescript-eslint/visitor-keys": "5.57.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/utils": { - "version": "5.57.0", - "integrity": "sha512-ps/4WohXV7C+LTSgAL5CApxvxbMkl9B9AUZRtnEFonpIxZDIT7wC1xfvuJONMidrkB9scs4zhtRyIwHh4+18kw==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.57.0", - "@typescript-eslint/types": "5.57.0", - "@typescript-eslint/typescript-estree": "5.57.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "dependencies": { - "eslint-scope": { - "version": "5.1.1", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "estraverse": { - "version": "4.3.0", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - } - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.57.0", - "integrity": "sha512-ery2g3k0hv5BLiKpPuwYt9KBkAp2ugT6VvyShXdLOkax895EC55sP0Tx5L0fZaQueiK3fBLvHVvEl3jFS5ia+g==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.57.0", - "eslint-visitor-keys": "^3.3.0" - } - }, - "@vitejs/plugin-vue": { - "version": "3.2.0", - "integrity": "sha512-E0tnaL4fr+qkdCNxJ+Xd0yM31UwMkQje76fsDVBBUCoGOUPexu2VDUYHL8P4CwV+zMvWw6nlRw19OnRKmYAJpw==", - "dev": true, - "requires": {} - }, - "@volar/language-core": { - "version": "1.3.0-alpha.0", - "integrity": "sha512-W3uMzecHPcbwddPu4SJpUcPakRBK/y/BP+U0U6NiPpUX1tONLC4yCawt+QBJqtgJ+sfD6ztf5PyvPL3hQRqfOA==", - "dev": true, - "requires": { - "@volar/source-map": "1.3.0-alpha.0" - } - }, - "@volar/source-map": { - "version": "1.3.0-alpha.0", - "integrity": "sha512-jSdizxWFvDTvkPYZnO6ew3sBZUnS0abKCbuopkc0JrIlFbznWC/fPH3iPFIMS8/IIkRxq1Jh9VVG60SmtsdaMQ==", - "dev": true, - "requires": { - "muggle-string": "^0.2.2" - } - }, - "@volar/typescript": { - "version": "1.3.0-alpha.0", - "integrity": "sha512-5UItyW2cdH2mBLu4RrECRNJRgtvvzKrSCn2y3v/D61QwIDkGx4aeil6x8RFuUL5TFtV6QvVHXnsOHxNgd+sCow==", - "dev": true, - "requires": { - "@volar/language-core": "1.3.0-alpha.0" - } - }, - "@volar/vue-language-core": { - "version": "1.2.0", - "integrity": "sha512-w7yEiaITh2WzKe6u8ZdeLKCUz43wdmY/OqAmsB/PGDvvhTcVhCJ6f0W/RprZL1IhqH8wALoWiwEh/Wer7ZviMQ==", - "dev": true, - "requires": { - "@volar/language-core": "1.3.0-alpha.0", - "@volar/source-map": "1.3.0-alpha.0", - "@vue/compiler-dom": "^3.2.47", - "@vue/compiler-sfc": "^3.2.47", - "@vue/reactivity": "^3.2.47", - "@vue/shared": "^3.2.47", - "minimatch": "^6.1.6", - "muggle-string": "^0.2.2", - "vue-template-compiler": "^2.7.14" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "6.2.0", - "integrity": "sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "@volar/vue-typescript": { - "version": "1.2.0", - "integrity": "sha512-zjmRi9y3J1EkG+pfuHp8IbHmibihrKK485cfzsHjiuvJMGrpkWvlO5WVEk8oslMxxeGC5XwBFE9AOlvh378EPA==", - "dev": true, - "requires": { - "@volar/typescript": "1.3.0-alpha.0", - "@volar/vue-language-core": "1.2.0" - } - }, - "@vue/compiler-core": { - "version": "3.2.47", - "integrity": "sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==", - "requires": { - "@babel/parser": "^7.16.4", - "@vue/shared": "3.2.47", - "estree-walker": "^2.0.2", - "source-map": "^0.6.1" - } - }, - "@vue/compiler-dom": { - "version": "3.2.47", - "integrity": "sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==", - "requires": { - "@vue/compiler-core": "3.2.47", - "@vue/shared": "3.2.47" - } - }, - "@vue/compiler-sfc": { - "version": "3.2.47", - "integrity": "sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==", - "requires": { - "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.47", - "@vue/compiler-dom": "3.2.47", - "@vue/compiler-ssr": "3.2.47", - "@vue/reactivity-transform": "3.2.47", - "@vue/shared": "3.2.47", - "estree-walker": "^2.0.2", - "magic-string": "^0.25.7", - "postcss": "^8.1.10", - "source-map": "^0.6.1" - } - }, - "@vue/compiler-ssr": { - "version": "3.2.47", - "integrity": "sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==", - "requires": { - "@vue/compiler-dom": "3.2.47", - "@vue/shared": "3.2.47" - } - }, - "@vue/devtools-api": { - "version": "6.5.0", - "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==" - }, - "@vue/eslint-config-typescript": { - "version": "11.0.2", - "integrity": "sha512-EiKud1NqlWmSapBFkeSrE994qpKx7/27uCGnhdqzllYDpQZroyX/O6bwjEpeuyKamvLbsGdO6PMR2faIf+zFnw==", - "dev": true, - "requires": { - "@typescript-eslint/eslint-plugin": "^5.0.0", - "@typescript-eslint/parser": "^5.0.0", - "vue-eslint-parser": "^9.0.0" - }, - "dependencies": { - "vue-eslint-parser": { - "version": "9.1.1", - "integrity": "sha512-C2aI/r85Q6tYcz4dpgvrs4wH/MqVrRAVIdpYedrxnATDHHkb+TroeRcDpKWGZCx/OcECMWfz7tVwQ8e+Opy6rA==", - "dev": true, - "requires": { - "debug": "^4.3.4", - "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.1", - "esquery": "^1.4.0", - "lodash": "^4.17.21", - "semver": "^7.3.6" - } - } - } - }, - "@vue/reactivity": { - "version": "3.2.47", - "integrity": "sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==", - "requires": { - "@vue/shared": "3.2.47" - } - }, - "@vue/reactivity-transform": { - "version": "3.2.47", - "integrity": "sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==", - "requires": { - "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.47", - "@vue/shared": "3.2.47", - "estree-walker": "^2.0.2", - "magic-string": "^0.25.7" - } - }, - "@vue/runtime-core": { - "version": "3.2.47", - "integrity": "sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==", - "requires": { - "@vue/reactivity": "3.2.47", - "@vue/shared": "3.2.47" - } - }, - "@vue/runtime-dom": { - "version": "3.2.47", - "integrity": "sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==", - "requires": { - "@vue/runtime-core": "3.2.47", - "@vue/shared": "3.2.47", - "csstype": "^2.6.8" - } - }, - "@vue/server-renderer": { - "version": "3.2.47", - "integrity": "sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==", - "requires": { - "@vue/compiler-ssr": "3.2.47", - "@vue/shared": "3.2.47" - } - }, - "@vue/shared": { - "version": "3.2.47", - "integrity": "sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==" - }, - "@vuetify/loader-shared": { - "version": "1.7.1", - "integrity": "sha512-kLUvuAed6RCvkeeTNJzuy14pqnkur8lTuner7v7pNE/kVhPR97TuyXwBSBMR1cJeiLiOfu6SF5XlCYbXByEx1g==", - "devOptional": true, - "requires": { - "find-cache-dir": "^3.3.2", - "upath": "^2.0.1" - } - }, - "@vueuse/core": { - "version": "9.13.0", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.13.0.tgz", - "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==", - "requires": { - "@types/web-bluetooth": "^0.0.16", - "@vueuse/metadata": "9.13.0", - "@vueuse/shared": "9.13.0", - "vue-demi": "*" - } - }, - "@vueuse/metadata": { - "version": "9.13.0", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.13.0.tgz", - "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==" - }, - "@vueuse/shared": { - "version": "9.13.0", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.13.0.tgz", - "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==", - "requires": { - "vue-demi": "*" - } - }, - "acorn": { - "version": "8.8.2", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "ajv": { - "version": "6.12.6", - "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" - } - }, - "ansi-regex": { - "version": "5.0.1", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.3", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "argparse": { - "version": "2.0.1", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "array-union": { - "version": "2.1.0", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "axios": { - "version": "1.3.4", - "integrity": "sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==", - "requires": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "base64-js": { - "version": "1.5.1", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, - "binary-extensions": { - "version": "2.2.0", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" - }, - "boolbase": { - "version": "1.0.0", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "chokidar": { - "version": "3.5.3", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "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" - } - }, - "color-convert": { - "version": "2.0.1", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commondir": { - "version": "1.0.1", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "devOptional": true - }, - "concat-map": { - "version": "0.0.1", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "cssesc": { - "version": "3.0.0", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "csstype": { - "version": "2.6.21", - "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" - }, - "de-indent": { - "version": "1.0.2", - "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", - "dev": true - }, - "debug": { - "version": "4.3.4", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "devOptional": true, - "requires": { - "ms": "2.1.2" - } - }, - "deep-is": { - "version": "0.1.4", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" - }, - "dir-glob": { - "version": "3.0.1", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "esbuild": { - "version": "0.15.18", - "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", - "devOptional": true, - "requires": { - "@esbuild/android-arm": "0.15.18", - "@esbuild/linux-loong64": "0.15.18", - "esbuild-android-64": "0.15.18", - "esbuild-android-arm64": "0.15.18", - "esbuild-darwin-64": "0.15.18", - "esbuild-darwin-arm64": "0.15.18", - "esbuild-freebsd-64": "0.15.18", - "esbuild-freebsd-arm64": "0.15.18", - "esbuild-linux-32": "0.15.18", - "esbuild-linux-64": "0.15.18", - "esbuild-linux-arm": "0.15.18", - "esbuild-linux-arm64": "0.15.18", - "esbuild-linux-mips64le": "0.15.18", - "esbuild-linux-ppc64le": "0.15.18", - "esbuild-linux-riscv64": "0.15.18", - "esbuild-linux-s390x": "0.15.18", - "esbuild-netbsd-64": "0.15.18", - "esbuild-openbsd-64": "0.15.18", - "esbuild-sunos-64": "0.15.18", - "esbuild-windows-32": "0.15.18", - "esbuild-windows-64": "0.15.18", - "esbuild-windows-arm64": "0.15.18" - } - }, - "esbuild-linux-64": { - "version": "0.15.18", - "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==", - "optional": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint": { - "version": "8.37.0", - "integrity": "sha512-NU3Ps9nI05GUoVMxcZx1J8CNR6xOvUT4jAUMH5+z8lpp3aEdPVCImKw6PWG4PY+Vfkpr+jvMpxs/qoE7wq0sPw==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.2", - "@eslint/js": "8.37.0", - "@humanwhocodes/config-array": "^0.11.8", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.4.0", - "espree": "^9.5.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "dependencies": { - "glob-parent": { - "version": "6.0.2", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - } - } - }, - "eslint-plugin-vue": { - "version": "9.10.0", - "integrity": "sha512-2MgP31OBf8YilUvtakdVMc8xVbcMp7z7/iQj8LHVpXrSXHPXSJRUIGSPFI6b6pyCx/buKaFJ45ycqfHvQRiW2g==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.3.0", - "natural-compare": "^1.4.0", - "nth-check": "^2.0.1", - "postcss-selector-parser": "^6.0.9", - "semver": "^7.3.5", - "vue-eslint-parser": "^9.0.1", - "xml-name-validator": "^4.0.0" - }, - "dependencies": { - "vue-eslint-parser": { - "version": "9.1.1", - "integrity": "sha512-C2aI/r85Q6tYcz4dpgvrs4wH/MqVrRAVIdpYedrxnATDHHkb+TroeRcDpKWGZCx/OcECMWfz7tVwQ8e+Opy6rA==", - "dev": true, - "requires": { - "debug": "^4.3.4", - "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.1", - "esquery": "^1.4.0", - "lodash": "^4.17.21", - "semver": "^7.3.6" - } - } - } - }, - "eslint-scope": { - "version": "7.1.1", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "eslint-visitor-keys": { - "version": "3.4.0", - "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", - "dev": true - }, - "espree": { - "version": "9.5.1", - "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", - "dev": true, - "requires": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.0" - } - }, - "esquery": { - "version": "1.5.0", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "estree-walker": { - "version": "2.0.2", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" - }, - "esutils": { - "version": "2.0.3", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-glob": { - "version": "3.2.12", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "fastq": { - "version": "1.15.0", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-cache-dir": { - "version": "3.3.2", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "devOptional": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "find-up": { - "version": "5.0.0", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat-cache": { - "version": "3.0.4", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.7", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "follow-redirects": { - "version": "1.15.2", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" - }, - "form-data": { - "version": "4.0.0", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "fs.realpath": { - "version": "1.0.0", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "function-bind": { - "version": "1.1.1", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "devOptional": true - }, - "glob": { - "version": "7.2.3", - "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" - } - }, - "glob-parent": { - "version": "5.1.2", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "13.20.0", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globby": { - "version": "11.1.0", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "grapheme-splitter": { - "version": "1.0.4", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "has": { - "version": "1.0.3", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "devOptional": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "he": { - "version": "1.2.0", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "ignore": { - "version": "5.2.4", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true - }, - "immutable": { - "version": "4.3.0", - "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==" - }, - "import-fresh": { - "version": "3.3.0", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "is-binary-path": { - "version": "2.1.0", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.11.0", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "devOptional": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-extglob": { - "version": "2.1.1", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" - }, - "is-glob": { - "version": "4.0.3", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "is-path-inside": { - "version": "3.0.3", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "js-sdsl": { - "version": "4.4.0", - "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", - "dev": true - }, - "js-sha256": { - "version": "0.9.0", - "integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==" - }, - "js-yaml": { - "version": "4.1.0", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "keycloak-js": { - "version": "21.0.2", - "integrity": "sha512-i05i3VBPhQ867EgjA+OYPlf8YUPiUwtrU2zv4j8tvZIdRvhJY8f+mp1ZvRJl/GMRb+XhJs9BDknyBMrIspwDkw==", - "requires": { - "base64-js": "^1.5.1", - "js-sha256": "^0.9.0" - } - }, - "levn": { - "version": "0.4.1", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "locate-path": { - "version": "6.0.0", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "magic-string": { - "version": "0.25.9", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "requires": { - "sourcemap-codec": "^1.4.8" - } - }, - "make-dir": { - "version": "3.1.0", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "devOptional": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "devOptional": true - } - } - }, - "merge2": { - "version": "1.4.1", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime-db": { - "version": "1.52.0", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - }, - "minimatch": { - "version": "3.1.2", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "ms": { - "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "devOptional": true - }, - "muggle-string": { - "version": "0.2.2", - "integrity": "sha512-YVE1mIJ4VpUMqZObFndk9CJu6DBJR/GB13p3tXuNbwD4XExaI5EOuRl6BHeIDxIqXZVxSfAC+y6U1Z/IxCfKUg==", - "dev": true - }, - "nanoid": { - "version": "3.3.6", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==" - }, - "natural-compare": { - "version": "1.4.0", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "natural-compare-lite": { - "version": "1.4.0", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "nth-check": { - "version": "2.1.1", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "requires": { - "boolbase": "^1.0.0" - } - }, - "once": { - "version": "1.4.0", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "optionator": { - "version": "0.9.1", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "p-limit": { - "version": "3.1.0", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "p-try": { - "version": "2.2.0", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "devOptional": true - }, - "parent-module": { - "version": "1.0.1", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "path-exists": { - "version": "4.0.0", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "devOptional": true - }, - "path-is-absolute": { - "version": "1.0.1", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "devOptional": true - }, - "path-type": { - "version": "4.0.0", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "picomatch": { - "version": "2.3.1", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" - }, - "pinia": { - "version": "2.0.33", - "integrity": "sha512-HOj1yVV2itw6rNIrR2f7+MirGNxhORjrULL8GWgRwXsGSvEqIQ+SE0MYt6cwtpegzCda3i+rVTZM+AM7CG+kRg==", - "requires": { - "@vue/devtools-api": "^6.5.0", - "vue-demi": "*" - } - }, - "pkg-dir": { - "version": "4.2.0", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "devOptional": true, - "requires": { - "find-up": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "devOptional": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "devOptional": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "devOptional": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "devOptional": true, - "requires": { - "p-limit": "^2.2.0" - } - } - } - }, - "postcss": { - "version": "8.4.21", - "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", - "requires": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "postcss-selector-parser": { - "version": "6.0.11", - "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "prelude-ls": { - "version": "1.2.1", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "prettier": { - "version": "2.8.7", - "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", - "dev": true - }, - "proxy-from-env": { - "version": "1.1.0", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "punycode": { - "version": "2.3.0", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "readdirp": { - "version": "3.6.0", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "requires": { - "picomatch": "^2.2.1" - } - }, - "resolve": { - "version": "1.22.1", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "devOptional": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-from": { - "version": "4.0.0", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "roboto-fontface": { - "version": "0.10.0", - "integrity": "sha512-OlwfYEgA2RdboZohpldlvJ1xngOins5d7ejqnIBWr9KaMxsnBqotpptRXTyfNRLnFpqzX6sTDt+X+a+6udnU8g==" - }, - "rollup": { - "version": "2.79.1", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", - "devOptional": true, - "requires": { - "fsevents": "~2.3.2" - } - }, - "run-parallel": { - "version": "1.2.0", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "sass": { - "version": "1.60.0", - "integrity": "sha512-updbwW6fNb5gGm8qMXzVO7V4sWf7LMXnMly/JEyfbfERbVH46Fn6q02BX7/eHTdKpE7d+oTkMMQpFWNUMfFbgQ==", - "requires": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - } - }, - "semver": { - "version": "7.3.8", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "shebang-command": { - "version": "2.0.0", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "source-map-js": { - "version": "1.0.2", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" - }, - "sourcemap-codec": { - "version": "1.4.8", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" - }, - "strip-ansi": { - "version": "6.0.1", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "devOptional": true - }, - "text-table": { - "version": "0.2.0", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - }, - "tslib": { - "version": "1.14.1", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "type-check": { - "version": "0.4.0", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.20.2", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "typescript": { - "version": "4.9.5", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "devOptional": true - }, - "upath": { - "version": "2.0.1", - "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", - "devOptional": true - }, - "uri-js": { - "version": "4.4.1", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "vite": { - "version": "3.2.5", - "integrity": "sha512-4mVEpXpSOgrssFZAOmGIr85wPHKvaDAcXqxVxVRZhljkJOMZi1ibLibzjLHzJvcok8BMguLc7g1W6W/GqZbLdQ==", - "devOptional": true, - "requires": { - "esbuild": "^0.15.9", - "fsevents": "~2.3.2", - "postcss": "^8.4.18", - "resolve": "^1.22.1", - "rollup": "^2.79.1" - } - }, - "vite-plugin-vuetify": { - "version": "1.0.2", - "integrity": "sha512-MubIcKD33O8wtgQXlbEXE7ccTEpHZ8nPpe77y9Wy3my2MWw/PgehP9VqTp92BLqr0R1dSL970Lynvisx3UxBFw==", - "devOptional": true, - "requires": { - "@vuetify/loader-shared": "^1.7.1", - "debug": "^4.3.3", - "upath": "^2.0.1" - } - }, - "vue": { - "version": "3.2.47", - "integrity": "sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==", - "requires": { - "@vue/compiler-dom": "3.2.47", - "@vue/compiler-sfc": "3.2.47", - "@vue/runtime-dom": "3.2.47", - "@vue/server-renderer": "3.2.47", - "@vue/shared": "3.2.47" - } - }, - "vue-demi": { - "version": "0.13.11", - "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==", - "requires": {} - }, - "vue-eslint-parser": { - "version": "8.3.0", - "integrity": "sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==", - "dev": true, - "requires": { - "debug": "^4.3.2", - "eslint-scope": "^7.0.0", - "eslint-visitor-keys": "^3.1.0", - "espree": "^9.0.0", - "esquery": "^1.4.0", - "lodash": "^4.17.21", - "semver": "^7.3.5" - } - }, - "vue-router": { - "version": "4.1.6", - "integrity": "sha512-DYWYwsG6xNPmLq/FmZn8Ip+qrhFEzA14EI12MsMgVxvHFDYvlr4NXpVF5hrRH1wVcDP8fGi5F4rxuJSl8/r+EQ==", - "requires": { - "@vue/devtools-api": "^6.4.5" - } - }, - "vue-template-compiler": { - "version": "2.7.14", - "integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==", - "dev": true, - "requires": { - "de-indent": "^1.0.2", - "he": "^1.2.0" - } - }, - "vue-tsc": { - "version": "1.2.0", - "integrity": "sha512-rIlzqdrhyPYyLG9zxsVRa+JEseeS9s8F2BbVVVWRRsTZvJO2BbhLEb2HW3MY+DFma0378tnIqs+vfTzbcQtRFw==", - "dev": true, - "requires": { - "@volar/vue-language-core": "1.2.0", - "@volar/vue-typescript": "1.2.0" - } - }, - "vuetify": { - "version": "3.1.12", - "integrity": "sha512-6SOMWzNtziDdi/Noeg0l9Q5o20amIuqmj9V5W8fV1nCNdQUZsi6mt9iN+UcfjqwAaALS/z5Nbd4v5OJxy8M4Rw==", - "requires": {} - }, - "webfontloader": { - "version": "1.6.28", - "integrity": "sha512-Egb0oFEga6f+nSgasH3E0M405Pzn6y3/9tOVanv/DLfa1YBIgcv90L18YyWnvXkRbIM17v5Kv6IT2N6g1x5tvQ==" - }, - "which": { - "version": "2.0.2", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "word-wrap": { - "version": "1.2.3", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "xml-name-validator": { - "version": "4.0.0", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - } } } diff --git a/frontend-beheer/package.json b/frontend-beheer/package.json index 5de9d200..22911273 100644 --- a/frontend-beheer/package.json +++ b/frontend-beheer/package.json @@ -10,11 +10,13 @@ "dependencies": { "@mdi/font": "7.0.96", "@vueuse/core": "^9.13.0", + "@webspellchecker/wproofreader-sdk-js": "^1.0.2", "axios": "^1.3.4", "keycloak-js": "^21.0.1", "pinia": "^2.0.23", + "primevue": "^3.40.1", + "quill": "^1.3.7", "roboto-fontface": "*", - "sass": "^1.59.3", "vue": "^3.2.38", "vue-router": "^4.0.0", "vuetify": "^3.1.11", @@ -22,14 +24,17 @@ }, "devDependencies": { "@types/node": "^18.11.9", + "@types/quill": "^2.0.14", "@types/webfontloader": "^1.6.35", "@vitejs/plugin-vue": "^3.0.3", "@vue/eslint-config-typescript": "^11.0.0", "eslint": "^8.7.0", "eslint-plugin-vue": "^9.3.0", "prettier": "^2.5.1", + "sass": "^1.63.3", "typescript": "^4.0.0", "vite": "^3.0.9", + "vite-plugin-sass": "^0.1.0", "vite-plugin-vuetify": "^1.0.0-alpha.12", "vue-eslint-parser": "^8.0.0", "vue-tsc": "^1.0.9" diff --git a/frontend-beheer/src/App.vue b/frontend-beheer/src/App.vue index 9969bb25..7fa95993 100644 --- a/frontend-beheer/src/App.vue +++ b/frontend-beheer/src/App.vue @@ -13,29 +13,32 @@ import AppHeader from '@/components/layout/AppHeader.vue' import AppFooter from '@/components/layout/AppFooter.vue' import { useLocalStorage } from '@vueuse/core' -import { Organization } from './types' +import { Organisation } from './types/organisation' import { useAuthStore } from './store/auth' +import { onMounted } from 'vue' const authStore = useAuthStore() -// Handle pre-selected organization from cookie. -const localStorage = useLocalStorage( +// Handle pre-selected organisation from cookie. +const localStorage = useLocalStorage( 'webform-selected-org', - {} as Organization | null + {} as Organisation | null ).value -if (authStore.organizations.length != 0) { + +onMounted(async () => { + await authStore.fetchOrganisations() if (localStorage) { try { - authStore.selectOrganization(localStorage.id) + authStore.selectOrganisation(localStorage.code) } catch { // localStorage does not match authorization, default to first authorised org. - authStore.selectedOrg = authStore.organizations[0]! + authStore.selectedOrg = authStore.organisations[0]! } } else { // First time user, no localStorage. - authStore.selectedOrg = authStore.organizations[0]! + authStore.selectedOrg = authStore.organisations[0]! } -} +}) diff --git a/frontend-beheer/src/components/ExternalLink.vue b/frontend-beheer/src/components/ExternalLink.vue index ea0270f2..6764cfee 100644 --- a/frontend-beheer/src/components/ExternalLink.vue +++ b/frontend-beheer/src/components/ExternalLink.vue @@ -1,7 +1,10 @@ diff --git a/frontend-beheer/src/components/FormField.vue b/frontend-beheer/src/components/FormField.vue deleted file mode 100644 index ad9588ed..00000000 --- a/frontend-beheer/src/components/FormField.vue +++ /dev/null @@ -1,244 +0,0 @@ - - - - - diff --git a/frontend-beheer/src/components/FormFieldInput.vue b/frontend-beheer/src/components/FormFieldInput.vue new file mode 100644 index 00000000..d970150f --- /dev/null +++ b/frontend-beheer/src/components/FormFieldInput.vue @@ -0,0 +1,139 @@ + + + + + diff --git a/frontend-beheer/src/components/FormFieldWrapper.vue b/frontend-beheer/src/components/FormFieldWrapper.vue new file mode 100644 index 00000000..5dad82e9 --- /dev/null +++ b/frontend-beheer/src/components/FormFieldWrapper.vue @@ -0,0 +1,189 @@ + + + + + + + diff --git a/frontend-beheer/src/components/FormHeader.vue b/frontend-beheer/src/components/FormHeader.vue deleted file mode 100644 index 0db394ae..00000000 --- a/frontend-beheer/src/components/FormHeader.vue +++ /dev/null @@ -1,13 +0,0 @@ - - - diff --git a/frontend-beheer/src/components/FormSideBlock.vue b/frontend-beheer/src/components/FormSideBlock.vue index 870167c1..1cbd93ab 100644 --- a/frontend-beheer/src/components/FormSideBlock.vue +++ b/frontend-beheer/src/components/FormSideBlock.vue @@ -5,15 +5,19 @@ border class="pl-3 pa-4" > + + - - - - - Via de knop Opslaan en voorbeeld opent eenmalig het - Algoritmeregister met deze invoer. Zo kan je het algoritme even in - de context bekijken en controleren. Let op: deze link verloopt - direct. - - - - - - - * Onder ieder invoerveld staat een instructie , wanneer je - het veld bewerkt. achter ieder invulveld staat een vraagtekenicoon, - hier kan je de helptekst bekijken die bezoekers bij het - Algoritmeregister kunnen lezen. De kolom Zichtbaar geeft - aan of het betreffende veld in het Algoritmeregister getoond wordt: - als zo'n veld niet door de organisatie ingevuld word, tonen we dan - 'Veld niet ingevuld' in het Algoritmeregister. Zie de - - handleiding - - voor alle informatie. - - - - + + diff --git a/frontend-beheer/src/components/OrganisationDialog.vue b/frontend-beheer/src/components/OrganisationDialog.vue new file mode 100644 index 00000000..a64effb1 --- /dev/null +++ b/frontend-beheer/src/components/OrganisationDialog.vue @@ -0,0 +1,103 @@ + + + + + diff --git a/frontend-beheer/src/components/QualityInspector/ScoreDisplay.vue b/frontend-beheer/src/components/QualityInspector/ScoreDisplay.vue new file mode 100644 index 00000000..e9e22b5d --- /dev/null +++ b/frontend-beheer/src/components/QualityInspector/ScoreDisplay.vue @@ -0,0 +1,21 @@ + + + + + diff --git a/frontend-beheer/src/components/QualityInspector/ScoreSummaryBlock.vue b/frontend-beheer/src/components/QualityInspector/ScoreSummaryBlock.vue new file mode 100644 index 00000000..97db8677 --- /dev/null +++ b/frontend-beheer/src/components/QualityInspector/ScoreSummaryBlock.vue @@ -0,0 +1,43 @@ + + + + + diff --git a/frontend-beheer/src/components/QualityInspector/index.vue b/frontend-beheer/src/components/QualityInspector/index.vue new file mode 100644 index 00000000..b9d8fd15 --- /dev/null +++ b/frontend-beheer/src/components/QualityInspector/index.vue @@ -0,0 +1,28 @@ + + + diff --git a/frontend-beheer/src/components/RuleInterface.vue b/frontend-beheer/src/components/RuleInterface.vue new file mode 100644 index 00000000..1a5720e8 --- /dev/null +++ b/frontend-beheer/src/components/RuleInterface.vue @@ -0,0 +1,189 @@ + + + + + diff --git a/frontend-beheer/src/components/RuleListing.vue b/frontend-beheer/src/components/RuleListing.vue new file mode 100644 index 00000000..dede9d1c --- /dev/null +++ b/frontend-beheer/src/components/RuleListing.vue @@ -0,0 +1,25 @@ + + + diff --git a/frontend-beheer/src/components/TemplatesDialog.vue b/frontend-beheer/src/components/TemplatesDialog.vue new file mode 100644 index 00000000..9323cfc0 --- /dev/null +++ b/frontend-beheer/src/components/TemplatesDialog.vue @@ -0,0 +1,146 @@ + + + + + diff --git a/frontend-beheer/src/components/editor/EditorFeedback.vue b/frontend-beheer/src/components/editor/EditorFeedback.vue new file mode 100644 index 00000000..9b43372f --- /dev/null +++ b/frontend-beheer/src/components/editor/EditorFeedback.vue @@ -0,0 +1,42 @@ + + + + + diff --git a/frontend-beheer/src/components/editor/EditorField.vue b/frontend-beheer/src/components/editor/EditorField.vue new file mode 100644 index 00000000..49024547 --- /dev/null +++ b/frontend-beheer/src/components/editor/EditorField.vue @@ -0,0 +1,143 @@ + + + + + diff --git a/frontend-beheer/src/components/editor/EditorToolbar.vue b/frontend-beheer/src/components/editor/EditorToolbar.vue new file mode 100644 index 00000000..89015d64 --- /dev/null +++ b/frontend-beheer/src/components/editor/EditorToolbar.vue @@ -0,0 +1,17 @@ + + + diff --git a/frontend-beheer/src/components/layout/AppHeader.vue b/frontend-beheer/src/components/layout/AppHeader.vue index 3e1ee466..8cd53995 100644 --- a/frontend-beheer/src/components/layout/AppHeader.vue +++ b/frontend-beheer/src/components/layout/AppHeader.vue @@ -15,7 +15,7 @@ - +
@@ -54,13 +54,11 @@ watch( ) const allBreadcrumbs: Record = { 'algorithm.index': [], - 'algorithm.create': [{ text: 'Algoritme aanmaken', to: '#' }], - 'algorithm.edit': [{ text: 'Algoritme bewerken', to: '#' }], + 'algorithm.create': [{ title: 'Algoritme aanmaken', to: '#' }], + 'algorithm.edit': [{ title: 'Algoritme bewerken', to: '#' }], } const breadcrumbItems = computed(() => { - return allBreadcrumbs[route.name as keyof typeof allBreadcrumbs] as - | BreadcrumbType[] - | undefined + return allBreadcrumbs[route.name as keyof typeof allBreadcrumbs] }) const logout = () => { diff --git a/frontend-beheer/src/components/layout/Breadcrumb.vue b/frontend-beheer/src/components/layout/Breadcrumb.vue index 7bd88d04..eb34c82e 100644 --- a/frontend-beheer/src/components/layout/Breadcrumb.vue +++ b/frontend-beheer/src/components/layout/Breadcrumb.vue @@ -19,7 +19,7 @@ const props = defineProps<{ }>() const breadCrumbItems = computed(() => { - const homeItem = [{ text: 'Algoritmeregister webformulier', to: '/' }] + const homeItem = [{ title: 'Algoritmeregister webformulier', to: '/' }] return homeItem?.concat(props.items) }) diff --git a/frontend-beheer/src/config/organization.ts b/frontend-beheer/src/config/organization.ts deleted file mode 100644 index 2e94f260..00000000 --- a/frontend-beheer/src/config/organization.ts +++ /dev/null @@ -1,26 +0,0 @@ -export interface OrganizationNames { - [key: string]: string -} - -// Only needs to be appended by names that don't fit the default string matching: -// this-is-an-id become This Is An Id. -export const organizationNames: OrganizationNames = { - 'provincie-noord-brabant': 'Provincie Noord-Brabant', - 'provincie-noord-holland': 'Provincie Noord-Holland', - 'provincie-zuid-holland': 'Provincie Zuid-Holland', - 'ministerie-fin': 'Ministerie van Financiën', - 'ministerie-ezk': 'Ministerie van Economische Zaken en Klimaat', - 'ministerie-az': 'Ministerie van Algemene Zaken', - 'ministerie-bzk': 'Ministerie van Binnenlandse Zaken en Koninkrijksrelaties', - 'ministerie-bz': 'Ministerie van Buitenlandse Zaken', - 'ministerie-def': 'Ministerie van Defensie', - 'ministerie-ienw': 'Ministerie van Infrastructuur en Waterstaat', - 'ministerie-jenv': 'Ministerie van Justitie en Veiligheid', - 'ministerie-lnw': 'Ministerie van Landbouw, Natuur en Voedselkwaliteit', - 'ministerie-ocw': 'Ministerie van Onderwijs, Cultuur en Wetenschap', - 'ministerie-szw': 'Ministerie van Sociale Zaken en Werkgelegenheid', - 'ministerie-vws': 'Ministerie van Volksgezondheid, Welzijn en Sport', - 'justitiele-informatiedienst': 'Justitiële Informatiedienst', - rvig: 'Rijksdienst voor Identiteitsgegevens', - 'directie-financieel-economische-zaken': 'Directie Financieel-Economische Zaken', -} diff --git a/frontend-beheer/src/config/publication-standard.ts b/frontend-beheer/src/config/publication-standard.ts new file mode 100644 index 00000000..dbddad71 --- /dev/null +++ b/frontend-beheer/src/config/publication-standard.ts @@ -0,0 +1,4 @@ +export default { + preferredVersion: '1.0.0', + availableVersions: ['1.0.0', '0.4.0', '0.3.1', '0.2.3', '0.1.0'], +} diff --git a/frontend-beheer/src/config/score.ts b/frontend-beheer/src/config/score.ts new file mode 100644 index 00000000..08ce65f5 --- /dev/null +++ b/frontend-beheer/src/config/score.ts @@ -0,0 +1,194 @@ +interface Config { + [key: string]: number +} + +interface ScoreConfig { + '0.1.0': Config + '0.2.3': Config + '0.3.1': Config + '0.4.0': Config + '1.0.0': Config +} + +const scoreConfig: ScoreConfig = { + '0.1.0': { + name: 8, + organization: 8, + department: 8, + description_short: 8, + type: 8, + category: 8, + website: 2, + status: 8, + goal: 8, + impact: 8, + proportionality: 8, + decision_making_process: 8, + documentation: 2, + description: 2, + application_url: 2, + publiccode: 2, + mprd: 2, + source_data: 2, + methods_and_models: 2, + monitoring: 2, + human_intervention: 8, + risks: 2, + performance_standard: 2, + competent_authority: 8, + lawful_basis: 8, + iama: 8, + iama_description: 8, + dpia: 2, + dpia_description: 2, + objection_procedure: 8, + standard_version: 0, + uuid: 0, + url: 2, + contact_email: 8, + area: 2, + lang: 2, + revision_date: 2, + }, + '0.2.3': { + name: 8, + organization: 8, + department: 8, + description_short: 8, + type: 8, + category: 8, + website: 2, + status: 8, + goal: 8, + impact: 8, + proportionality: 8, + decision_making_process: 8, + documentation: 2, + description: 2, + application_url: 2, + publiccode: 2, + mprd: 2, + source_data: 2, + methods_and_models: 2, + monitoring: 2, + human_intervention: 8, + risks: 2, + performance_standard: 2, + competent_authority: 8, + lawful_basis: 8, + iama: 8, + iama_description: 8, + dpia: 2, + dpia_description: 2, + objection_procedure: 8, + standard_version: 0, + uuid: 0, + url: 2, + contact_email: 8, + area: 2, + lang: 2, + revision_date: 2, + }, + '0.3.1': { + name: 8, + organization: 8, + department: 8, + description_short: 8, + type: 8, + category: 8, + website: 2, + status: 8, + goal: 8, + impact: 8, + proportionality: 8, + provider: 2, + application_url: 2, + process_index_url: 2, + lawful_basis: 8, + iama: 8, + iama_description: 8, + dpia: 2, + objection_procedure: 8, + url: 2, + contact_email: 8, + area: 2, + lang: 2, + standard_version: 0, + uuid: 0, + source_id: 0, + revision_date: 2, + tags: 2, + description: 2, + source_data: 2, + methods_and_models: 2, + publiccode: 2, + monitoring: 2, + human_intervention: 8, + risks: 2, + performance_standard: 2, + }, + '0.4.0': { + name: 8, + organization: 8, + description_short: 8, + type: 8, + category: 8, + website: 2, + status: 8, + begin_date: 8, + end_date: 0, + goal: 8, + proportionality: 8, + provider: 2, + lawful_basis: 2, + lawful_basis_link: 2, + impacttoetsen: 8, + iama_description: 2, + url: 2, + contact_email: 8, + lang: 2, + standard_version: 0, + uuid: 0, + source_id: 0, + tags: 2, + source_data: 8, + source_data_link: 0, + methods_and_models: 2, + publiccode: 0, + human_intervention: 8, + risks: 8, + }, + '1.0.0': { + name: 8, + description_short: 8, + organization: 8, + category: 8, + status: 8, + begin_date: 8, + end_date: 0, + contact_email: 8, + website: 2, + publication_category: 8, + url: 2, + goal: 8, + proportionality: 8, + human_intervention: 8, + risks: 8, + lawful_basis: 2, + lawful_basis_grouping: 2, + process_index_url: 2, + impacttoetsen: 8, + impacttoetsen_grouping: 2, + source_data: 8, + source_data_grouping: 2, + methods_and_models: 2, + provider: 8, + publiccode: 0, + lang: 2, + standard_version: 0, + source_id: 0, + tags: 2, + }, +} + +export default scoreConfig diff --git a/frontend-beheer/src/editor.d.ts b/frontend-beheer/src/editor.d.ts new file mode 100644 index 00000000..fe85ed95 --- /dev/null +++ b/frontend-beheer/src/editor.d.ts @@ -0,0 +1,13 @@ +declare module 'quill' { + import Quill from 'quill/core' + + export default Quill +} + +declare module 'quill/modules/keyboard' { + import Keyboard from 'quill/modules/keyboard' + export default Keyboard + export const keyBindings: any +} + +declare module '@webspellchecker/wproofreader-sdk-js' diff --git a/frontend-beheer/src/main.ts b/frontend-beheer/src/main.ts index 393e6ed0..53475348 100644 --- a/frontend-beheer/src/main.ts +++ b/frontend-beheer/src/main.ts @@ -5,6 +5,7 @@ import { registerPlugins } from '@/plugins' import { useAuthStore } from '@/store/auth' import Keycloak from 'keycloak-js' import axios from 'axios' +import Editor from 'primevue/editor' // ----------------------------------------------- Setup ----------------------------------------------- let APIurl = 'http://localhost:8000/aanleverapi' @@ -12,9 +13,9 @@ if (process.env.NODE_ENV === 'production') { APIurl = `${window.location.origin}/aanleverapi` } -let keycloakConfigUrl = 'http://localhost:8000/conceptapi/config' +let keycloakConfigUrl = 'http://localhost:8000/api/config' if (process.env.NODE_ENV === 'production') { - keycloakConfigUrl = `${window.location.origin}/conceptapi/config` + keycloakConfigUrl = `${window.location.origin}/api/config` } export function getConfigs(): Promise { @@ -39,24 +40,15 @@ getConfigs().then((response: any) => { realm: `${response.keycloak_realm}`, clientId: `${response.keycloak_client}`, onLoad: 'login-required', - // onLoad: 'check-sso' } - // console.log('initializing keycloak at') - // console.log(initOptions) const keycloak = new Keycloak(initOptions) keycloak .init({ onLoad: initOptions.onLoad }) - .then((auth) => { - // if (!auth) { - // console.log('not yet Authenticated.') - // } else { - // console.log('Authenticated') - // } - + .then(() => { // always add the authentication header to axios requests axios.interceptors.request.use(function (config: any) { - const token = keycloak!.idToken as string + const token = keycloak.idToken config.baseURL = APIurl config.headers!.Authorization = `Bearer ${token}` return config @@ -68,31 +60,13 @@ getConfigs().then((response: any) => { const authStore = useAuthStore() authStore.keycloak = keycloak authStore.APIurl = APIurl - authStore.fetchOrganizations() + app.component('PEditor', Editor) app.mount('#app') //check token every 6 seconds setInterval(() => { keycloak.updateToken(70) - // .then((refreshed) => { - // if (refreshed) { - // console.log('Token refreshed' + refreshed) - // } else { - // console.log( - // 'Token not refreshed, valid for ' + - // Math.round( - // keycloak.tokenParsed!.exp! + - // keycloak.timeSkew! - - // new Date().getTime() / 1000 - // ) + - // ' seconds' - // ) - // } - // }) - // .catch(() => { - // console.error('Failed to refresh token') - // }) }, 6000) }) .catch((error) => { diff --git a/frontend-beheer/src/plugins/index.ts b/frontend-beheer/src/plugins/index.ts index 4e120eab..999fbd5e 100644 --- a/frontend-beheer/src/plugins/index.ts +++ b/frontend-beheer/src/plugins/index.ts @@ -10,6 +10,8 @@ import vuetify from './vuetify' import pinia from '../store' import router from '../router' +import PrimeVue from 'primevue/config' + // Types import type { App } from 'vue' @@ -19,4 +21,5 @@ export function registerPlugins (app: App) { .use(vuetify) .use(router) .use(pinia) + .use(PrimeVue) } diff --git a/frontend-beheer/src/plugins/vuetify.ts b/frontend-beheer/src/plugins/vuetify.ts index 3df9b533..b8969f9e 100644 --- a/frontend-beheer/src/plugins/vuetify.ts +++ b/frontend-beheer/src/plugins/vuetify.ts @@ -13,7 +13,6 @@ import { VDataTable } from 'vuetify/labs/VDataTable' import { createVuetify } from 'vuetify' import { nl } from 'vuetify/locale' - // https://vuetifyjs.com/en/introduction/why-vuetify/#feature-guides export default createVuetify({ components: { diff --git a/frontend-beheer/src/services/algorithms.ts b/frontend-beheer/src/services/algorithms.ts new file mode 100644 index 00000000..1d731ca8 --- /dev/null +++ b/frontend-beheer/src/services/algorithms.ts @@ -0,0 +1,144 @@ +import { + AlgorithmForm, + AlgorithmResponse, + AlgorithmOwnerResponse, + AlgorithmPreviewResponse, + UpdateAlgorithmResponse, + CreateAlgorithmResponse, + RemoveAlgorithmResponse, + AlgorithmListResponse, +} from '@/types/algorithm' +import { Organisation } from '@/types/organisation' +import { AxiosRequestConfig } from 'axios' +import { backendRequest } from '.' +import publicationStandard from '@/config/publication-standard' + +const MDS_VERSION = + 'v' + publicationStandard.preferredVersion.replace(/\./g, '_') + +export async function getAlgorithmList( + organisation: Organisation +): Promise { + const request: AxiosRequestConfig = { + method: 'GET', + url: `${MDS_VERSION}/organizations/${organisation.code}/algorithms`, + } + return backendRequest(request) +} + +export async function getAlgorithm( + organisation: Organisation, + lars: string +): Promise { + const request: AxiosRequestConfig = { + method: 'GET', + url: `${MDS_VERSION}/organizations/${organisation.code}/algorithms/${lars}`, + } + return backendRequest(request) +} + +export async function createAlgorithm( + organisation: Organisation, + data: AlgorithmForm +): Promise { + delete data.created_by + delete data.create_dt + delete data.lars + delete data.released + delete data.published + + const request: AxiosRequestConfig = { + method: 'POST', + url: `v${data.standard_version.replace(/\./g, '_')}/organizations/${ + organisation.code + }/algorithms`, + data, + } + return backendRequest(request) +} + +export async function updateAlgorithm( + organisation: Organisation, + lars: string, + data: AlgorithmForm +): Promise { + const sendData: AlgorithmForm = { ...data } + delete sendData.create_dt + delete sendData.lars + delete sendData.released + delete sendData.published + + const request: AxiosRequestConfig = { + method: 'PUT', + url: `v${sendData.standard_version.replace(/\./g, '_')}/organizations/${ + organisation.code + }/algorithms/${lars}`, + data: sendData, + } + return backendRequest(request) +} + +export async function publishAlgorithm( + organisation: Organisation, + lars: string +): Promise { + const request: AxiosRequestConfig = { + method: 'PUT', + url: `${MDS_VERSION}/organizations/${organisation.code}/algorithms/${lars}/publish`, + } + return backendRequest(request) +} + +export async function releaseAlgorithm( + organisation: Organisation, + lars: string +): Promise { + const request: AxiosRequestConfig = { + method: 'PUT', + url: `${MDS_VERSION}/organizations/${organisation.code}/algorithms/${lars}/release`, + } + return backendRequest(request) +} + +export async function retractAlgorithm( + organisation: Organisation, + lars: string +): Promise { + const request: AxiosRequestConfig = { + method: 'DELETE', + url: `${MDS_VERSION}/organizations/${organisation.code}/published-algorithms/${lars}/retract`, + } + return backendRequest(request) +} + +export async function generatePreview( + organisation: Organisation, + lars: string +): Promise { + const request: AxiosRequestConfig = { + method: 'GET', + url: `${MDS_VERSION}/organizations/${organisation.code}/algorithms/${lars}/preview`, + } + return backendRequest(request) +} + +export async function removeAlgorithm( + organisation: Organisation, + lars: string +): Promise { + const request: AxiosRequestConfig = { + method: 'DELETE', + url: `${MDS_VERSION}/organizations/${organisation.code}/algorithms/${lars}/remove`, + } + return backendRequest(request) +} + +export async function getAlgorithmOwner( + lars: string +): Promise { + const request: AxiosRequestConfig = { + method: 'GET', + url: `/algoritme/find/${lars}`, + } + return backendRequest(request) +} diff --git a/frontend-beheer/src/services/c3po.ts b/frontend-beheer/src/services/c3po.ts new file mode 100644 index 00000000..ff4b9285 --- /dev/null +++ b/frontend-beheer/src/services/c3po.ts @@ -0,0 +1,26 @@ +import { AxiosRequestConfig } from 'axios' +import { backendRequest } from '.' +import { + C3poPostResponse, + C3poRequestBody, + C3poRulesResponse, +} from '@/types/c3po' + +export async function postC3poRequest( + data: C3poRequestBody +): Promise { + const request: AxiosRequestConfig = { + method: 'POST', + url: '/c3po/processing-request', + data, + } + return backendRequest(request) +} + +export async function getC3poRules(): Promise { + const request: AxiosRequestConfig = { + method: 'GET', + url: '/c3po/rule', + } + return backendRequest(request) +} diff --git a/frontend-beheer/src/services/downloads.ts b/frontend-beheer/src/services/downloads.ts new file mode 100644 index 00000000..9f90be5d --- /dev/null +++ b/frontend-beheer/src/services/downloads.ts @@ -0,0 +1,30 @@ +import { Organisation } from '@/types/organisation' +import { AxiosRequestConfig } from 'axios' +import { backendRequest } from '.' + +export async function getFileOne( + organisation: Organisation, + lars: string, + filetype: 'pdf' | 'word' | 'excel' +) { + const request: AxiosRequestConfig = { + method: 'GET', + responseType: 'blob', + url: `downloads/organizations/${organisation.code}/algorithms/${lars}`, + params: { filetype: filetype }, + } + return backendRequest(request) +} + +export async function getFileMany( + organisation: Organisation, + filetype: 'pdf' | 'word' | 'excel' +) { + const request: AxiosRequestConfig = { + method: 'GET', + responseType: 'blob', + url: `downloads/organizations/${organisation.code}`, + params: { filetype: filetype }, + } + return backendRequest(request) +} diff --git a/frontend-beheer/src/services/index.ts b/frontend-beheer/src/services/index.ts index 8bbd78ae..2ae12ce8 100644 --- a/frontend-beheer/src/services/index.ts +++ b/frontend-beheer/src/services/index.ts @@ -1,21 +1,7 @@ import axios, { AxiosRequestConfig, AxiosResponse } from 'axios' -import config from '@/app-config' -import { Organization } from '@/types' -import { MetaDataResponse } from '@/types/form' -import { - AlgorithmForm, - AlgorithmListResponse, - AlgorithmResponse, - AlgorithmPreviewResponse, - UpdateAlgorithmResponse, - CreateAlgorithmResponse, - RemoveAlgorithmResponse, -} from '@/types/algorithm' +import { MetaDataResponse } from '@/types/openapi' -const MDS_VERSION = - 'v' + config.metaDataStandard.preferredVersion.replace(/\./g, '_') - -function backendRequest( +export function backendRequest( config: AxiosRequestConfig ): Promise> { return new Promise((resolve, reject) => { @@ -41,129 +27,3 @@ export async function getMetaDataStandard( } return backendRequest(request) } - -export async function getAlgorithm( - organization: Organization, - lars: string -): Promise { - const request: AxiosRequestConfig = { - method: 'GET', - url: `${MDS_VERSION}/organizations/${organization.id}/algorithms/${lars}`, - } - return backendRequest(request) -} - -export async function getAlgorithmList( - organization: Organization -): Promise { - const request: AxiosRequestConfig = { - method: 'GET', - url: `${MDS_VERSION}/organizations/${organization.id}/algorithms`, - } - return backendRequest(request) -} - -export async function createAlgorithm( - organization: Organization, - data: AlgorithmForm -): Promise { - delete data.created_by - delete data.create_dt - delete data.lars - delete data.released - delete data.published - - const request: AxiosRequestConfig = { - method: 'POST', - url: `v${data.standard_version.replace(/\./g, '_')}/organizations/${ - organization.id - }/algorithms`, - data, - } - return backendRequest(request) -} - -export async function updateAlgorithm( - organization: Organization, - lars: string, - data: AlgorithmForm -): Promise { - const sendData: AlgorithmForm = { ...data } - delete sendData.create_dt - delete sendData.lars - delete sendData.released - delete sendData.published - - const request: AxiosRequestConfig = { - method: 'PUT', - url: `v${sendData.standard_version.replace(/\./g, '_')}/organizations/${ - organization.id - }/algorithms/${lars}`, - data: sendData, - } - return backendRequest(request) -} - -export async function publishAlgorithm( - organization: Organization, - lars: string -): Promise { - const request: AxiosRequestConfig = { - method: 'PUT', - url: `${MDS_VERSION}/organizations/${organization.id}/algorithms/${lars}/publish`, - } - return backendRequest(request) -} - -export async function releaseAlgorithm( - organization: Organization, - lars: string -): Promise { - const request: AxiosRequestConfig = { - method: 'PUT', - url: `${MDS_VERSION}/organizations/${organization.id}/algorithms/${lars}/release`, - } - return backendRequest(request) -} - -export async function retractAlgorithm( - organization: Organization, - lars: string -): Promise { - const request: AxiosRequestConfig = { - method: 'DELETE', - url: `${MDS_VERSION}/organizations/${organization.id}/published-algorithms/${lars}/retract`, - } - return backendRequest(request) -} - -export async function generatePreview( - organization: Organization, - lars: string -): Promise { - const request: AxiosRequestConfig = { - method: 'GET', - url: `${MDS_VERSION}/organizations/${organization.id}/algorithms/${lars}/preview`, - } - return backendRequest(request) -} - -export async function removeAlgorithm( - organization: Organization, - lars: string -): Promise { - const request: AxiosRequestConfig = { - method: 'DELETE', - url: `${MDS_VERSION}/organizations/${organization.id}/algorithms/${lars}/remove`, - } - return backendRequest(request) -} - -export async function getExcelFile(organization: Organization) { - const request: AxiosRequestConfig = { - method: 'GET', - responseType: 'blob', - url: `${MDS_VERSION}/organizations/${organization.id}/algorithms/download-excel`, - } - return backendRequest(request) -} diff --git a/frontend-beheer/src/services/organisation.ts b/frontend-beheer/src/services/organisation.ts new file mode 100644 index 00000000..f2f9b81c --- /dev/null +++ b/frontend-beheer/src/services/organisation.ts @@ -0,0 +1,39 @@ +import { + Organisation, + OrganisationListResponse, + CreateOrganisationResponse, + UpdateOrganisationResponse, +} from '@/types/organisation' +import { AxiosRequestConfig } from 'axios' +import { backendRequest } from '.' + +export async function getOrganisationList(): Promise { + const request: AxiosRequestConfig = { + method: 'GET', + url: '/organization', + } + return backendRequest(request) +} + +export async function createOrganisation( + organisation: Organisation +): Promise { + const request: AxiosRequestConfig = { + method: 'POST', + url: '/organization', + data: organisation, + } + return backendRequest(request) +} + +export async function updateOrganisation( + org_code: string, + organisation: Organisation +): Promise { + const request: AxiosRequestConfig = { + method: 'PUT', + url: `/organization/${org_code}`, + data: organisation, + } + return backendRequest(request) +} diff --git a/frontend-beheer/src/services/templates.ts b/frontend-beheer/src/services/templates.ts new file mode 100644 index 00000000..2fdd16dd --- /dev/null +++ b/frontend-beheer/src/services/templates.ts @@ -0,0 +1,24 @@ +import { AxiosRequestConfig } from 'axios' +import { backendRequest } from '.' +import { TemplateListResponse, TemplateResponse } from '@/types/templates' + +export async function getTemplateList( + standardVersion: string +): Promise { + const request: AxiosRequestConfig = { + method: 'GET', + url: `templates/${standardVersion}`, + } + return backendRequest(request) +} + +export async function getTemplate( + standardVersion: string, + id: string +): Promise { + const request: AxiosRequestConfig = { + method: 'GET', + url: `templates/${standardVersion}/${id}`, + } + return backendRequest(request) +} diff --git a/frontend-beheer/src/store/auth.ts b/frontend-beheer/src/store/auth.ts index 0db0747c..ac311983 100644 --- a/frontend-beheer/src/store/auth.ts +++ b/frontend-beheer/src/store/auth.ts @@ -1,16 +1,17 @@ // Utilities import { defineStore } from 'pinia' import Keycloak from 'keycloak-js' -import { Organization } from '@/types' -import { OrganizationNames, organizationNames } from '@/config/organization' +import { Organisation } from '@/types/organisation' import { useLocalStorage } from '@vueuse/core' +import { getOrganisationList } from '@/services/organisation' export const useAuthStore = defineStore('auth', { state: () => ({ keycloak: {} as Keycloak, APIurl: 'http://localhost:8000/api', - organizations: [] as Organization[], - selectedOrg: null as Organization | null, + organisations: [] as Organisation[], + selectedOrg: null as Organisation | null, + loading: false as boolean, }), getters: { canPublish(): boolean { @@ -21,36 +22,35 @@ export const useAuthStore = defineStore('auth', { const role = this.keycloak.tokenParsed?.role return role === 'admin' }, + canAddOrg(): boolean { + const role = this.keycloak.tokenParsed?.role + return role === 'admin' + }, + canEditOrg(): boolean { + const role = this.keycloak.tokenParsed?.role + return role === 'publisher' || role === 'admin' + }, }, actions: { - fetchOrganizations() { - const keycloakOrgStrings = this.keycloak.tokenParsed?.group - if (!keycloakOrgStrings || keycloakOrgStrings.length === 0) { - return + async fetchOrganisations() { + this.loading = true + try { + this.organisations = (await getOrganisationList()).data + } catch (error) { + console.error('Unable to fetch organisation list', error) + } finally { + this.loading = false } - this.organizations = keycloakOrgStrings.map((orgString: string) => { - const orgId = orgString.split('/')?.pop() - if (!orgId) { - throw new Error('Could not parse Keycloak organization string.') - } - let defaultOrgName = orgId.replaceAll('-', ' ') - // Regex detects first letter of each word. - defaultOrgName = defaultOrgName.replace(/\b\w/g, (l: string) => - l.toUpperCase() - ) - const orgName = organizationNames[orgId as keyof OrganizationNames] - return { id: orgId, name: orgName || defaultOrgName } - }) }, - selectOrganization(orgId: string) { - const organization = this.organizations.find((org) => org.id === orgId) - if (!organization) { + selectOrganisation(orgId: string) { + const organisation = this.organisations.find((org) => org.code === orgId) + if (!organisation) { throw new Error( - 'Selected organization is not found in organizations array.' + 'Selected organisation is not found in organisations array.' ) } - useLocalStorage('webform-selected-org', {}).value = organization! - this.selectedOrg = organization! + useLocalStorage('webform-selected-org', {}).value = organisation + this.selectedOrg = organisation }, }, }) diff --git a/frontend-beheer/src/store/form-data.ts b/frontend-beheer/src/store/form-data.ts index 1aad36f3..393c6e79 100644 --- a/frontend-beheer/src/store/form-data.ts +++ b/frontend-beheer/src/store/form-data.ts @@ -11,7 +11,8 @@ import { releaseAlgorithm, generatePreview, removeAlgorithm, -} from '@/services' + getAlgorithmOwner, +} from '@/services/algorithms' import { AlgorithmForm, CreateAlgorithmResponse, @@ -20,9 +21,10 @@ import { NoOrgResponse, } from '@/types/algorithm' import content from '@/content.json' -import { Organization } from '@/types' -import { noOrgSelectedResponse } from '@/util' +import { Organisation } from '@/types/organisation' +import { noOrgSelectedResponse } from '@/utils' import router from '@/router' +import { useAlgorithmStore } from './overview' const authStore = useAuthStore() @@ -45,8 +47,8 @@ export const useFormDataStore = defineStore('form-data', { }) ) }, - orgFromData(): Organization | undefined { - return authStore.organizations.find( + orgFromData(): Organisation | undefined { + return authStore.organisations.find( (org) => org.name == this.data.organization ) }, @@ -56,27 +58,22 @@ export const useFormDataStore = defineStore('form-data', { // We do not know which organisation the algorithm belongs to. this.data = {} this.loaded = false - // A good try is to use the current selected org (= sometimes based on localStorage) + // Ask backend where to find the algoritmebeschrijving + const algorithmStore = useAlgorithmStore() try { - this.data = (await getAlgorithm(authStore.selectedOrg!, lars)).data + const owner = (await getAlgorithmOwner(lars)).data + this.data = (await getAlgorithm(owner, lars)).data + algorithmStore.error = '' } catch (error) { - // Loop through all of them. - for (let i = 0; i < authStore.organizations.length; i++) { - try { - this.data = ( - await getAlgorithm(authStore.organizations[i]!, lars) - ).data - break - } catch (error) { - continue - } - } - } - this.loaded = true - if (Object.keys(this.data).length == 0) { - // Data not available, push to home + console.log(error) router.push({ name: 'algorithm.index' }) + + // algorithmStore displays its errors on the algorithm.index page + algorithmStore.error = + 'Algoritme niet gevonden. U bent teruggestuurd naar uw homepagina.' return + } finally { + this.loaded = true } // No duplicate loading if the schema in local cache is already good. if (this.schemaStore.loadedSchema !== this.data.standard_version) { @@ -92,7 +89,7 @@ export const useFormDataStore = defineStore('form-data', { if (!this.orgFromData) return noOrgSelectedResponse() return await updateAlgorithm(this.orgFromData, lars, this.cleanedData) .then((response) => { - if (response.data?.message != 'Version has no changes.') { + if (response.data?.message != 'NO_CHANGES') { this.data.released = false this.data.published = false this.unsavedChanges = false @@ -117,8 +114,8 @@ export const useFormDataStore = defineStore('form-data', { .then((response) => { this.data.lars = response.data.lars_code this.unsavedChanges = false - // Change organization based on the saved algorithm. Needed for loading from cookies - authStore.selectOrganization(this.orgFromData!.id) + // Change organisation based on the saved algorithm. Needed for loading from cookies + authStore.selectOrganisation(this.orgFromData!.code) this.feedback.success = content.formDataStore.create.success return response }) @@ -211,5 +208,12 @@ export const useFormDataStore = defineStore('form-data', { } }) }, + handleSchemaSwap(oldVersion: string, newVersion: string): void { + // Certain migrations need additional attention to detail + const dataStore = useFormDataStore() + if (oldVersion == '0.4.0' && newVersion == '1.0.0') { + dataStore.data.impacttoetsen = null + } + }, }, }) diff --git a/frontend-beheer/src/store/overview.ts b/frontend-beheer/src/store/overview.ts index 08fb3d22..77e1a9f3 100644 --- a/frontend-beheer/src/store/overview.ts +++ b/frontend-beheer/src/store/overview.ts @@ -1,9 +1,9 @@ // Store for managing the algorithms that the user has access to. import { defineStore } from 'pinia' import { Algorithm } from '@/types/algorithm' -import { getAlgorithmList } from '@/services' +import { getAlgorithmList } from '@/services/algorithms' import content from '@/content.json' -import { Organization } from '@/types' +import { Organisation } from '@/types/organisation' import { useAuthStore } from './auth' export const useAlgorithmStore = defineStore('algorithm', { @@ -31,18 +31,18 @@ export const useAlgorithmStore = defineStore('algorithm', { }, }, actions: { - async fetchAlgorithms(organization: Organization): Promise { + async fetchAlgorithms(organisation: Organisation): Promise { this.algorithms = [] const authStore = useAuthStore() - // User has no organizations, exit - if (authStore.organizations.length == 0) { + // User has no organisations, exit + if (authStore.organisations.length == 0) { return } this.loaded = false try { - this.algorithms = (await getAlgorithmList(organization)).data + this.algorithms = (await getAlgorithmList(organisation)).data } catch (error: any) { console.error(error.data) this.error = content.overviewTable.fetchAlgoritms.error @@ -59,9 +59,9 @@ export const useAlgorithmStore = defineStore('algorithm', { } else if (a.published && a.current_version_released) { overviewStatus = 'Gepubliceerd, nieuwe versie vrijgegeven' } else if (a.published) { - overviewStatus = 'Gepubliceerd, nieuwe versie in ontwikkeling' + overviewStatus = 'Gepubliceerd, nieuwe versie wordt nog bewerkt' } else { - overviewStatus = 'In ontwikkeling' + overviewStatus = 'Wordt nog bewerkt' } return { ...a, overviewStatus: overviewStatus } }) diff --git a/frontend-beheer/src/store/schema.ts b/frontend-beheer/src/store/schema.ts index 734b8e3a..970dfe3b 100644 --- a/frontend-beheer/src/store/schema.ts +++ b/frontend-beheer/src/store/schema.ts @@ -1,16 +1,18 @@ // Store for managing the algorithms that the user has access to. import { getMetaDataStandard } from '@/services' -import { - FormFieldProperties, - FormProperties, - OpenApiSchemas, -} from '@/types/form' +import { getC3poRules } from '@/services/c3po' +import type { + OpenApiSchema, + EnumSchema, + ArraySchema, + ArrayOptionalSchema, + AlgorithmInSchema, +} from '@/types/openapi' +import { FormFieldProperties, FormProperties } from '@/types/form' +import { RuleSet } from '@/types/c3po' import { defineStore } from 'pinia' import content from '@/content.json' -import { - buildRulesFromProperties, - buildPlaceholderFromSchema, -} from '@/util/form' +import { buildRulesFromProperties } from '@/utils/form' import { useAuthStore } from './auth' import { useFormDataStore } from './form-data' @@ -18,108 +20,95 @@ const authStore = useAuthStore() export const useSchemaStore = defineStore('schema', { state: () => ({ - rawSchemas: {} as OpenApiSchemas, + rawSchemas: {} as { [key: string]: OpenApiSchema }, loadedSchema: '' as string, loaded: true as boolean, feedback: { success: '', error: '' }, + ruleSets: [] as RuleSet[], }), getters: { formProperties(self): FormProperties { - if (self.rawSchemas.AlgorithmIn) { - const schemaEntries = Object.entries( - self.rawSchemas.AlgorithmIn.properties - ) - const formProperties = Object.fromEntries( - schemaEntries.map(([k, v]) => { - let allowedItems: string[] | undefined = undefined - let recommendedItems: string[] | undefined = undefined - let type: string | undefined = undefined - if (v.type == 'enum' && v.allOf) { - // The enumerations are in their own schema, on the same depth as the main schema. - // The $ref is a path string, but only the final bit is needed. - const schema: string | undefined = v.allOf[0]?.$ref - .split('/') - .slice(-1)[0] - if (schema) { - allowedItems = self.rawSchemas[schema].enum - } - } else if (v.type == 'array' && v.items?.$ref) { - const schema: string | undefined = v.items?.$ref - .split('/') - .slice(-1)[0] - if (schema) { - allowedItems = self.rawSchemas[schema].enum - } - } else if ( - v.type == 'array' && - v.items?.type == 'string' && - v.recommended_items - ) { - recommendedItems = v.recommended_items - } - - const dataStore = useFormDataStore() - let fixedValue: string | undefined = undefined - if (k == 'organization') { - const organizations = authStore.organizations - // absence of ...data.lars means organization can still be chosen. - if (!dataStore.data.lars) { - if (organizations.length > 1) { - allowedItems = organizations.map((org) => org.name) - type = 'enum' - } else if (organizations.length == 1) { - fixedValue = organizations[0]!.name - dataStore.data.organization = fixedValue - type = 'fixed' - } - } else { - if ( - dataStore.data.organization === authStore.selectedOrg?.name - ) { - fixedValue = dataStore.data.organization - type = 'fixed' - } else { - allowedItems = organizations.map((org) => org.name) - type = 'enum' - } - } - } else if (k == 'standard_version') { - // Standard_version cannot be adjusted. - type = 'fixed' - fixedValue = allowedItems![0] - } + if (!self.rawSchemas.AlgorithmIn) return {} + if (authStore.organisations.length == 0) return {} + const dataStore = useFormDataStore() - const required: boolean = - self.rawSchemas.AlgorithmIn?.required?.includes(k) || false + const mainSchema = self.rawSchemas.AlgorithmIn as AlgorithmInSchema + const formProperties = Object.fromEntries( + Object.entries(mainSchema.properties).map(([key, v]) => { + // Build properties per field based on values in AlgorithmIn schema. + const required = mainSchema.required.includes(key) + const formFieldProperties: FormFieldProperties = { + ...v, + required, + } - const placeholder: string = buildPlaceholderFromSchema(v) + let allowedItems + if (v.type == 'enum') { + // EnumReferenceSchema, single select enumeration + const schema = v.allOf[0]!.$ref.split('/').slice(-1)[0]! + allowedItems = (self.rawSchemas[schema] as EnumSchema).enum + formFieldProperties['type'] = 'select' + } else if (v.type == 'string') { + // StringSchema + formFieldProperties['maxLength'] = v.max_length_without_html + if (v.allowed_html_tags) { + formFieldProperties['allowedHtmlTags'] = v.allowed_html_tags + formFieldProperties['type'] = 'rich-textarea' + } else { + formFieldProperties['type'] = 'textarea' + } + } else if (v.type == 'array' && '$ref' in v.items) { + // ArraySchema or ObjectSchema + const schema = v.items.$ref.split('/').slice(-1)[0]! + if (v.items.$ref.includes('Enum', 29)) { + // ArraySchema, multi-select enumeration + allowedItems = (self.rawSchemas[schema] as EnumSchema).enum + formFieldProperties['type'] = 'multi-select' + formFieldProperties['maxItems'] = (v as ArraySchema).maxItems + } else if (v.items.$ref.includes('Object', 29)) { + // ObjectSchema. Only works for 1.0.0 + formFieldProperties['type'] = 'list-with-links' + } + } else if (v.type == 'array' && 'type' in v.items) { + // ArrayOptionalSchema, multi-select with recommended items + const recommendedItems = (v as ArrayOptionalSchema) + .recommended_items + formFieldProperties['recommendedItems'] = recommendedItems + formFieldProperties['type'] = 'optional-select' + } - let formFieldProperties: FormFieldProperties = { - title: v.title, - maxLength: v.maxLength, - type: type || v.type, - example: v.example, - showAlways: v.show_always, - helpText: v.help_text, - instructions: v.instructions, - required, - allowedItems, - recommendedItems, - fixedValue, - placeholder, + if (key == 'organization') { + const organisations = authStore.organisations + // Matching the organisation with selectedOrg fixes the value. + if (dataStore.data.organization === authStore.selectedOrg?.name) { + formFieldProperties['fixedValue'] = dataStore.data.organization + formFieldProperties['type'] = 'fixed' + } else { + allowedItems = organisations.map((org) => org.name) + formFieldProperties['type'] = 'select' } + } else if (key == 'name') { + formFieldProperties['type'] = 'name-textarea' + } - const rules = buildRulesFromProperties(formFieldProperties) + if (allowedItems) { + if (allowedItems.length == 1) { + formFieldProperties['type'] = 'fixed' + formFieldProperties['fixedValue'] = allowedItems[0] + delete formFieldProperties.allowedItems + dataStore.data[key] = formFieldProperties['fixedValue'] + } else { + formFieldProperties['allowedItems'] = allowedItems + } + } - formFieldProperties = { ...formFieldProperties, rules: rules } + formFieldProperties['rules'] = + buildRulesFromProperties(formFieldProperties) - return [k, formFieldProperties] - }) - ) - return formProperties - } else { - return {} - } + return [key, formFieldProperties] + }) + ) + return formProperties }, }, actions: { @@ -137,6 +126,15 @@ export const useSchemaStore = defineStore('schema', { } finally { this.loaded = true } + + if (authStore.canPublish) { + try { + const ruleData = (await getC3poRules()).data + this.ruleSets = ruleData + } catch (error) { + console.error(error) + } + } }, }, }) diff --git a/frontend-beheer/src/store/score.ts b/frontend-beheer/src/store/score.ts new file mode 100644 index 00000000..2d06b2ba --- /dev/null +++ b/frontend-beheer/src/store/score.ts @@ -0,0 +1,41 @@ +// Store for managing the algorithms that the user has access to. +import { defineStore } from 'pinia' +import { useFormDataStore } from './form-data' +import scoreConfig from '@/config/score' + +const formDataStore = useFormDataStore() + +export const useScoreStore = defineStore('score', { + getters: { + progress(): number { + const data = formDataStore.data + if (!(data.standard_version in scoreConfig)) { + console.error( + 'Cannot find standard_version score configuration specified in data' + ) + return 0 + } + + const config = + scoreConfig[data.standard_version as keyof typeof scoreConfig] + let score: number = 0 + let maxScore: number = 0 + Object.entries(config).forEach(([key, value]) => { + maxScore += value + if (data[key] === null) return + if (data[key] === '') return + if (data[key] === undefined) return + if (data[key].length === 0) return + score += value + }) + // Return score between 0 and 100 for linear progress bar. + const normalizedScore: number = Math.ceil((score / maxScore) * 100) + return normalizedScore + }, + summaryVariant(): 'orange' | 'yellow' | 'green' { + if (this.progress < 60) return 'orange' + if (this.progress < 85) return 'yellow' + else return 'green' + }, + }, +}) diff --git a/frontend-beheer/src/types/algorithm.ts b/frontend-beheer/src/types/algorithm.ts index c94943e3..499deeca 100644 --- a/frontend-beheer/src/types/algorithm.ts +++ b/frontend-beheer/src/types/algorithm.ts @@ -1,4 +1,5 @@ -import { FastApiResponse } from '@/types/index' +import { FastApiResponse } from '.' +import { Organisation } from './organisation' export interface Algorithm { name?: string @@ -9,7 +10,7 @@ export interface Algorithm { published: boolean current_version_released: boolean current_version_published: boolean - last_update_by?: string + last_update_by: string overviewStatus?: string } @@ -53,3 +54,7 @@ export interface AlgorithmPreviewResponse extends FastApiResponse { export interface NoOrgResponse extends FastApiResponse { data: null } + +export interface AlgorithmOwnerResponse extends FastApiResponse { + data: Organisation +} diff --git a/frontend-beheer/src/types/c3po.ts b/frontend-beheer/src/types/c3po.ts new file mode 100644 index 00000000..9b5a837a --- /dev/null +++ b/frontend-beheer/src/types/c3po.ts @@ -0,0 +1,37 @@ +import { FastApiResponse } from '@/types/index' + +export interface C3poResults { + rules: RuleResults[] +} + +export interface RuleResults { + rule_code: string + description: string + feedback_message: string + result: boolean | null +} + +export interface Rule { + rule_code: string + rule_variant: string + description: string + severity_level: string +} + +export interface RuleSet { + code: string + rules: Rule[] +} + +export interface C3poRequestBody { + text: string + ruleSet: string +} + +export interface C3poPostResponse extends FastApiResponse { + data: C3poResults +} + +export interface C3poRulesResponse extends FastApiResponse { + data: RuleSet[] +} diff --git a/frontend-beheer/src/types/form.ts b/frontend-beheer/src/types/form.ts index 6e01bc9c..ffce4840 100644 --- a/frontend-beheer/src/types/form.ts +++ b/frontend-beheer/src/types/form.ts @@ -1,12 +1,11 @@ -import { FastApiResponse } from '@/types/index' - export interface FormFieldProperties { title: string maxLength?: number + maxItems?: number type: string - example: string - showAlways: boolean - helpText: string + example?: string | string[] + show_always: boolean + help_text: string instructions: string rules?: ((v: any) => boolean | string)[] required: boolean @@ -14,43 +13,14 @@ export interface FormFieldProperties { recommendedItems?: string[] fixedValue?: string placeholder?: string + allowedHtmlTags?: string[] } export interface FormProperties { [key: string]: FormFieldProperties } -export interface SchemaProperties { - title: string - maxLength?: number - type: string - allOf: { $ref: string }[] - items?: { $ref?: string; type?: string } - example: string - show_always: boolean - help_text: string - instructions: string - recommended_items?: string[] -} - -export interface OpenApiSchemas { - [key: string]: any - - AlgorithmIn?: { - [key: string]: any - properties: { - [key: string]: SchemaProperties - } - required?: string[] - } -} - -export interface MetaDataResponse extends FastApiResponse { - data: { - [key: string]: any - components: { - [key: string]: any - schemas: OpenApiSchemas - } - } +export interface ListWithLinks { + title: string | null + link: string | null } diff --git a/frontend-beheer/src/types/index.ts b/frontend-beheer/src/types/index.ts index c74bacb8..3853eab1 100644 --- a/frontend-beheer/src/types/index.ts +++ b/frontend-beheer/src/types/index.ts @@ -5,12 +5,7 @@ export interface FastApiResponse { [key: string]: any } -export interface Organization { - id: string - name: string -} - export interface Breadcrumb { - text: string; - to: string; + title: string + to: string } diff --git a/frontend-beheer/src/types/openapi.ts b/frontend-beheer/src/types/openapi.ts new file mode 100644 index 00000000..2c1dc69d --- /dev/null +++ b/frontend-beheer/src/types/openapi.ts @@ -0,0 +1,93 @@ +import { FastApiResponse } from '@/types/index' + +export type OpenApiSchema = + | ObjectSchema + | StringSchema + | EnumReferenceSchema + | ArraySchema + | ArrayOptionalSchema + | BooleanSchema + | EnumSchema + +export interface AlgorithmInSchema { + title: string + required: string[] + type: 'object' + properties: { + [key: string]: + | ObjectSchema + | StringSchema + | EnumReferenceSchema + | ArraySchema + | ArrayOptionalSchema + } +} + +export interface BaseOpenApiSchema { + title: string + example: string | string[] + show_always: boolean + help_text: string + instructions: string +} + +export interface ObjectSchema extends BaseOpenApiSchema { + type: 'object' + required?: string[] + properties: { + [key: string]: OpenApiSchema + } +} + +export interface StringSchema extends BaseOpenApiSchema { + type: 'string' + max_length_without_html: number + allowed_html_tags?: string[] +} + +export interface ArraySchema extends BaseOpenApiSchema { + type: 'array' + maxItems?: number + items: { + $ref: string + } +} + +export interface ArrayOptionalSchema extends BaseOpenApiSchema { + type: 'array' + items: { + type: string + } + recommended_items: string[] +} + +export interface EnumReferenceSchema extends BaseOpenApiSchema { + type: 'enum' + allOf: { + $ref: string + }[] +} + +export interface BooleanSchema { + type: 'boolean' + title: string +} + +export interface EnumSchema { + type: 'string' + title: string + enum: string[] + description: string +} + +export interface MetaDataResponse extends FastApiResponse { + data: { + [key: string]: any + components: { + [key: string]: any + schemas: { + [key: string]: OpenApiSchema + } + } + } +} diff --git a/frontend-beheer/src/types/organisation.ts b/frontend-beheer/src/types/organisation.ts new file mode 100644 index 00000000..83a7c969 --- /dev/null +++ b/frontend-beheer/src/types/organisation.ts @@ -0,0 +1,43 @@ +import { FastApiResponse } from '.' + +export enum OrgType { + adviescollege = 'Adviescollege', + agentschap = 'Agentschap', + brandweer = 'Brandweer', + caribisch_openbaar_lichaam = 'Caribisch openbaar lichaam', + gemeente = 'Gemeente', + grensoverschrijdend_regionaal_samenwerkingsorgaan = 'Grensoverschrijdend regionaal samenwerkingsorgaan', + hoog_college_van_staat = 'Hoog College van Staat', + interdepartementale_commissie = 'Interdepartementale commissie', + kabinet_van_de_koning = 'Kabinet van de Koning', + koepelorganisatie = 'Koepelorganisatie', + ministerie = 'Ministerie', + openbaar_lichaam_voor_beroep_en_bedrijf = 'Openbaar lichaam voor beroep en bedrijf', + organisatie_met_overheidsbemoeienis = 'Organisatie met overheidsbemoeienis', + organisatieonderdeel = 'Organisatieonderdeel', + politie = 'Politie', + provincie = 'Provincie', + rechtspraak = 'Rechtspraak', + regionaal_samenwerkingsorgaan = 'Regionaal samenwerkingsorgaan', + waterschap = 'Waterschap', + zelfstandig_bestuursorgaan = 'Zelfstandig bestuursorgaan', + overig = 'Overig', +} + +export interface Organisation { + name: string + code: string + type: OrgType | null +} + +export interface OrganisationListResponse extends FastApiResponse { + data: Organisation[] +} + +export interface CreateOrganisationResponse extends FastApiResponse { + data: null +} + +export interface UpdateOrganisationResponse extends FastApiResponse { + data: null +} diff --git a/frontend-beheer/src/types/templates.ts b/frontend-beheer/src/types/templates.ts new file mode 100644 index 00000000..6fad0473 --- /dev/null +++ b/frontend-beheer/src/types/templates.ts @@ -0,0 +1,19 @@ +import { FastApiResponse } from '.' + +export interface AlgorithmDescription { + name: string + id: string +} + +export interface Supplier { + name: string + algorithm_descriptions: AlgorithmDescription[] +} + +export interface TemplateListResponse extends FastApiResponse { + data: Supplier[] +} + +export interface TemplateResponse extends FastApiResponse { + data: Algorithm +} diff --git a/frontend-beheer/src/util/form.ts b/frontend-beheer/src/util/form.ts deleted file mode 100644 index 40a7e2cd..00000000 --- a/frontend-beheer/src/util/form.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { FormFieldProperties, SchemaProperties } from '@/types/form' - -export function buildRulesFromProperties( - field: FormFieldProperties -): ((v: any) => boolean | string)[] { - const rules = [] - if (field.type == 'string') { - if (field.maxLength) { - rules.push( - (v: string | null) => - (v?.length || 0) <= field.maxLength! || - `Maximaal ${field.maxLength} karakters` - ) - } - } - if (field.type == 'enum') { - if (field.allowedItems) { - rules.push( - (v: string | null) => - (v ? Object.values(field.allowedItems!).includes(v) : true) || - 'Selecteer 1 van de toegestane waardes.' - ) - } - } - - if (field.required) { - rules.push((v: string | null) => !!v || 'Dit veld moet ingevuld zijn.') - } - return rules -} - -export function buildPlaceholderFromSchema(field: SchemaProperties): string { - if (field.show_always) { - return 'Dit veld is niet ingevuld' - } - return '' -} diff --git a/frontend-beheer/src/utils/editor.ts b/frontend-beheer/src/utils/editor.ts new file mode 100644 index 00000000..7fceae80 --- /dev/null +++ b/frontend-beheer/src/utils/editor.ts @@ -0,0 +1,69 @@ +import WProofreaderSDK from '@webspellchecker/wproofreader-sdk-js' + +export const countWithoutHTMLTags = (fieldValue: string | null) => { + if (!fieldValue) { + return 0 + } + const doc = new DOMParser().parseFromString(fieldValue, 'text/html') + const text = doc.documentElement.textContent || '' + return text.trim().length +} + +export function toRichTextFormat(htmlTags: string[]) { + const allowedFormatsSet = new Set() + htmlTags.forEach((tag: string) => { + if (tag in htmlTagFormatMap) { + const format = htmlTagFormatMap[tag] + allowedFormatsSet.add(JSON.stringify({ + class: format!.class, + type: format!.type, + })) + } + }) + return Array.from(allowedFormatsSet, text => JSON.parse(text)) +} + +export interface Format { + class: string + type: string +} + +const htmlTagFormatMap: Record = { + em: { class: 'italic', type: '' }, + i: { class: 'italic', type: '' }, + strong: { class: 'bold', type: '' }, + b: { class: 'bold', type: '' }, + ul: { class: 'list', type: 'bullet' }, + ol: { class: 'list', type: 'ordered' }, +} + +export const initSpellchecker = (editorElement: HTMLElement) => { + WProofreaderSDK.init({ + 'container': editorElement, + 'autoDestroy': true, + 'autocorrect': false, + 'autocomplete': true, + 'disableOptionsStorage': [ + 'autocorrect', + ], + 'enforceAI': false, + 'serviceId': 'LcJrweLQQxt0p4K', + 'serviceProtocol': 'https', + 'servicePort': '443', + 'serviceHost': 'svc.webspellchecker.net', + 'servicePath': 'api', + 'lang': 'nl_NL', + 'theme': 'default', + 'localization': 'nl', + 'enableBadgeButton': true, + 'globalBadge': false, + 'enableLanguagesInBadgeButton': false, + 'actionItems': [ + 'ignoreAll', + // "ignore", + // "proofreadDialog", + // "addWord", + ], + 'settingsSections': [], + }) +} diff --git a/frontend-beheer/src/utils/form.ts b/frontend-beheer/src/utils/form.ts new file mode 100644 index 00000000..928316b7 --- /dev/null +++ b/frontend-beheer/src/utils/form.ts @@ -0,0 +1,68 @@ +import { FormFieldProperties } from '@/types/form' +import { countWithoutHTMLTags } from '@/utils/editor' + +export function buildRulesFromProperties( + field: FormFieldProperties +): ((v: any) => boolean | string)[] { + const rules = [] + if ( + field.type == 'textarea' || + field.type == 'rich-textarea' || + field.type == 'name-textarea' + ) { + if (field.maxLength) { + // Rule: Only maximum amount of characters allowed + rules.push((v: string | null) => { + return ( + countWithoutHTMLTags(v) <= field.maxLength! || + `Maximaal ${field.maxLength} karakters` + ) + }) + } + } + if (field.type == 'select') { + // Rule: Only allowed items allowed. + if (field.allowedItems) { + rules.push( + (v: string | null) => + (v ? Object.values(field.allowedItems!).includes(v) : true) || + 'Selecteer 1 van de toegestane waardes.' + ) + } + } + + if (field.type == 'multi-select' || field.type == 'optional-select') { + // Rule: Only max items allowed + rules.push((v: string[] | null) => { + if (!v) return true + if (!field.maxItems) return true + const errorMsg = `Selecteer maximaal ${field.maxItems} waardes.` + return v.length > field.maxItems ? errorMsg : true + }) + } + + if (field.type == 'multi-select') { + // Rule: only values present in *allowedItems* can be used. + rules.push((v: string[] | string | null) => { + if (!v) return true + if (!field.allowedItems) return true + const errorMsg = 'Selecteer alleen toegestane waardes.' + + if (Array.isArray(v)) { + const firstBadEntry = v.find( + (value) => + // Finds value *outside* of allowedItems. + !Object.values(field.allowedItems!).includes(value) + ) + return !!firstBadEntry ? errorMsg : true + } else { + return Object.values(field.allowedItems!).includes(v) ? true : errorMsg + } + }) + } + + if (field.required) { + rules.push((v: string | null) => !!v || 'Dit veld moet ingevuld zijn.') + } + return rules +} diff --git a/frontend-beheer/src/util/index.ts b/frontend-beheer/src/utils/index.ts similarity index 100% rename from frontend-beheer/src/util/index.ts rename to frontend-beheer/src/utils/index.ts diff --git a/frontend-beheer/src/views/FormGenerator.vue b/frontend-beheer/src/views/FormGenerator.vue index 4f164b6c..7567e509 100644 --- a/frontend-beheer/src/views/FormGenerator.vue +++ b/frontend-beheer/src/views/FormGenerator.vue @@ -1,59 +1,63 @@ + + diff --git a/frontend/components/HighlightedAlgorithms.vue b/frontend/components/HighlightedAlgorithms.vue deleted file mode 100644 index 9a4a2542..00000000 --- a/frontend/components/HighlightedAlgorithms.vue +++ /dev/null @@ -1,54 +0,0 @@ - - - - diff --git a/frontend/components/HomePageText.vue b/frontend/components/HomePageText.vue deleted file mode 100644 index d79ba8ad..00000000 --- a/frontend/components/HomePageText.vue +++ /dev/null @@ -1,45 +0,0 @@ - - - - - diff --git a/frontend/components/LanguageDisclaimer.vue b/frontend/components/LanguageDisclaimer.vue new file mode 100644 index 00000000..6ccaa4e9 --- /dev/null +++ b/frontend/components/LanguageDisclaimer.vue @@ -0,0 +1,85 @@ + + + + + diff --git a/frontend/components/LanguagePicker.vue b/frontend/components/LanguagePicker.vue index 86e471e0..3f68a2a7 100644 --- a/frontend/components/LanguagePicker.vue +++ b/frontend/components/LanguagePicker.vue @@ -1,34 +1,136 @@ diff --git a/frontend/components/ListifyString.vue b/frontend/components/ListifyString.vue index 4ded453b..8c4b7354 100644 --- a/frontend/components/ListifyString.vue +++ b/frontend/components/ListifyString.vue @@ -1,27 +1,80 @@ - diff --git a/frontend/components/SearchBar.vue b/frontend/components/SearchBar.vue index 3774af16..40d81ba9 100644 --- a/frontend/components/SearchBar.vue +++ b/frontend/components/SearchBar.vue @@ -1,23 +1,45 @@ diff --git a/frontend/components/SearchResultCard.vue b/frontend/components/SearchResultCard.vue index 2689b11a..117d3c74 100644 --- a/frontend/components/SearchResultCard.vue +++ b/frontend/components/SearchResultCard.vue @@ -1,55 +1,60 @@ @@ -57,16 +62,14 @@ - - diff --git a/frontend/components/algoritme/AppTable.vue b/frontend/components/algoritme/AppTable.vue index 02a21d02..fcf16bb1 100644 --- a/frontend/components/algoritme/AppTable.vue +++ b/frontend/components/algoritme/AppTable.vue @@ -2,7 +2,7 @@ - - + @@ -86,18 +86,21 @@ const interestingColumns: string[] = [ ] const columnApi = await algoritmeService.getColumns() -const columns = computed(() => - columnApi.data.value - .filter((column: any) => { - return interestingColumns.includes(column.column_name) - }) - .map((column: any) => { - return { - key: column.column_name, - label: t(`algorithmProperties.default.${column.column_name}.label`), - } - }) -) +const columns = computed(() => { + if (columnApi.data.value) { + return columnApi.data.value + .filter((column: any) => { + return interestingColumns.includes(column.column_name) + }) + .map((column: any) => { + return { + key: column.column_name, + label: t(`algorithmProperties.default.${column.column_name}.label`), + } + }) + } + return [] +}) const countData = ref<[{ descriptor: string; count: string; fraction: number }]>() diff --git a/frontend/components/dashboard/DataCompleteness.vue b/frontend/components/dashboard/DataCompleteness.vue index 38322157..218bf0c4 100644 --- a/frontend/components/dashboard/DataCompleteness.vue +++ b/frontend/components/dashboard/DataCompleteness.vue @@ -7,30 +7,32 @@
{{ loadingText }}...
-
+
{{ property.keyLabel }}
{{ row.descriptor }}
- - - - - - - - - - - - - - -
- {{ value }} - {{ numberOfMatches }} - Percentage -
{{ t(agg.label) }} - {{ agg.value }} - - {{ agg.fraction }}% -
+ + + + + + + + + + + + + + + + +
+ {{ value }} + {{ numberOfMatches }} + Percentage +
{{ t(agg.label) }} + {{ agg.value }} + + {{ agg.fraction }}% +
+
diff --git a/frontend/components/faq/FaqAccordionRow.vue b/frontend/components/faq/FaqAccordionRow.vue new file mode 100644 index 00000000..7f6b2dc8 --- /dev/null +++ b/frontend/components/faq/FaqAccordionRow.vue @@ -0,0 +1,76 @@ + + + + + diff --git a/frontend/components/faq/FaqAccordionRows.vue b/frontend/components/faq/FaqAccordionRows.vue new file mode 100644 index 00000000..1d52d411 --- /dev/null +++ b/frontend/components/faq/FaqAccordionRows.vue @@ -0,0 +1,15 @@ + + + diff --git a/frontend/components/faq/FaqAccordions.vue b/frontend/components/faq/FaqAccordions.vue new file mode 100644 index 00000000..a3b6d4d4 --- /dev/null +++ b/frontend/components/faq/FaqAccordions.vue @@ -0,0 +1,39 @@ + + + + + diff --git a/frontend/components/filter/FilterBlock.vue b/frontend/components/filter/FilterBlock.vue new file mode 100644 index 00000000..a8e66742 --- /dev/null +++ b/frontend/components/filter/FilterBlock.vue @@ -0,0 +1,105 @@ + + + + + diff --git a/frontend/components/filter/FilterGroup.vue b/frontend/components/filter/FilterGroup.vue new file mode 100644 index 00000000..30a1fcc1 --- /dev/null +++ b/frontend/components/filter/FilterGroup.vue @@ -0,0 +1,142 @@ + + + + + diff --git a/frontend/components/filter/OrgTypeButton.vue b/frontend/components/filter/OrgTypeButton.vue new file mode 100644 index 00000000..64bd61da --- /dev/null +++ b/frontend/components/filter/OrgTypeButton.vue @@ -0,0 +1,61 @@ + + + + + diff --git a/frontend/components/filter/OrgTypeSelector.vue b/frontend/components/filter/OrgTypeSelector.vue new file mode 100644 index 00000000..3f02f79f --- /dev/null +++ b/frontend/components/filter/OrgTypeSelector.vue @@ -0,0 +1,48 @@ + + + + + diff --git a/frontend/components/form/OverheidButton.vue b/frontend/components/form/OverheidButton.vue index e587435a..70a10d76 100644 --- a/frontend/components/form/OverheidButton.vue +++ b/frontend/components/form/OverheidButton.vue @@ -7,7 +7,7 @@ + diff --git a/frontend/components/frontpage/InfoBlock.vue b/frontend/components/frontpage/InfoBlock.vue new file mode 100644 index 00000000..abefc933 --- /dev/null +++ b/frontend/components/frontpage/InfoBlock.vue @@ -0,0 +1,29 @@ + + + + + diff --git a/frontend/components/views/AppBreadcrumb.vue b/frontend/components/views/AppBreadcrumb.vue index c532c675..0708c523 100644 --- a/frontend/components/views/AppBreadcrumb.vue +++ b/frontend/components/views/AppBreadcrumb.vue @@ -3,19 +3,19 @@
diff --git a/frontend/components/views/AppFooter.vue b/frontend/components/views/AppFooter.vue index 8caef907..f480ad60 100644 --- a/frontend/components/views/AppFooter.vue +++ b/frontend/components/views/AppFooter.vue @@ -2,10 +2,10 @@ - diff --git a/frontend/components/views/AppHeader.vue b/frontend/components/views/AppHeader.vue index 92203524..3f66294e 100644 --- a/frontend/components/views/AppHeader.vue +++ b/frontend/components/views/AppHeader.vue @@ -32,24 +32,25 @@ class="header__nav" :class="!menuExpanded && 'header__nav--closed'" > -
+
  • - - {{ item.label }} - + {{ item.label }}
+
@@ -98,4 +99,11 @@ a:focus { background-color: $secondary; color: $primary-dark; } + +.header-content { + max-width: 1175px; + padding: 0 1em; + display: flex; + justify-content: space-between; +} diff --git a/frontend/composables/useLocale.ts b/frontend/composables/useLocale.ts index 684288a8..f447b663 100644 --- a/frontend/composables/useLocale.ts +++ b/frontend/composables/useLocale.ts @@ -1,12 +1,12 @@ export const useLocale = () => { const router = useRouter() const { locale } = useI18n() - const switchLocalePath = useSwitchLocalePath() + const $switchLocalePath = useSwitchLocalePath() const setLocale = (newLocale: string) => { locale.value = newLocale - router.push({ path: switchLocalePath(newLocale) }) + router.push({ path: $switchLocalePath(newLocale) }) } return { setLocale, currentLocale: locale } diff --git a/frontend/composables/useTextLoader.ts b/frontend/composables/useTextLoader.ts index b322d0a8..6b7c9266 100644 --- a/frontend/composables/useTextLoader.ts +++ b/frontend/composables/useTextLoader.ts @@ -9,7 +9,7 @@ export const useTextLoader = () => { * Which will look up the indicated path in the supporting text from textLoader instead. * * Description. To migrate to textLoader from i18n do the following: - * const { t } = usei18n() -> const { p } = usetextLoader() + * const { t } = usei18n() -> const { p } = useTextLoader() * t('someKeyHere') -> p('someKeyHere') */ const { currentLocale } = useLocale() @@ -19,11 +19,10 @@ export const useTextLoader = () => { () => null ) + const localPrefix = `/${currentLocale.value}` // Looks up key in the supporting text. language is based on currentLocale const p = (key: string) => { - if (!supportingText.value) { - return key - } + if (!supportingText.value) return key try { const localisedSupportText = supportingText.value[currentLocale.value] @@ -32,8 +31,9 @@ export const useTextLoader = () => { .reduce( (obj, subKey) => obj[subKey as keyof SupportingText], localisedSupportText - ) - return value + ) as string + + return value.replace('{localised_url}', localPrefix) } catch (error) { return key } diff --git a/frontend/config/config.ts b/frontend/config/config.ts index 85a9660c..958620f9 100644 --- a/frontend/config/config.ts +++ b/frontend/config/config.ts @@ -4,6 +4,7 @@ const textVersionMapping: { [key: string]: string } = { '0.2.3': 'default', '0.3.1': 'default', '0.4.0': '0_4_0', + '1.0.0': '1_0_0', } const keys = { @@ -50,10 +51,26 @@ const navigationItems = [ localeName: 'navigation.toegankelijkheid', routeName: 'toegankelijkheid', }, + { + localeName: 'navigation.webarchief', + routeName: 'webarchief', + }, + { + localeName: 'navigation.meedoen', + routeName: 'meedoen', + }, + { + localeName: 'navigation.over-algoritmes', + routeName: 'over-algoritmes', + }, { localeName: 'navigation.db', routeName: 'dashboard', }, + { + localeName: 'navigation.versie-informatie', + routeName: 'versie-informatie', + }, ] const backendContentLanguage = 'nl' diff --git a/frontend/config/footer.ts b/frontend/config/footer.ts index cedd44d2..751c0c02 100644 --- a/frontend/config/footer.ts +++ b/frontend/config/footer.ts @@ -7,8 +7,12 @@ const footer: FooterColumn = { path: '/over', }, { - key: 'contact', - path: '/contact', + key: 'over_algoritmes', + path: '/over-algoritmes', + }, + { + key: 'meedoen', + path: '/meedoen', }, { key: 'vragen', @@ -22,6 +26,18 @@ const footer: FooterColumn = { key: 'toegankelijkheid', path: '/toegankelijkheid', }, + { + key: 'webarchief', + path: '/webarchief', + }, + { + key: 'contact', + path: '/contact', + }, + { + key: 'versie-informatie', + path: '/versie-informatie', + }, ], external: [ { diff --git a/frontend/i18n.config.ts b/frontend/i18n.config.ts new file mode 100644 index 00000000..fc8d9ae3 --- /dev/null +++ b/frontend/i18n.config.ts @@ -0,0 +1,10 @@ +import en from './locales/en.json' +import nl from './locales/nl.json' + +export default defineI18nConfig(() => ({ + fallbackLocale: 'nl', + messages: { + nl, + en, + }, +})) diff --git a/frontend/layouts/default.vue b/frontend/layouts/default.vue index 1f70a355..3ced0aa3 100644 --- a/frontend/layouts/default.vue +++ b/frontend/layouts/default.vue @@ -6,16 +6,12 @@ -
+
- - - +
{{ readAfterLanguageChange }}
@@ -27,7 +23,6 @@ import AppContentBar from '@/components/views/AppContentBar.vue' import AppHeader from '@/components/views/AppHeader.vue' import AppBreadcrumb from '@/components/views/AppBreadcrumb.vue' import AppFooter from '@/components/views/AppFooter.vue' -import LanguagePicker from '~~/components/LanguagePicker.vue' import { pageTitleInfo } from '~~/utils' const { t, locale } = useI18n() @@ -55,6 +50,10 @@ watch(locale, () => { margin: 0 auto 10px auto; } +.bottom-margin { + padding-bottom: 1.5em; +} + .row { display: flex; } diff --git a/frontend/locales/en.json b/frontend/locales/en.json index 46d4bb1c..908a05c0 100644 --- a/frontend/locales/en.json +++ b/frontend/locales/en.json @@ -8,6 +8,17 @@ "l3": "The name of the responsible organisation of the algorithm." } }, + "language-picker": { + "language": "Language" + }, + "filter": { + "organisation": "Organisation", + "searchtext": "Search term", + "selectedFilters": "Your selected filters", + "pickOrgType": "Choose an organisation type", + "pickOrg": "Choose an organisation", + "aria/remove": "Remove {what} as filter" + }, "english?": "true", "home-highlight-algorithm-text": "Or go directly to one of these algorithms", "you-are-here": "You are here", @@ -28,13 +39,17 @@ "textAskApply": "Please apply", "paths": { "algoritme": "Overview", - "over": "About this website", "contact": "Contact us", "privacyverklaring": "Privacy", "kwetsbaarheid": "Report vulnerability", "toegankelijkheid": "Accessibility", + "webarchief": "Webarchive", "cookies": "Cookies", "vragen": "FAQ", + "over": "About the Algorithm register", + "meedoen": "Join", + "over_algoritmes": "About algorithms", + "versie-informatie": "Version information", "ext_overheid_nl": "Overheid.nl", "ext_rijksoverheid_nl": "Rijksoverheid.nl", "ext_digitaleoverheid_nl": "Digitale Overheid", @@ -51,31 +66,33 @@ "hello": "Hello, {name}!", "language": "Language", "homepageTitle": "The Algorithm Register of the Dutch government", - "searchExplanation": "Find algorithms by organisation, title or description", + "searchExplanation": "Find one of the {n} algorithms.", + "algorithms": "algorithms", "logoCaption": "The Algorithm Register", "searchHint": "What are you looking for?", "search": "Search", - "selectedAlgorithms": "Selected algorithms", - "filters": { - "aria/remove": "Remove {what} as filter" - }, - "downloadAllAlgorithms": "Download all algorithms (.csv)", + "downloadAllAlgorithms": "Download all algorithms (.xlsx)", "switchToLanguage": "Switch to {language}", "showFilters": "Show filters", "hideFilters": "Hide filters", "searchResultCard": { - "readMore": "Read more" + "readMore": "Read more", + "lastChange": "Last change on" }, "navigation": { "home": "Home", "algorithmRegister": "Algorithms", "footer": "Home", - "over": "About this website", + "over": "About the Algorithm register", + "over-algoritmes": "About Algorithms", + "meedoen": "Join", "contact": "Contact", "vragen": "FAQ", "privacyverklaring": "Privacy", "toegankelijkheid": "Accessibility", - "db": "Dashboard" + "webarchief": "Webarchive", + "db": "Dashboard", + "versie-informatie": "Version information" }, "pagination": { "page": "Page", @@ -431,6 +448,138 @@ "label": "Risk management", "description": "An overview of how risks are dealt with." } + }, + "1_0_0": { + "headers": { + "algemeneInformatie": "General information", + "verantwoordGebruik": "Responsible use", + "werking": "Operations", + "metadata": "Metadata" + }, + "name": { + "label": "Name", + "description": "The name used to refer to the algorithm." + }, + "organization": { + "label": "Organisation", + "description": "The full name of the organisation using the algorithm." + }, + "description_short": { + "label": "Short description", + "description": "A brief description of the algorithm" + }, + "type": { + "label": "Self-learning", + "description": "Is it algorithm or self-learning? In a non-self-learning algorithm, the human specifies the rules for the computer to follow. If it's a self-learning algorithm, the machine learns about the patterns in the data." + }, + "category": { + "label": "Theme", + "description": "Keywords related to the domain in which the algorithm is deployed." + }, + "publication_category": { + "label": "Publication category", + "description": "To determine which algorithms should be published, a distinction is made between impactful and other algorithms. The AI ​​act also defines 'High-risk AI systems'. " + }, + "lawful_basis_grouping": { + "label": "Links to legal bases", + "description": "Links to the legal bases for the process in which the algorithm is used." + }, + "source_data_grouping": { + "label": "Links to data sources", + "description": "Links to additional information about the used data sources." + }, + "impacttoetsen_grouping": { + "label": "Links to impact assessment", + "description": "Link to the results of a conducted impact assessment such as a DPIA or IAMA." + }, + "impacttoetsen": { + "label": "Elaboration on impact assessments", + "description": "Elaboration on why certain impact assessment were not performed." + }, + "process_index_url": { + "label": "Link to Processing Index", + "description": "Link to a public share of the processing index relevant to the algorithm. There you will find more information on the processing." + }, + "website": { + "label": "Link to publication website", + "description": "The URL of the publication website of the organisation. On this page, you may find more information regarding the deployment of the algorithm at the organisation." + }, + "status": { + "label": "Status", + "description": "The current implementation state of the algorithm: in development, in use, or out of service." + }, + "begin_date": { + "label": "Begin date", + "description": "Month and year in which the algorithm was launched." + }, + "end_date": { + "label": "End date", + "description": "Month in which the algorithm was retired." + }, + "goal": { + "label": "Goal and impact", + "description": "The purpose for which the algorithm was developed and the impact it has on civilians and companies." + }, + "proportionality": { + "label": "Considerations", + "description": "A consideration of pros and cons regarding the deployment of the algorithm and why this is reasonably justified." + }, + "provider": { + "label": "External provider", + "description": "If applicable, the external provider of the algorithm." + }, + "lawful_basis": { + "label": "Legal basis", + "description": "A description of the legal basis for the process in which the algorithm is used." + }, + "url": { + "label": "Link to source registration", + "description": "The URL of the secondary register in which this algorithm was previously documented; in machine readable format" + }, + "contact_email": { + "label": "Contact information", + "description": "Contact information for this registration." + }, + "lang": { + "label": "Language", + "description": "The language in which this registration is documented." + }, + "standard_version": { + "label": "Publication Standard", + "description": "The registration scheme; in machine readable format." + }, + "uuid": { + "label": "National-ID", + "description": "The unique user identification (UUID) of this registration." + }, + "source_id": { + "label": "Source-ID", + "description": "The unique code the owner uses for this algorithm." + }, + "tags": { + "label": "Tags", + "description": "Keywords describing the algorithm to improve search engine results in this register." + }, + "source_data": { + "label": "Data", + "description": "An overview of data that are used by the algorithm and/or were initially being used to create the algorithm." + }, + "methods_and_models": { + "label": "Technical design", + "description": "Explanation of how the algorithm works." + }, + "publiccode": { + "label": "Link to code base", + "description": "The URL of the code base of the developer. On this page, you may find more specific information regarding the algorithm's code itself." + }, + "human_intervention": { + "label": "Human intervention", + "description": "A description of how the output of the algorithm is used by humans and how they can be reviewed and edited." + }, + "risks": { + "label": "Risk management", + "description": "An overview of how risks are dealt with." + } } } -} \ No newline at end of file +} diff --git a/frontend/locales/nl.json b/frontend/locales/nl.json index 35967ba1..afed1b31 100644 --- a/frontend/locales/nl.json +++ b/frontend/locales/nl.json @@ -8,6 +8,17 @@ "l3": "De naam van de organisatie die verantwoordelijk is voor het algoritme." } }, + "language-picker": { + "language": "Taal" + }, + "filter": { + "organisation": "Organisatie", + "searchtext": "Zoekterm", + "selectedFilters": "Je gekozen filters", + "pickOrgType": "Kies een organisatietype", + "pickOrg": "Kies een organisatie", + "aria/remove": "{what} verwijderen als filter" + }, "english?": "false", "home-highlight-algorithm-text": "Of bekijk direct een van de volgende algoritmes", "you-are-here": "U bent hier", @@ -28,13 +39,17 @@ "textAskApply": "Meld je dan aan", "paths": { "algoritme": "Algoritmeoverzicht", - "over": "Over deze website", "contact": "Contact", "privacyverklaring": "Privacy", "kwetsbaarheid": "Kwetsbaarheid melden", "toegankelijkheid": "Toegankelijkheid", + "webarchief": "Webarchief", "cookies": "Cookies", "vragen": "Veelgestelde vragen", + "over": "Over het Algoritmeregister", + "meedoen": "Meedoen", + "over_algoritmes": "Over algoritmes", + "versie-informatie": "Versie-informatie", "ext_overheid_nl": "Overheid.nl", "ext_rijksoverheid_nl": "Rijksoverheid.nl", "ext_digitaleoverheid_nl": "Digitale Overheid", @@ -51,31 +66,33 @@ "hello": "Hallo, {name}!", "language": "Taal", "homepageTitle": "Het Algoritmeregister van de Nederlandse overheid", - "searchExplanation": "Zoek algoritmes op organisatie, titel of omschrijving", + "searchExplanation": "Vind een van de {n} algoritmes", + "algorithms": "algoritmes", "logoCaption": "Het Algoritmeregister", "searchHint": "Waar ben je naar op zoek?", "search": "Zoeken", - "selectedAlgorithms": "Geselecteerde algoritmes", - "filters": { - "aria/remove": "{what} verwijderen als filter" - }, - "downloadAllAlgorithms": "Download alle algoritmes (.csv)", + "downloadAllAlgorithms": "Download alle algoritmes (.xlsx)", "switchToLanguage": "Toon in het {language}", "showFilters": "Toon filters", "hideFilters": "Verberg filters", "searchResultCard": { - "readMore": "Lees meer" + "readMore": "Lees meer", + "lastChange": "Laatst gewijzigd op" }, "navigation": { "home": "Home", "algorithmRegister": "Algoritmes", "footer": "Home", - "over": "Over deze website", "contact": "Contact", "vragen": "Veelgestelde vragen", + "over": "Over het algoritmeregister", + "over-algoritmes": "Over algoritmes", + "meedoen": "Meedoen", "privacyverklaring": "Privacy", "toegankelijkheid": "Toegankelijkheid", - "db": "Dashboard" + "webarchief": "Webarchief", + "db": "Dashboard", + "versie-informatie": "Versie-informatie" }, "pagination": { "page": "Pagina", @@ -404,6 +421,138 @@ "label": "Risicobeheer", "description": "Een overzicht van de voorziene risico's bij de inzet van het algoritme." } + }, + "1_0_0": { + "headers": { + "algemeneInformatie": "Algemene informatie", + "verantwoordGebruik": "Verantwoord gebruik", + "werking": "Werking", + "metadata": "Metadata" + }, + "name": { + "label": "Naam", + "description": "De naam die gebruikt wordt om het algoritme aan te duiden." + }, + "organization": { + "label": "Organisatie", + "description": "De volledige naam van de organisatie waar het algoritme ingezet wordt." + }, + "description_short": { + "label": "Korte omschrijving", + "description": "Een korte beschrijving van het algoritme." + }, + "type": { + "label": "(Zelf)lerend", + "description": "Is het algoritme zelflerend? In een niet-zelflerend algoritme specificeert de mens de regels die de computer moet volgen. Als het een zelflerend algoritme is, leert de machine over de patronen in de data." + }, + "category": { + "label": "Thema", + "description": "Het beleidsterrein waarin het algoritme wordt ingezet." + }, + "publication_category": { + "label": "Publicatiecategorie", + "description": "Om te bepalen welke algoritmes gepubliceerd moeten worden, is onderscheid gemaakt tussen impactvolle en overige algoritmes. Ook definieert de AI-verordening ‘Hoog-risico AI-systemen'. " + }, + "lawful_basis_grouping": { + "label": "Links naar wettelijke basis", + "description": "Links naar de wettelijke grondslag(en) voor het proces waarin het algoritme ingezet wordt. " + }, + "source_data_grouping": { + "label": "Links naar gegevensbronnen", + "description": "Link naar aanvullende informatie over de gebruikte gegevensbron. " + }, + "impacttoetsen_grouping": { + "label": "Links naar impacttoetsen", + "description": "Link naar de resultaten van een uitgevoerde impacttoets, zoals een DPIA of IAMA" + }, + "impacttoetsen": { + "label": "Toelichting op impacttoetsen", + "description": "Toelichting waarom bepaald impacttoetsen niet gedaan zijn." + }, + "process_index_url": { + "label": "Link naar verwerkingsregister", + "description": "Link naar een openbaar deel van een verwerkingsregister die betrekking heeft op een algoritme. Daar kan meer gelezen worden over verwerkingen. " + }, + "website": { + "label": "Link naar publiekspagina", + "description": "Een URL naar een publiekspagina van de organisatie zelf. Op deze pagina kunt u meer vinden over de inzet van het algoritme binnen de organisatie." + }, + "status": { + "label": "Status", + "description": "De status van het algoritme: in ontwikkeling, in gebruik, of buiten gebruik." + }, + "begin_date": { + "label": "Begindatum", + "description": "Maand waarin het algoritme in gebruik is genomen." + }, + "end_date": { + "label": "Einddatum", + "description": "Maand waarin het algoritme buiten gebruik is genomen." + }, + "goal": { + "label": "Doel en impact", + "description": "Het doel waarvoor het algoritme ontwikkeld is en wat voor impact de inzet heeft op burgers en bedrijven." + }, + "proportionality": { + "label": "Afwegingen", + "description": "Een afweging van de voor- en nadelen van de inzet van het algoritme en waarom dit redelijk gerechtvaardigd is." + }, + "provider": { + "label": "Leverancier", + "description": "Indien van toepassing, de externe leverancier van het algoritme." + }, + "lawful_basis": { + "label": "Wettelijke basis", + "description": "Een omschrijving van de wettelijke basis voor het proces waarin het algoritme ingezet wordt." + }, + "url": { + "label": "Link naar bronregistratie", + "description": "De URL van de locatie waar dit algoritme eerder al is vastgelegd; in machine leesbaar formaat." + }, + "contact_email": { + "label": "Contactgegevens", + "description": "De contactgegevens voor deze registratie." + }, + "lang": { + "label": "Taal", + "description": "De taal waarin deze registratie is ingevoerd." + }, + "standard_version": { + "label": "Publicatiestandaard", + "description": "De versie van de publicatiestandaard waar dit algoritme in is geregistreed." + }, + "uuid": { + "label": "Landelijk-ID", + "description": "De unieke code van dit algoritme in het landelijke register." + }, + "source_id": { + "label": "Bron-ID", + "description": "De unieke code van dit algoritme in het register van de eigenaar." + }, + "tags": { + "label": "Tags", + "description": "Trefwoorden over het algoritme, om de vindbaarheid van een algoritmeregistratie te vergroten." + }, + "source_data": { + "label": "Gegevens", + "description": "Een overzicht van de gegevens die gebruikt worden door het algoritme en/of in het begin gebruikt zijn bij het maken van het algoritme." + }, + "methods_and_models": { + "label": "Technische werking", + "description": "Uitleg van hoe het algoritme werkt." + }, + "publiccode": { + "label": "Link naar broncode", + "description": "Een URL naar de codepagina van de ontwikkelaar. Op deze pagina kunt u meer vinden over de code van het algoritme zelf." + }, + "human_intervention": { + "label": "Menselijke tussenkomst", + "description": "Een omschrijving van hoe uitkomsten van het algoritme door een mens gebruikt worden, en op welke wijze deze gebruikt, gecontroleerd en bijgesteld (kunnen) worden." + }, + "risks": { + "label": "Risicobeheer", + "description": "Een overzicht van de voorziene risico's bij de inzet van het algoritme." + } } }, "error": { @@ -433,4 +582,4 @@ "11": "november", "12": "december" } -} \ No newline at end of file +} diff --git a/frontend/nuxt.config.ts b/frontend/nuxt.config.ts index 96a14dc1..79f35b37 100644 --- a/frontend/nuxt.config.ts +++ b/frontend/nuxt.config.ts @@ -1,7 +1,9 @@ -import en from './locales/en.json' -import nl from './locales/nl.json' // https://next.vuetifyjs.com/en/features/treeshaking/#automatic-treeshaking // import vuetify from 'vite-plugin-vuetify' +import { resolve, dirname } from 'node:path' +import { fileURLToPath } from 'url' +import VueI18nVitePlugin from '@intlify/unplugin-vue-i18n/vite' +// import algoritmeService from './services/algoritme' export default defineNuxtConfig({ app: { @@ -9,22 +11,30 @@ export default defineNuxtConfig({ link: [{ rel: 'icon', type: 'image/png', href: '/favicon.ico' }], }, }, - modules: ['nuxt-icon', '@nuxtjs/i18n'], + modules: [ + 'nuxt-icon', + '@nuxtjs/i18n', + 'nuxt-security', + 'nuxt-simple-sitemap', + ], i18n: { - strategy: 'prefix', locales: ['nl', 'en'], defaultLocale: 'nl', - vueI18n: { - globalInjection: true, - locale: 'nl', - fallbackLocale: 'nl', - messages: { - en, - nl, - }, - }, + strategy: 'prefix', + rootRedirect: 'nl', + vueI18n: './i18n.config.ts', + }, + sitemap: { + exclude: ['/en/**'], // No english versions }, vite: { + plugins: [ + VueI18nVitePlugin({ + include: [ + resolve(dirname(fileURLToPath(import.meta.url)), './locales/*.json'), + ], + }), + ], css: { preprocessorOptions: { scss: { @@ -46,4 +56,32 @@ export default defineNuxtConfig({ typescript: { typeCheck: true, }, + security: { + headers: { + crossOriginEmbedderPolicy: false, + contentSecurityPolicy: { + 'base-uri': ["'self'"], + 'font-src': ["'self'", 'https:', 'data:'], + 'form-action': ["'self'"], // Change to "'self' localhost:8000" to make forms works + 'frame-ancestors': ["'self'"], + 'img-src': ["'self'", 'https://statistiek.rijksoverheid.nl', 'data:'], + 'object-src': ["'none'"], + 'script-src-attr': ["'none'"], + 'style-src': ["'self'", 'https:', "'unsafe-inline'"], + 'upgrade-insecure-requests': true, + }, + referrerPolicy: 'strict-origin-when-cross-origin', + xContentTypeOptions: 'nosniff', + xDNSPrefetchControl: 'off', + xFrameOptions: 'SAMEORIGIN', + permissionsPolicy: { + camera: ['()'], + 'display-capture': ['()'], + fullscreen: ['()'], + geolocation: ['()'], + microphone: ['()'], + }, + }, + csrf: false, + }, }) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 28684937..6a67114d 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -6,41 +6,54 @@ "": { "hasInstallScript": true, "dependencies": { - "@vitest/coverage-c8": "^0.29.2", - "@vueuse/core": "^9.6.0", - "@vueuse/nuxt": "^9.6.0", - "axios": "^1.1.3", - "qs": "^6.11.0", - "sass": "^1.56.1", - "vite-plugin-vuetify": "^1.0.0", - "vitest": "^0.29.2", + "@intlify/core-base": "^9.3.0-beta.22", + "@intlify/shared": "^9.3.0-beta.24", + "@vitest/coverage-c8": "^0.33.0", + "@vueuse/core": "^10.2.1", + "@vueuse/nuxt": "^10.2.1", + "axios": "^1.4.0", + "nuxt-security": "^0.14.2", + "qs": "^6.11.2", + "sass": "^1.64.1", + "vite-plugin-vuetify": "^1.0.2", + "vitest": "^0.33.0", "vue-i18n": "^9.2.2", "vue-matomo": "^4.2.0", - "vuetify": "^3.0.1" + "vuetify": "^3.3.9" }, "devDependencies": { - "@babel/eslint-parser": "^7.19.1", - "@intlify/unplugin-vue-i18n": "^0.8.0", - "@mdi/font": "^7.0.96", + "@babel/eslint-parser": "^7.22.9", + "@intlify/unplugin-vue-i18n": "^0.12.2", + "@mdi/font": "^7.2.96", "@nuxtjs/eslint-config-typescript": "^12.0.0", - "@nuxtjs/i18n": "^8.0.0-beta.10", + "@nuxtjs/i18n": "^8.0.0-beta.13", "@types/qs": "^6.9.7", - "eslint": "^8.28.0", - "eslint-config-prettier": "^8.5.0", + "eslint": "^8.45.0", + "eslint-config-prettier": "^8.8.0", "eslint-plugin-nuxt": "^4.0.0", - "eslint-plugin-prettier": "^4.2.1", - "nuxt": "3.0.0", - "nuxt-icon": "^0.1.8", - "typescript": "^4.9.4", - "vue-tsc": "^1.0.13" + "eslint-plugin-prettier": "^5.0.0", + "nuxt": "3.6.5", + "nuxt-icon": "^0.4.2", + "nuxt-simple-sitemap": "^3.1.4", + "typescript": "^5.1.6", + "vue-tsc": "^1.8.6" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "devOptional": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { @@ -48,44 +61,45 @@ } }, "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==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" }, "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==", + "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==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.0.tgz", - "integrity": "sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", + "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.0", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.21.0", - "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.0", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.9", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.8", + "@babel/types": "^7.22.5", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.2", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -96,29 +110,29 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.19.1.tgz", - "integrity": "sha512-AqNf2QWt1rtu2/1rLswy6CDP7H9Oh3mMhk177Y67Rg8d7RD9WfOLLv8CGn6tisFvS2htm86yIe1yLF6I1UDaGQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.23.3.tgz", + "integrity": "sha512-9bTuNlyx7oSstodm1cR1bECj4fkiknsDa1YniISkJemMY3DGhJNYBECbe6QD/q54mp2J8VO66jW3/7uP//iFCw==", "dev": true, "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": "^10.13.0 || ^12.13.0 || >=14.0.0" }, "peerDependencies": { - "@babel/core": ">=7.11.0", + "@babel/core": "^7.11.0", "eslint": "^7.5.0 || ^8.0.0" } }, "node_modules/@babel/generator": { - "version": "7.21.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.1.tgz", - "integrity": "sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.5.tgz", + "integrity": "sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA==", "dependencies": { - "@babel/types": "^7.21.0", + "@babel/types": "^7.23.5", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -127,40 +141,27 @@ "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==", - "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==", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.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==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz", + "integrity": "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==", "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.9", "lru-cache": "^5.1.1", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -169,31 +170,20 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-compilation-targets/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==", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.2.tgz", - "integrity": "sha512-k22GoYRAHPYr9I+Gvy2ZQlAe5mGy8BqWst2wRt8cwIufWTxrsVshhIBvYNqC80N0GSFWTsqRVexOtfzlgOEDvA==", + "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==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.19.1", - "@babel/helper-split-export-declaration": "^7.18.6" + "@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.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -203,176 +193,188 @@ } }, "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==", + "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==", "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==", + "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==", "dependencies": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.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==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "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.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", - "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", + "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==", "dependencies": { - "@babel/types": "^7.18.9" + "@babel/types": "^7.22.5" }, "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==", + "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==", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "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==", - "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" + "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==", + "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.6", + "@babel/helper-validator-identifier": "^7.22.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.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==", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "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==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz", - "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", + "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.19.1", - "@babel/types": "^7.19.0" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^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": { - "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==", + "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==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", "dependencies": { - "@babel/types": "^7.20.2" + "@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.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==", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "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==", + "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==", "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.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==", "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==", "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==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", + "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" + "@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.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -380,9 +382,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.2.tgz", - "integrity": "sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.5.tgz", + "integrity": "sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==", "bin": { "parser": "bin/babel-parser.js" }, @@ -391,11 +393,11 @@ } }, "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==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -405,11 +407,11 @@ } }, "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==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -419,13 +421,14 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.2.tgz", - "integrity": "sha512-jvS+ngBfrnTUBfOQq8NfGnSbF9BrqlR6hjJ2yVxMkmO5nL/cdifNbI30EfjRlN4g5wYWNnMPyj5Sa6R1pbLeag==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.9.tgz", + "integrity": "sha512-BnVR1CpKiuD0iobHPaM1iLvcwPYN2uVFAqoLVSpEDKWuOikoCv5HbKLxclhKYUXlWkX86DoZGtqI4XhbOsyrMg==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.20.2", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-typescript": "^7.20.0" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.9", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-typescript": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -435,39 +438,39 @@ } }, "node_modules/@babel/standalone": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.21.2.tgz", - "integrity": "sha512-ySP/TJcyqMJVg1M/lmnPVi6L+F+IJpQ4+0lqtf723LERbk1N8/0JgLgm346cRAzfHaoXkLq/M/mJBd2uo25RBA==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.22.9.tgz", + "integrity": "sha512-RRUFpN2WiHaczMqIhmy7VoruvSw+c3NSq6BczondQ6elJXtKzr9cAWWsWWZvtZ/rYFQpoQlch5VxQe4aWTt8LA==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.2.tgz", - "integrity": "sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw==", - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.1", - "@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.2", - "@babel/types": "^7.21.2", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.5.tgz", + "integrity": "sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w==", + "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" }, @@ -476,12 +479,12 @@ } }, "node_modules/@babel/types": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.2.tgz", - "integrity": "sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.5.tgz", + "integrity": "sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w==", "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -494,809 +497,697 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" }, "node_modules/@cloudflare/kv-asset-handler": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.2.0.tgz", - "integrity": "sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.3.0.tgz", + "integrity": "sha512-9CB/MKf/wdvbfkUdfrj+OkEwZ5b7rws0eogJ4293h+7b6KX5toPwym+VQKmILafNB9YiehqY0DlNrDcDhdWHSQ==", "dependencies": { "mime": "^3.0.0" } }, - "node_modules/@eslint/eslintrc": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", - "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", - "devOptional": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.15.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.16.tgz", + "integrity": "sha512-gCHjjQmA8L0soklKbLKA6pgsLk1byULuHe94lkZDzcO3/Ta+bbeewJioEn1Fr7kgy9NWNFy/C+MrBwC6I/WCug==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=12" } }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz", - "integrity": "sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==", - "devOptional": true, - "dependencies": { - "type-fest": "^0.20.2" - }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.16.tgz", + "integrity": "sha512-wsCqSPqLz+6Ov+OM4EthU43DyYVVyfn15S4j1bJzylDpc1r1jZFFfJQNfDuT8SlgwuqpmpJXK4uPlHGw6ve7eA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "devOptional": true, + "node_modules/@esbuild/android-x64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.16.tgz", + "integrity": "sha512-ldsTXolyA3eTQ1//4DS+E15xl0H/3DTRJaRL0/0PgkqDsI0fV/FlOtD+h0u/AUJr+eOTlZv4aC9gvfppo3C4sw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.7", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", - "integrity": "sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==", - "devOptional": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.16.tgz", + "integrity": "sha512-aBxruWCII+OtluORR/KvisEw0ALuw/qDQWvkoosA+c/ngC/Kwk0lLaZ+B++LLS481/VdydB2u6tYpWxUfnLAIw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=10.10.0" + "node": ">=12" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "devOptional": true, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.16.tgz", + "integrity": "sha512-6w4Dbue280+rp3LnkgmriS1icOUZDyPuZo/9VsuMUTns7SYEiOaJ7Ca1cbhu9KVObAWfmdjUl4gwy9TIgiO5eA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "devOptional": true - }, - "node_modules/@iconify/types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", - "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", - "dev": true - }, - "node_modules/@iconify/vue": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@iconify/vue/-/vue-4.0.1.tgz", - "integrity": "sha512-k4VwcSQpGqJpoyqENRRviFuXlVcquLvQ6BKLNJ6o2amZo7u+3HyALSO79Xyz7Sg68szQGstOk6weaKUF0DJbog==", - "dev": true, - "dependencies": { - "@iconify/types": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/cyberalien" - }, - "peerDependencies": { - "vue": ">=3" + "node": ">=12" } }, - "node_modules/@intlify/bundle-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@intlify/bundle-utils/-/bundle-utils-4.0.0.tgz", - "integrity": "sha512-klXrYT9VXyKEXsD6UY3pShg0O5MPC07n0TZ5RrSs5ry6T1eZVolIFGJi9c3qcDrh1qjJxgikRnPBmD7qGDqbjw==", - "dev": true, - "dependencies": { - "@intlify/message-compiler": "next", - "@intlify/shared": "next", - "jsonc-eslint-parser": "^1.0.1", - "source-map": "0.6.1", - "yaml-eslint-parser": "^0.3.2" - }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.16.tgz", + "integrity": "sha512-x35fCebhe9s979DGKbVAwXUOcTmCIE32AIqB9CB1GralMIvxdnMLAw5CnID17ipEw9/3MvDsusj/cspYt2ZLNQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">= 12" - }, - "peerDependenciesMeta": { - "petite-vue-i18n": { - "optional": true - }, - "vue-i18n": { - "optional": true - } + "node": ">=12" } }, - "node_modules/@intlify/core-base": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.2.2.tgz", - "integrity": "sha512-JjUpQtNfn+joMbrXvpR4hTF8iJQ2sEFzzK3KIESOx+f+uwIjgw20igOyaIdhfsVVBCds8ZM64MoeNSx+PHQMkA==", - "dependencies": { - "@intlify/devtools-if": "9.2.2", - "@intlify/message-compiler": "9.2.2", - "@intlify/shared": "9.2.2", - "@intlify/vue-devtools": "9.2.2" - }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.16.tgz", + "integrity": "sha512-YM98f+PeNXF3GbxIJlUsj+McUWG1irguBHkszCIwfr3BXtXZsXo0vqybjUDFfu9a8Wr7uUD/YSmHib+EeGAFlg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">= 14" + "node": ">=12" } }, - "node_modules/@intlify/core-base/node_modules/@intlify/message-compiler": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.2.2.tgz", - "integrity": "sha512-IUrQW7byAKN2fMBe8z6sK6riG1pue95e5jfokn8hA5Q3Bqy4MBJ5lJAofUsawQJYHeoPJ7svMDyBaVJ4d0GTtA==", - "dependencies": { - "@intlify/shared": "9.2.2", - "source-map": "0.6.1" - }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.16.tgz", + "integrity": "sha512-b5ABb+5Ha2C9JkeZXV+b+OruR1tJ33ePmv9ZwMeETSEKlmu/WJ45XTTG+l6a2KDsQtJJ66qo/hbSGBtk0XVLHw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 14" + "node": ">=12" } }, - "node_modules/@intlify/core-base/node_modules/@intlify/shared": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.2.2.tgz", - "integrity": "sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==", + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.16.tgz", + "integrity": "sha512-XIqhNUxJiuy+zsR77+H5Z2f7s4YRlriSJKtvx99nJuG5ATuJPjmZ9n0ANgnGlPCpXGSReFpgcJ7O3SMtzIFeiQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 14" + "node": ">=12" } }, - "node_modules/@intlify/devtools-if": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/@intlify/devtools-if/-/devtools-if-9.2.2.tgz", - "integrity": "sha512-4ttr/FNO29w+kBbU7HZ/U0Lzuh2cRDhP8UlWOtV9ERcjHzuyXVZmjyleESK6eVP60tGC9QtQW9yZE+JeRhDHkg==", - "dependencies": { - "@intlify/shared": "9.2.2" - }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.16.tgz", + "integrity": "sha512-no+pfEpwnRvIyH+txbBAWtjxPU9grslmTBfsmDndj7bnBmr55rOo/PfQmRfz7Qg9isswt1FP5hBbWb23fRWnow==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 14" + "node": ">=12" } }, - "node_modules/@intlify/devtools-if/node_modules/@intlify/shared": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.2.2.tgz", - "integrity": "sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==", + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.16.tgz", + "integrity": "sha512-Zbnczs9ZXjmo0oZSS0zbNlJbcwKXa/fcNhYQjahDs4Xg18UumpXG/lwM2lcSvHS3mTrRyCYZvJbmzYc4laRI1g==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 14" + "node": ">=12" } }, - "node_modules/@intlify/message-compiler": { - "version": "9.3.0-beta.16", - "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.3.0-beta.16.tgz", - "integrity": "sha512-CGQI3xRcs1ET75eDQ0DUy3MRYOqTauRIIgaMoISKiF83gqRWg93FqN8lGMKcpBqaF4tI0JhsfosCaGiBL9+dnw==", - "dev": true, - "dependencies": { - "@intlify/shared": "9.3.0-beta.16", - "source-map": "0.6.1" - }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.16.tgz", + "integrity": "sha512-YMF7hih1HVR/hQVa/ot4UVffc5ZlrzEb3k2ip0nZr1w6fnYypll9td2qcoMLvd3o8j3y6EbJM3MyIcXIVzXvQQ==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 14" - }, - "funding": { - "url": "https://github.com/sponsors/kazupon" + "node": ">=12" } }, - "node_modules/@intlify/shared": { - "version": "9.3.0-beta.16", - "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.3.0-beta.16.tgz", - "integrity": "sha512-kXbm4svALe3lX+EjdJxfnabOphqS4yQ1Ge/iIlR8tvUiYRCoNz3hig1M4336iY++Dfx5ytEQJPNjIcknNIuvig==", - "dev": true, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.16.tgz", + "integrity": "sha512-Wkz++LZ29lDwUyTSEnzDaaP5OveOgTU69q9IyIw9WqLRxM4BjTBjz9un4G6TOvehWpf/J3gYVFN96TjGHrbcNQ==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 14" - }, - "funding": { - "url": "https://github.com/sponsors/kazupon" + "node": ">=12" } }, - "node_modules/@intlify/unplugin-vue-i18n": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/@intlify/unplugin-vue-i18n/-/unplugin-vue-i18n-0.8.2.tgz", - "integrity": "sha512-cRnzPqSEZQOmTD+p4pwc3RTS9HxreLqfID0keoqZDZweCy/CGRMLLTNd15S4TUf1vSBhPF03DItEFDr1F+8MDA==", - "dev": true, - "dependencies": { - "@intlify/bundle-utils": "^4.0.0", - "@intlify/shared": "next", - "@rollup/pluginutils": "^4.2.0", - "@vue/compiler-sfc": "^3.2.45", - "debug": "^4.3.1", - "fast-glob": "^3.2.5", - "js-yaml": "^4.1.0", - "json5": "^2.2.0", - "pathe": "^1.0.0", - "picocolors": "^1.0.0", - "source-map": "0.6.1", - "unplugin": "^1.0.0" - }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.16.tgz", + "integrity": "sha512-LFMKZ30tk78/mUv1ygvIP+568bwf4oN6reG/uczXnz6SvFn4e2QUFpUpZY9iSJT6Qpgstrhef/nMykIXZtZWGQ==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 14.16" - }, - "peerDependencies": { - "petite-vue-i18n": "*", - "vue-i18n": "*", - "vue-i18n-bridge": "*" - }, - "peerDependenciesMeta": { - "petite-vue-i18n": { - "optional": true - }, - "vue-i18n": { - "optional": true - }, - "vue-i18n-bridge": { - "optional": true - } + "node": ">=12" } }, - "node_modules/@intlify/vue-devtools": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/@intlify/vue-devtools/-/vue-devtools-9.2.2.tgz", - "integrity": "sha512-+dUyqyCHWHb/UcvY1MlIpO87munedm3Gn6E9WWYdWrMuYLcoIoOEVDWSS8xSwtlPU+kA+MEQTP6Q1iI/ocusJg==", - "dependencies": { - "@intlify/core-base": "9.2.2", - "@intlify/shared": "9.2.2" - }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.16.tgz", + "integrity": "sha512-3ZC0BgyYHYKfZo3AV2/66TD/I9tlSBaW7eWTEIkrQQKfJIifKMMttXl9FrAg+UT0SGYsCRLI35Gwdmm96vlOjg==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 14" + "node": ">=12" } }, - "node_modules/@intlify/vue-devtools/node_modules/@intlify/shared": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.2.2.tgz", - "integrity": "sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==", + "node_modules/@esbuild/linux-x64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.16.tgz", + "integrity": "sha512-xu86B3647DihHJHv/wx3NCz2Dg1gjQ8bbf9cVYZzWKY+gsvxYmn/lnVlqDRazObc3UMwoHpUhNYaZset4X8IPA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 14" + "node": ">=12" } }, - "node_modules/@ioredis/commands": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", - "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==" + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.16.tgz", + "integrity": "sha512-uVAgpimx9Ffw3xowtg/7qQPwHFx94yCje+DoBx+LNm2ePDpQXHrzE+Sb0Si2VBObYz+LcRps15cq+95YM7gkUw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.16.tgz", + "integrity": "sha512-6OjCQM9wf7z8/MBi6BOWaTL2AS/SZudsZtBziXMtNI8r/U41AxS9x7jn0ATOwVy08OotwkPqGRMkpPR2wcTJXA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "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==", - "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.16.tgz", + "integrity": "sha512-ZoNkruFYJp9d1LbUYCh8awgQDvB9uOMZqlQ+gGEZR7v6C+N6u7vPr86c+Chih8niBR81Q/bHOSKGBK3brJyvkQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": ">=6.0.0" + "node": ">=12" } }, - "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==", + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.16.tgz", + "integrity": "sha512-+j4anzQ9hrs+iqO+/wa8UE6TVkKua1pXUb0XWFOx0FiAj6R9INJ+WE//1/Xo6FG1vB5EpH3ko+XcgwiDXTxcdw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=6.0.0" + "node": ">=12" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.16.tgz", + "integrity": "sha512-5PFPmq3sSKTp9cT9dzvI67WNfRZGvEVctcZa1KGjDDu4n3H8k59Inbk0du1fz0KrAbKKNpJbdFXQMDUz7BG4rQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=6.0.0" + "node": ">=12" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "node_modules/@esbuild/win32-x64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.16.tgz", + "integrity": "sha512-sCIVrrtcWN5Ua7jYXNG1xD199IalrbfV2+0k/2Zf2OyV2FtnQnMgdzgpRAbi4AWlKJj1jkX+M+fEGPQj6BQB4w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@jridgewell/source-map/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==", + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "devOptional": true, "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "eslint-visitor-keys": "^3.3.0" }, "engines": { - "node": ">=6.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@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==" - }, - "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==", - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "devOptional": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", - "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==", - "dependencies": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" + "node_modules/@eslint-community/regexpp": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.0.tgz", + "integrity": "sha512-uiPeRISaglZnaZk8vwrjQZ1CxogZeY/4IYft6gBOTqu1WhVXWmCmZMWxUv2Q/pxSvPdp1JPaO62kLOcOkMqWrw==", + "devOptional": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@mapbox/node-pre-gyp/node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "node_modules/@eslint/eslintrc": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", + "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", + "devOptional": true, "dependencies": { - "whatwg-url": "^5.0.0" + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" }, "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "devOptional": true, "dependencies": { - "lru-cache": "^6.0.0" + "type-fest": "^0.20.2" }, - "bin": { - "semver": "bin/semver.js" + "engines": { + "node": ">=8" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "devOptional": true, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@mdi/font": { - "version": "7.0.96", - "resolved": "https://registry.npmjs.org/@mdi/font/-/font-7.0.96.tgz", - "integrity": "sha512-rzlxTfR64hqY8yiBzDjmANfcd8rv+T5C0Yedv/TWk2QyAQYdc66e0kaN1ipmnYU3RukHRTRcBARHzzm+tIhL7w==", - "dev": true - }, - "node_modules/@netlify/functions": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@netlify/functions/-/functions-1.3.0.tgz", - "integrity": "sha512-hN/Fgpz8XIOBfsBPLYUMxVKBlCopgeqGB0popayicnmkFLnvKByTTMYgF01wcF9DBtBQdV0H2h1kPFpMl34I8w==", - "dependencies": { - "is-promise": "^4.0.0" - }, + "node_modules/@eslint/js": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", + "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", + "devOptional": true, "engines": { - "node": ">=8.3.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { - "version": "5.1.1-v1", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", - "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", - "dev": true, - "dependencies": { - "eslint-scope": "5.1.1" + "node_modules/@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==", + "engines": { + "node": ">=14" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "devOptional": true, "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" }, "engines": { - "node": ">= 8" + "node": ">=10.10.0" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "devOptional": 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==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "node": ">=12.22" }, - "engines": { - "node": ">= 8" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@nuxt/devalue": { + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "devOptional": true + }, + "node_modules/@iconify/types": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@nuxt/devalue/-/devalue-2.0.0.tgz", - "integrity": "sha512-YBI/6o2EBz02tdEJRBK8xkt3zvOFOWlLBf7WKYGBsSYSRtjjgrqPe2skp6VLLmKx5WbHHDNcW+6oACaurxGzeA==" + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "dev": true }, - "node_modules/@nuxt/kit": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-3.0.0.tgz", - "integrity": "sha512-7ZsOLt5s9a0ZleAIzmoD70JwkZf5ti6bDdxl6f8ew7Huxz+ni/oRfTPTX9TrORXsgW5CvDt6Q9M7IJNPkAN/Iw==", + "node_modules/@iconify/vue": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@iconify/vue/-/vue-4.1.1.tgz", + "integrity": "sha512-RL85Bm/DAe8y6rT6pux7D2FJSiUEM/TPfyK7GrbAOfTSwrhvwJW+S5yijdGcmtXouA8MtuH9C7l4hiSE4mLMjg==", + "dev": true, "dependencies": { - "@nuxt/schema": "3.0.0", - "c12": "^1.0.1", - "consola": "^2.15.3", - "defu": "^6.1.1", - "globby": "^13.1.2", - "hash-sum": "^2.0.0", - "ignore": "^5.2.0", - "jiti": "^1.16.0", - "knitwork": "^1.0.0", - "lodash.template": "^4.5.0", - "mlly": "^1.0.0", - "pathe": "^1.0.0", - "pkg-types": "^1.0.1", - "scule": "^1.0.0", - "semver": "^7.3.8", - "unctx": "^2.1.0", - "unimport": "^1.0.1", - "untyped": "^1.0.0" + "@iconify/types": "^2.0.0" }, - "engines": { - "node": "^14.16.0 || ^16.10.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + "funding": { + "url": "https://github.com/sponsors/cyberalien" + }, + "peerDependencies": { + "vue": ">=3" } }, - "node_modules/@nuxt/kit/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "node_modules/@intlify/bundle-utils": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@intlify/bundle-utils/-/bundle-utils-7.0.2.tgz", + "integrity": "sha512-8wbx9xhbawBFTE5LPTECiK26RRqrNS31jyWSur72ZXZZ4it5jiZTcG6eUJlNirr4+jXYio2DGY299JsGVT4cpw==", + "dev": true, "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "@intlify/message-compiler": "9.3.0-beta.24", + "@intlify/shared": "9.3.0-beta.24", + "acorn": "^8.8.2", + "escodegen": "^2.0.0", + "estree-walker": "^2.0.2", + "jsonc-eslint-parser": "^1.0.1", + "magic-string": "^0.30.0", + "mlly": "^1.2.0", + "source-map-js": "^1.0.1", + "yaml-eslint-parser": "^0.3.2" }, "engines": { - "node": ">=10" + "node": ">= 14.16" + }, + "peerDependenciesMeta": { + "petite-vue-i18n": { + "optional": true + }, + "vue-i18n": { + "optional": true + } } }, - "node_modules/@nuxt/schema": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@nuxt/schema/-/schema-3.0.0.tgz", - "integrity": "sha512-5fwsidhs5NjFzR8sIzHMXO0WFGkI3tCH3ViANn2W4N5qCwoYZ0n1sZBkQ9Esn1VoEed6RsIlTpWrPZPVtqNkGQ==", + "node_modules/@intlify/bundle-utils/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 + }, + "node_modules/@intlify/bundle-utils/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==", + "dev": true, "dependencies": { - "c12": "^1.0.1", - "create-require": "^1.1.1", - "defu": "^6.1.1", - "jiti": "^1.16.0", - "pathe": "^1.0.0", - "pkg-types": "^1.0.1", - "postcss-import-resolver": "^2.0.0", - "scule": "^1.0.0", - "std-env": "^3.3.1", - "ufo": "^1.0.0", - "unimport": "^1.0.1", - "untyped": "^1.0.0" + "@jridgewell/sourcemap-codec": "^1.4.15" }, "engines": { - "node": "^14.16.0 || ^16.10.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + "node": ">=12" } }, - "node_modules/@nuxt/telemetry": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@nuxt/telemetry/-/telemetry-2.1.8.tgz", - "integrity": "sha512-WCHRrcPKRosuHQi8CD5WfjiXGAyjOWVJpK77xS6wlg8zwziBPCqmVIQdr4QpFTGFO1Nrh4z26l1VnivKy22KFQ==", - "dependencies": { - "@nuxt/kit": "^3.0.0-rc.14", - "chalk": "^5.1.2", - "ci-info": "^3.6.1", - "consola": "^2.15.3", - "create-require": "^1.1.1", - "defu": "^6.1.1", - "destr": "^1.2.1", - "dotenv": "^16.0.3", - "fs-extra": "^10.1.0", - "git-url-parse": "^13.1.0", - "inquirer": "^9.1.4", - "is-docker": "^3.0.0", - "jiti": "^1.16.0", - "mri": "^1.2.0", - "nanoid": "^4.0.0", - "node-fetch": "^3.3.0", - "ohmyfetch": "^0.4.21", - "parse-git-config": "^3.0.0", - "rc9": "^2.0.0", - "std-env": "^3.3.1" + "node_modules/@intlify/core-base": { + "version": "9.3.0-beta.22", + "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.3.0-beta.22.tgz", + "integrity": "sha512-Mf+jyneuQxNW7pqLErIzorYrLjWGEGoPDVFrKVQNahdUDnXL/QA0CpvcAltX+Xdmgep+cVMrGD6x99hIF1BfQA==", + "dependencies": { + "@intlify/devtools-if": "9.3.0-beta.22", + "@intlify/message-compiler": "9.3.0-beta.22", + "@intlify/shared": "9.3.0-beta.22", + "@intlify/vue-devtools": "9.3.0-beta.22" }, - "bin": { - "nuxt-telemetry": "bin/nuxt-telemetry.mjs" - } - }, - "node_modules/@nuxt/telemetry/node_modules/chalk": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.1.2.tgz", - "integrity": "sha512-E5CkT4jWURs1Vy5qGJye+XwCkNj7Od3Af7CP6SujMetSMkLs8Do2RWJK5yx1wamHV/op8Rz+9rltjaTQWDnEFQ==", "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "node": ">= 16" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/kazupon" } }, - "node_modules/@nuxt/ui-templates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@nuxt/ui-templates/-/ui-templates-1.0.0.tgz", - "integrity": "sha512-jfpVHxi1AHfNO3D6iD1RJE6fx/7cAzekvG90poIzVawp/L+I4DNdy8pCgqBScJW4bfWOpHeLYbtQQlL/hPmkjw==" - }, - "node_modules/@nuxt/vite-builder": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@nuxt/vite-builder/-/vite-builder-3.0.0.tgz", - "integrity": "sha512-eMnpPpjHU8rGZcsJUksCuSX+6dpId03q8LOSStsm6rXzrNJtZIcwt0nBRTUaigckXIozX8ZNl5u2OPGUfUbMrw==", - "dependencies": { - "@nuxt/kit": "3.0.0", - "@rollup/plugin-replace": "^5.0.1", - "@vitejs/plugin-vue": "^3.2.0", - "@vitejs/plugin-vue-jsx": "^2.1.1", - "autoprefixer": "^10.4.13", - "chokidar": "^3.5.3", - "cssnano": "^5.1.14", - "defu": "^6.1.1", - "esbuild": "^0.15.14", - "escape-string-regexp": "^5.0.0", - "estree-walker": "^3.0.1", - "externality": "^1.0.0", - "fs-extra": "^10.1.0", - "get-port-please": "^2.6.1", - "h3": "^1.0.1", - "knitwork": "^1.0.0", - "magic-string": "^0.26.7", - "mlly": "^1.0.0", - "ohash": "^1.0.0", - "pathe": "^1.0.0", - "perfect-debounce": "^0.1.3", - "pkg-types": "^1.0.1", - "postcss": "^8.4.19", - "postcss-import": "^15.0.0", - "postcss-url": "^10.1.3", - "rollup": "^2.79.1", - "rollup-plugin-visualizer": "^5.8.3", - "ufo": "^1.0.0", - "unplugin": "^1.0.0", - "vite": "~3.2.4", - "vite-node": "^0.25.2", - "vite-plugin-checker": "^0.5.1", - "vue-bundle-renderer": "^1.0.0" + "node_modules/@intlify/core-base/node_modules/@intlify/message-compiler": { + "version": "9.3.0-beta.22", + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.3.0-beta.22.tgz", + "integrity": "sha512-6X5h2v+RRixdB8qC4QZJpao4/sAP7l1nULK17/m0HuZZcTwWhjXvfSft88UCPHCTSj8rQp8Syr7ksKVhgIteKw==", + "dependencies": { + "@intlify/shared": "9.3.0-beta.22", + "source-map-js": "^1.0.2" }, "engines": { - "node": "^14.16.0 || ^16.10.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + "node": ">= 16" }, - "peerDependencies": { - "vue": "^3.2.45" + "funding": { + "url": "https://github.com/sponsors/kazupon" } }, - "node_modules/@nuxt/vite-builder/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==", + "node_modules/@intlify/core-base/node_modules/@intlify/shared": { + "version": "9.3.0-beta.22", + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.3.0-beta.22.tgz", + "integrity": "sha512-GS+OHgYcHaq7a+zC1dlVvEHUYHVPKPC/tV3OmFyKJ2Lm7qAFmX29MQn9WOG4WtUme86tPp5LRFz6mYL5VQUJqQ==", "engines": { - "node": ">=12" + "node": ">= 16" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/kazupon" } }, - "node_modules/@nuxtjs/eslint-config": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@nuxtjs/eslint-config/-/eslint-config-12.0.0.tgz", - "integrity": "sha512-ewenelo75x0eYEUK+9EBXjc/OopQCvdkmYmlZuoHq5kub/vtiRpyZ/autppwokpHUq8tiVyl2ejMakoiHiDTrg==", - "dev": true, + "node_modules/@intlify/core-base/node_modules/@intlify/vue-devtools": { + "version": "9.3.0-beta.22", + "resolved": "https://registry.npmjs.org/@intlify/vue-devtools/-/vue-devtools-9.3.0-beta.22.tgz", + "integrity": "sha512-Qd0kKXsWe1DagjdebFgpbSYe2eWi1rs6fROg8pTbCSqyvOMqsscxMu+Tl+MiXYrZxkfXisR0BefONO7Zpi8UbQ==", "dependencies": { - "eslint-config-standard": "^17.0.0", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-n": "^15.5.1", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-promise": "^6.1.1", - "eslint-plugin-unicorn": "^44.0.2", - "eslint-plugin-vue": "^9.7.0", - "local-pkg": "^0.4.2" + "@intlify/core-base": "9.3.0-beta.22", + "@intlify/shared": "9.3.0-beta.22" }, - "peerDependencies": { - "eslint": "^8.23.0" - } - }, - "node_modules/@nuxtjs/eslint-config-typescript": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@nuxtjs/eslint-config-typescript/-/eslint-config-typescript-12.0.0.tgz", - "integrity": "sha512-HJR0ho5MYuOCFjkL+eMX/VXbUwy36J12DUMVy+dj3Qz1GYHwX92Saxap3urFzr8oPkzzFiuOknDivfCeRBWakg==", - "dev": true, - "dependencies": { - "@nuxtjs/eslint-config": "^12.0.0", - "@typescript-eslint/eslint-plugin": "^5.42.1", - "@typescript-eslint/parser": "^5.42.1", - "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-vue": "^9.7.0" + "engines": { + "node": ">= 16" }, - "peerDependencies": { - "eslint": "^8.23.0" + "funding": { + "url": "https://github.com/sponsors/kazupon" } }, - "node_modules/@nuxtjs/i18n": { - "version": "8.0.0-beta.10", - "resolved": "https://registry.npmjs.org/@nuxtjs/i18n/-/i18n-8.0.0-beta.10.tgz", - "integrity": "sha512-a7xcWKSJvABxF6O7W7MKscyT3OJxaKpBQZ84PGuTop9YrlBFkTV+bUQX3cayQqd0EYVLjgdE9R0uri5JMIVQWQ==", - "dev": true, + "node_modules/@intlify/devtools-if": { + "version": "9.3.0-beta.22", + "resolved": "https://registry.npmjs.org/@intlify/devtools-if/-/devtools-if-9.3.0-beta.22.tgz", + "integrity": "sha512-9HPcF1wFaH/D++SqUCNQMWBtg+2v2+BLRxuwzgR9d9UGv7iRLZFPtxt51S4epCQdyg3z6GruTRzTJhThUgzTAA==", "dependencies": { - "@intlify/bundle-utils": "^4.0.0", - "@intlify/shared": "9.3.0-beta.16", - "@intlify/unplugin-vue-i18n": "^0.8.1", - "@nuxt/kit": "^3.1.2", - "@vue/compiler-sfc": "^3.2.47", - "cookie-es": "^0.5.0", - "debug": "^4.3.4", - "estree-walker": "^3.0.1", - "is-https": "^4.0.0", - "js-cookie": "^3.0.1", - "knitwork": "^1.0.0", - "magic-string": "^0.27.0", - "mlly": "^1.1.0", - "pathe": "^1.1.0", - "pkg-types": "^1.0.1", - "ufo": "^1.0.1", - "unplugin": "^1.0.1", - "vue-i18n": "9.3.0-beta.16", - "vue-i18n-routing": "^0.12.2" + "@intlify/shared": "9.3.0-beta.22" }, "engines": { - "node": "^14.16.0 || ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" } }, - "node_modules/@nuxtjs/i18n/node_modules/@intlify/core-base": { - "version": "9.3.0-beta.16", - "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.3.0-beta.16.tgz", - "integrity": "sha512-BoAxVoPIJoPKCCMdsuNXKaaJxvetvHrW2KA43IpkwgPd2/w6zPebh/+v8e4zpXKjFVSgcF97zP87KeVcM/Lxwg==", - "dev": true, - "dependencies": { - "@intlify/devtools-if": "9.3.0-beta.16", - "@intlify/message-compiler": "9.3.0-beta.16", - "@intlify/shared": "9.3.0-beta.16", - "@intlify/vue-devtools": "9.3.0-beta.16" - }, + "node_modules/@intlify/devtools-if/node_modules/@intlify/shared": { + "version": "9.3.0-beta.22", + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.3.0-beta.22.tgz", + "integrity": "sha512-GS+OHgYcHaq7a+zC1dlVvEHUYHVPKPC/tV3OmFyKJ2Lm7qAFmX29MQn9WOG4WtUme86tPp5LRFz6mYL5VQUJqQ==", "engines": { - "node": ">= 14" + "node": ">= 16" }, "funding": { "url": "https://github.com/sponsors/kazupon" } }, - "node_modules/@nuxtjs/i18n/node_modules/@intlify/devtools-if": { - "version": "9.3.0-beta.16", - "resolved": "https://registry.npmjs.org/@intlify/devtools-if/-/devtools-if-9.3.0-beta.16.tgz", - "integrity": "sha512-9WXn8YMAnL/DHdoWqCy6yLTXcLFxd8eXB9UNsViQA5JJV7neR+yahr+23X1wP0prhG338MruxAu65khRf+AJCw==", + "node_modules/@intlify/message-compiler": { + "version": "9.3.0-beta.24", + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.3.0-beta.24.tgz", + "integrity": "sha512-prhHATkgp0mpPqoVgiAtLmUc1JMvs8fMH6w53AVEBn+VF87dLhzanfmWY5FoZWORG51ag54gBDBOoM/VFv3m3A==", "dev": true, "dependencies": { - "@intlify/shared": "9.3.0-beta.16" + "@intlify/shared": "9.3.0-beta.24", + "source-map-js": "^1.0.2" }, "engines": { - "node": ">= 14" + "node": ">= 16" }, "funding": { "url": "https://github.com/sponsors/kazupon" } }, - "node_modules/@nuxtjs/i18n/node_modules/@intlify/vue-devtools": { - "version": "9.3.0-beta.16", - "resolved": "https://registry.npmjs.org/@intlify/vue-devtools/-/vue-devtools-9.3.0-beta.16.tgz", - "integrity": "sha512-rQ/jSW0gBciYLBBi+XN65r80B59Ypege9oqUi+EZ2QpOaK54wDcy1xq9w6Zbj6WpY1qgf34KtYawKIF10mMr6w==", - "dev": true, - "dependencies": { - "@intlify/core-base": "9.3.0-beta.16", - "@intlify/shared": "9.3.0-beta.16" - }, + "node_modules/@intlify/shared": { + "version": "9.3.0-beta.24", + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.3.0-beta.24.tgz", + "integrity": "sha512-AKxJ8s7eKIQWkNaf4wyyoLRwf4puCuQgjSChlDJm5JBEt6T8HGgnYTJLRXu6LD/JACn3Qwu6hM/XRX1c9yvjmQ==", "engines": { - "node": ">= 14" + "node": ">= 16" }, "funding": { "url": "https://github.com/sponsors/kazupon" } }, - "node_modules/@nuxtjs/i18n/node_modules/@nuxt/kit": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-3.2.3.tgz", - "integrity": "sha512-wcsVlQLwGkh1cRhAFWHc3uYHdIxFTRNdRUzNyfqoX9DL0Fuga3K75q/PBY0xg1viA9R6F5BMPhc7KDLSWbXtWg==", + "node_modules/@intlify/unplugin-vue-i18n": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@intlify/unplugin-vue-i18n/-/unplugin-vue-i18n-0.12.2.tgz", + "integrity": "sha512-IIgzLRSPUKZM1FBdUAZ9NwVPiLUr4ea5g/HLWe2lB7gNtPDz4FOfUNUllIT504hT+3pDoJmjaYJ6pyqT7F4Wuw==", "dev": true, "dependencies": { - "@nuxt/schema": "3.2.3", - "c12": "^1.1.2", - "consola": "^2.15.3", - "defu": "^6.1.2", - "globby": "^13.1.3", - "hash-sum": "^2.0.0", - "ignore": "^5.2.4", - "jiti": "^1.17.1", - "knitwork": "^1.0.0", - "lodash.template": "^4.5.0", - "mlly": "^1.1.1", - "pathe": "^1.1.0", - "pkg-types": "^1.0.2", - "scule": "^1.0.0", - "semver": "^7.3.8", - "unctx": "^2.1.2", - "unimport": "^2.2.4", - "untyped": "^1.2.2" + "@intlify/bundle-utils": "^7.0.2", + "@intlify/shared": "9.3.0-beta.24", + "@rollup/pluginutils": "^5.0.2", + "@vue/compiler-sfc": "^3.2.47", + "debug": "^4.3.3", + "fast-glob": "^3.2.12", + "js-yaml": "^4.1.0", + "json5": "^2.2.3", + "pathe": "^1.0.0", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2", + "unplugin": "^1.1.0" }, "engines": { - "node": "^14.18.0 || ^16.10.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + "node": ">= 14.16" + }, + "peerDependencies": { + "petite-vue-i18n": "*", + "vue-i18n": "*", + "vue-i18n-bridge": "*" + }, + "peerDependenciesMeta": { + "petite-vue-i18n": { + "optional": true + }, + "vue-i18n": { + "optional": true + }, + "vue-i18n-bridge": { + "optional": true + } } }, - "node_modules/@nuxtjs/i18n/node_modules/@nuxt/schema": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@nuxt/schema/-/schema-3.2.3.tgz", - "integrity": "sha512-AXzRnBivCwn5RpNFWjUkvOPGPSHl5BM+6GfOpSNglPXi0tiQJ+rawSl7no7BkxGDmQ44Bx9AXwvHTrgjpcuo4g==", - "dev": true, - "dependencies": { - "c12": "^1.1.2", - "create-require": "^1.1.1", - "defu": "^6.1.2", - "hookable": "^5.4.2", - "jiti": "^1.17.1", - "pathe": "^1.1.0", - "pkg-types": "^1.0.2", - "postcss-import-resolver": "^2.0.0", - "scule": "^1.0.0", - "std-env": "^3.3.2", - "ufo": "^1.1.1", - "unimport": "^2.2.4", - "untyped": "^1.2.2" - }, - "engines": { - "node": "^14.18.0 || ^16.10.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/@nuxtjs/i18n/node_modules/@rollup/pluginutils": { + "node_modules/@intlify/unplugin-vue-i18n/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==", @@ -1318,146 +1209,203 @@ } } }, - "node_modules/@nuxtjs/i18n/node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "node_modules/@intlify/unplugin-vue-i18n/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 }, - "node_modules/@nuxtjs/i18n/node_modules/@vue/compiler-core": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.47.tgz", - "integrity": "sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==", - "dev": true, + "node_modules/@intlify/vue-devtools": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@intlify/vue-devtools/-/vue-devtools-9.2.2.tgz", + "integrity": "sha512-+dUyqyCHWHb/UcvY1MlIpO87munedm3Gn6E9WWYdWrMuYLcoIoOEVDWSS8xSwtlPU+kA+MEQTP6Q1iI/ocusJg==", "dependencies": { - "@babel/parser": "^7.16.4", - "@vue/shared": "3.2.47", - "estree-walker": "^2.0.2", - "source-map": "^0.6.1" + "@intlify/core-base": "9.2.2", + "@intlify/shared": "9.2.2" + }, + "engines": { + "node": ">= 14" } }, - "node_modules/@nuxtjs/i18n/node_modules/@vue/compiler-core/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 + "node_modules/@intlify/vue-devtools/node_modules/@intlify/core-base": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.2.2.tgz", + "integrity": "sha512-JjUpQtNfn+joMbrXvpR4hTF8iJQ2sEFzzK3KIESOx+f+uwIjgw20igOyaIdhfsVVBCds8ZM64MoeNSx+PHQMkA==", + "dependencies": { + "@intlify/devtools-if": "9.2.2", + "@intlify/message-compiler": "9.2.2", + "@intlify/shared": "9.2.2", + "@intlify/vue-devtools": "9.2.2" + }, + "engines": { + "node": ">= 14" + } }, - "node_modules/@nuxtjs/i18n/node_modules/@vue/compiler-dom": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz", - "integrity": "sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==", - "dev": true, + "node_modules/@intlify/vue-devtools/node_modules/@intlify/devtools-if": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@intlify/devtools-if/-/devtools-if-9.2.2.tgz", + "integrity": "sha512-4ttr/FNO29w+kBbU7HZ/U0Lzuh2cRDhP8UlWOtV9ERcjHzuyXVZmjyleESK6eVP60tGC9QtQW9yZE+JeRhDHkg==", "dependencies": { - "@vue/compiler-core": "3.2.47", - "@vue/shared": "3.2.47" + "@intlify/shared": "9.2.2" + }, + "engines": { + "node": ">= 14" } }, - "node_modules/@nuxtjs/i18n/node_modules/@vue/compiler-sfc": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz", - "integrity": "sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==", - "dev": true, + "node_modules/@intlify/vue-devtools/node_modules/@intlify/message-compiler": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.2.2.tgz", + "integrity": "sha512-IUrQW7byAKN2fMBe8z6sK6riG1pue95e5jfokn8hA5Q3Bqy4MBJ5lJAofUsawQJYHeoPJ7svMDyBaVJ4d0GTtA==", "dependencies": { - "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.47", - "@vue/compiler-dom": "3.2.47", - "@vue/compiler-ssr": "3.2.47", - "@vue/reactivity-transform": "3.2.47", - "@vue/shared": "3.2.47", - "estree-walker": "^2.0.2", - "magic-string": "^0.25.7", - "postcss": "^8.1.10", - "source-map": "^0.6.1" + "@intlify/shared": "9.2.2", + "source-map": "0.6.1" + }, + "engines": { + "node": ">= 14" } }, - "node_modules/@nuxtjs/i18n/node_modules/@vue/compiler-sfc/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 + "node_modules/@intlify/vue-devtools/node_modules/@intlify/shared": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.2.2.tgz", + "integrity": "sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==", + "engines": { + "node": ">= 14" + } }, - "node_modules/@nuxtjs/i18n/node_modules/@vue/compiler-sfc/node_modules/magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "dev": true, + "node_modules/@ioredis/commands": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", + "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==" + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", + "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", "dependencies": { - "sourcemap-codec": "^1.4.8" + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@nuxtjs/i18n/node_modules/@vue/compiler-ssr": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz", - "integrity": "sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==", - "dev": true, + "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==", "dependencies": { - "@vue/compiler-dom": "3.2.47", - "@vue/shared": "3.2.47" + "@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/@nuxtjs/i18n/node_modules/@vue/reactivity-transform": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz", - "integrity": "sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==", - "dev": true, + "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==", + "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==", + "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==", "dependencies": { - "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.47", - "@vue/shared": "3.2.47", - "estree-walker": "^2.0.2", - "magic-string": "^0.25.7" + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" } }, - "node_modules/@nuxtjs/i18n/node_modules/@vue/reactivity-transform/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 + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, - "node_modules/@nuxtjs/i18n/node_modules/@vue/reactivity-transform/node_modules/magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "dev": true, + "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==", "dependencies": { - "sourcemap-codec": "^1.4.8" + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" } }, - "node_modules/@nuxtjs/i18n/node_modules/@vue/shared": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.47.tgz", - "integrity": "sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==", - "dev": true + "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==" }, - "node_modules/@nuxtjs/i18n/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" + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" } }, - "node_modules/@nuxtjs/i18n/node_modules/magic-string": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", - "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", - "dev": true, + "node_modules/@mapbox/node-pre-gyp/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" + "yallist": "^4.0.0" }, "engines": { - "node": ">=12" + "node": ">=10" } }, - "node_modules/@nuxtjs/i18n/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, + "node_modules/@mapbox/node-pre-gyp/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/@mapbox/node-pre-gyp/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -1468,2816 +1416,2489 @@ "node": ">=10" } }, - "node_modules/@nuxtjs/i18n/node_modules/unimport": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/unimport/-/unimport-2.2.4.tgz", - "integrity": "sha512-qMgmeEGqqrrmEtm0dqxMG37J6xBtrriqxq9hILvDb+e6l2F0yTnJomLoCCp0eghLR7bYGeBsUU5Y0oyiUYhViw==", + "node_modules/@mapbox/node-pre-gyp/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/@mdi/font": { + "version": "7.2.96", + "resolved": "https://registry.npmjs.org/@mdi/font/-/font-7.2.96.tgz", + "integrity": "sha512-e//lmkmpFUMZKhmCY9zdjRe4zNXfbOIJnn6xveHbaV2kSw5aJ5dLXUxcRt1Gxfi7ZYpFLUWlkG2MGSFAiqAu7w==", + "dev": true + }, + "node_modules/@mizchi/sucrase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@mizchi/sucrase/-/sucrase-4.1.0.tgz", + "integrity": "sha512-AaN8HSGdXmNqEqIb0IQPIQL+MI/8Xr1QTOcVnA6k0u2afqfYhlre05hSxRybOFpq34oF8EqMTrYovYZxEV1FLw==", "dev": true, "dependencies": { - "@rollup/pluginutils": "^5.0.2", - "escape-string-regexp": "^5.0.0", - "fast-glob": "^3.2.12", - "local-pkg": "^0.4.3", - "magic-string": "^0.27.0", - "mlly": "^1.1.0", - "pathe": "^1.1.0", - "pkg-types": "^1.0.1", - "scule": "^1.0.0", - "strip-literal": "^1.0.0", - "unplugin": "^1.0.1" + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=14" } }, - "node_modules/@nuxtjs/i18n/node_modules/vue-i18n": { - "version": "9.3.0-beta.16", - "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.3.0-beta.16.tgz", - "integrity": "sha512-huhBeRB0SEvv2gIgCS7Zo06nb8AAhbPQCoB/vwDfbDNs8F+giv9QCmhEed+TkLTih/54JGnXkxN6tw1VZqVY/w==", + "node_modules/@netlify/functions": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@netlify/functions/-/functions-1.6.0.tgz", + "integrity": "sha512-6G92AlcpFrQG72XU8YH8pg94eDnq7+Q0YJhb8x4qNpdGsvuzvrfHWBmqFGp/Yshmv4wex9lpsTRZOocdrA2erQ==", + "dependencies": { + "is-promise": "^4.0.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { + "version": "5.1.1-v1", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", + "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", "dev": true, "dependencies": { - "@intlify/core-base": "9.3.0-beta.16", - "@intlify/shared": "9.3.0-beta.16", - "@intlify/vue-devtools": "9.3.0-beta.16", - "@vue/devtools-api": "^6.2.1" + "eslint-scope": "5.1.1" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, "engines": { - "node": ">= 14" + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, - "funding": { - "url": "https://github.com/sponsors/kazupon" + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nuxt/devalue": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@nuxt/devalue/-/devalue-2.0.2.tgz", + "integrity": "sha512-GBzP8zOc7CGWyFQS6dv1lQz8VVpz5C2yRszbXufwG/9zhStTIH50EtD87NmWbTMwXDvZLNg8GIpb1UFdH93JCA==" + }, + "node_modules/@nuxt/devtools-kit": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@nuxt/devtools-kit/-/devtools-kit-0.7.4.tgz", + "integrity": "sha512-+CKSSqalyW3elK364FamcHtXm6F03Iarfs9ftBiWmj3CdCTuv9aGpJFi0FKzXKzq/xlCtbWvIrqcaf2Iy//6NQ==", + "dev": true, + "dependencies": { + "@nuxt/kit": "^3.6.5", + "@nuxt/schema": "^3.6.5", + "execa": "^7.2.0" }, "peerDependencies": { - "vue": "^3.0.0" + "nuxt": "^3.6.5", + "vite": "*" } }, - "node_modules/@nuxtjs/i18n/node_modules/vue-i18n-routing": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/vue-i18n-routing/-/vue-i18n-routing-0.12.2.tgz", - "integrity": "sha512-VzYUzbUJyPHUP74t973dN42/sJnZUzBwdcYX+TJgr9YHD08+9uouw5Ume2jHO2Pi8Nymu4cz/UiHWDPeMyc/bQ==", + "node_modules/@nuxt/devtools-kit/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, "dependencies": { - "@intlify/shared": "next", - "@intlify/vue-i18n-bridge": "^0.8.0", - "@intlify/vue-router-bridge": "^0.8.0", - "ufo": "^1.0.0", - "vue-demi": "^0.13.11" + "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.6" + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" }, "funding": { - "url": "https://github.com/sponsors/kazupon" - }, - "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^2.6.14 || ^2.7.0 || ^3.2.0", - "vue-i18n": "^8.26.1 || ^9.2.0 || ^9.3.0-beta.10", - "vue-i18n-bridge": "^9.2.0 || ^9.3.0-beta.10", - "vue-router": "^3.5.3 || ^3.6.0 || ^4.0.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - }, - "vue": { - "optional": true - }, - "vue-i18n": { - "optional": true - }, - "vue-i18n-bridge": { - "optional": true - }, - "vue-router": { - "optional": true - } + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/@nuxtjs/i18n/node_modules/vue-i18n-routing/node_modules/@intlify/vue-i18n-bridge": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@intlify/vue-i18n-bridge/-/vue-i18n-bridge-0.8.0.tgz", - "integrity": "sha512-wQ18fSccm9QaWpUW2vq2QHvojgKIog7s+UMj9LeY3pUV3yD9bU4YZI+1PTNoX3tOA+BE71gQyqVGox/TVQKP6Q==", + "node_modules/@nuxt/devtools-kit/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, - "hasInstallScript": true, - "bin": { - "vue-i18n-fix": "bin/fix.js", - "vue-i18n-switch": "bin/switch.js" - }, "engines": { - "node": ">= 12" - }, - "funding": { - "url": "https://github.com/sponsors/kazupon" - }, - "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue-i18n": "^8.26.1 || ^9.2.0-beta.25 || ^9.3.0-beta.5", - "vue-i18n-bridge": "^9.2.0-beta.25 || ^9.3.0-beta.5" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - }, - "vue-i18n": { - "optional": true - }, - "vue-i18n-bridge": { - "optional": true - } + "node": ">=14.18.0" } }, - "node_modules/@nuxtjs/i18n/node_modules/vue-i18n-routing/node_modules/@intlify/vue-router-bridge": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@intlify/vue-router-bridge/-/vue-router-bridge-0.8.0.tgz", - "integrity": "sha512-CNxOgvyQcRhtGmRrksicL+HGjDijXtz+J/x04C/RslZ74CFdZkxjCe8MABkeD3xr+ry8G8tCm2nV2hLjZbynQw==", + "node_modules/@nuxt/devtools-kit/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, - "hasInstallScript": true, - "dependencies": { - "vue-demi": "^0.13.5" - }, - "bin": { - "vue-router-fix": "bin/fix.js", - "vue-router-switch": "bin/switch.js" - }, "engines": { - "node": ">= 12" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/kazupon" - }, - "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue-router": "^4.0.0-0 || ^3.0.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - }, - "vue-router": { - "optional": true - } + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@nuxtjs/i18n/node_modules/vue-i18n-routing/node_modules/vue-demi": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz", - "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==", + "node_modules/@nuxt/devtools-kit/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, - "hasInstallScript": true, - "bin": { - "vue-demi-fix": "bin/vue-demi-fix.js", - "vue-demi-switch": "bin/vue-demi-switch.js" - }, "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^3.0.0-0 || ^2.6.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - } + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@pkgr/utils": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.3.1.tgz", - "integrity": "sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw==", + "node_modules/@nuxt/devtools-kit/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, "dependencies": { - "cross-spawn": "^7.0.3", - "is-glob": "^4.0.3", - "open": "^8.4.0", - "picocolors": "^1.0.0", - "tiny-glob": "^0.2.9", - "tslib": "^2.4.0" + "path-key": "^4.0.0" }, "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://opencollective.com/unts" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@rollup/plugin-alias": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-alias/-/plugin-alias-4.0.2.tgz", - "integrity": "sha512-1hv7dBOZZwo3SEupxn4UA2N0EDThqSSS+wI1St1TNTBtOZvUchyIClyHcnDcjjrReTPZ47Faedrhblv4n+T5UQ==", + "node_modules/@nuxt/devtools-kit/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, "dependencies": { - "slash": "^4.0.0" + "mimic-fn": "^4.0.0" }, "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0" + "node": ">=12" }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@rollup/plugin-commonjs": { - "version": "23.0.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-23.0.2.tgz", - "integrity": "sha512-e9ThuiRf93YlVxc4qNIurvv+Hp9dnD+4PjOqQs5vAYfcZ3+AXSrcdzXnVjWxcGQOa6KGJFcRZyUI3ktWLavFjg==", - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "commondir": "^1.0.1", - "estree-walker": "^2.0.2", - "glob": "^8.0.3", - "is-reference": "1.2.1", - "magic-string": "^0.26.4" - }, + "node_modules/@nuxt/devtools-kit/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, "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.68.0||^3.0.0" + "node": ">=12" }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@rollup/plugin-commonjs/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==", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" - }, + "node_modules/@nuxt/devtools-kit/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": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0" + "node": ">=12" }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@rollup/plugin-commonjs/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==" - }, - "node_modules/@rollup/plugin-inject": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-5.0.2.tgz", - "integrity": "sha512-zRthPC/sZ2OaQwPh2LvFn0A+3SyMAZR1Vqsp89mWkIuGXKswT8ty1JWj1pf7xdZvft4gHZaCuhdopuiCwjclWg==", + "node_modules/@nuxt/kit": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-3.6.5.tgz", + "integrity": "sha512-uBI5I2Zx6sk+vRHU+nBmifwxg/nyXCGZ1g5hUKrUfgv1ZfiKB8JkN5T9iRoduDOaqbwM6XSnEl1ja73iloDcrw==", "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "estree-walker": "^2.0.2", - "magic-string": "^0.26.4" + "@nuxt/schema": "3.6.5", + "c12": "^1.4.2", + "consola": "^3.2.3", + "defu": "^6.1.2", + "globby": "^13.2.2", + "hash-sum": "^2.0.0", + "ignore": "^5.2.4", + "jiti": "^1.19.1", + "knitwork": "^1.0.0", + "mlly": "^1.4.0", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "scule": "^1.0.0", + "semver": "^7.5.3", + "unctx": "^2.3.1", + "unimport": "^3.0.14", + "untyped": "^1.3.2" }, "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } + "node": "^14.18.0 || >=16.10.0" } }, - "node_modules/@rollup/plugin-inject/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==", + "node_modules/@nuxt/kit/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" + "yallist": "^4.0.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=10" + } + }, + "node_modules/@nuxt/kit/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0" + "bin": { + "semver": "bin/semver.js" }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } + "engines": { + "node": ">=10" } }, - "node_modules/@rollup/plugin-inject/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==" + "node_modules/@nuxt/kit/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, - "node_modules/@rollup/plugin-json": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-5.0.1.tgz", - "integrity": "sha512-QCwhZZLvM8nRcTHyR1vOgyTMiAnjiNj1ebD/BMRvbO1oc/z14lZH6PfxXeegee2B6mky/u9fia4fxRM4TqrUaw==", + "node_modules/@nuxt/schema": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/@nuxt/schema/-/schema-3.6.5.tgz", + "integrity": "sha512-UPUnMB0W5TZ/Pi1fiF71EqIsPlj8LGZqzhSf8wOeh538KHwxbA9r7cuvEUU92eXRksOZaylbea3fJxZWhOITVw==", "dependencies": { - "@rollup/pluginutils": "^5.0.1" + "defu": "^6.1.2", + "hookable": "^5.5.3", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "postcss-import-resolver": "^2.0.0", + "std-env": "^3.3.3", + "ufo": "^1.1.2", + "unimport": "^3.0.14", + "untyped": "^1.3.2" }, "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } + "node": "^14.18.0 || >=16.10.0" } }, - "node_modules/@rollup/plugin-json/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==", + "node_modules/@nuxt/telemetry": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@nuxt/telemetry/-/telemetry-2.3.2.tgz", + "integrity": "sha512-S2sF4hLQWS48lWPpRT8xqVUFuwFGTgeKvojp8vL/iP79fWxudua2DWXR15T8C2zpauYwNgEpEWJmy6vxY2ZQeg==", "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" + "@nuxt/kit": "^3.6.5", + "chalk": "^5.3.0", + "ci-info": "^3.8.0", + "consola": "^3.2.3", + "create-require": "^1.1.1", + "defu": "^6.1.2", + "destr": "^2.0.0", + "dotenv": "^16.3.1", + "fs-extra": "^11.1.1", + "git-url-parse": "^13.1.0", + "is-docker": "^3.0.0", + "jiti": "^1.19.1", + "mri": "^1.2.0", + "nanoid": "^4.0.2", + "node-fetch": "^3.3.1", + "ofetch": "^1.1.1", + "parse-git-config": "^3.0.0", + "rc9": "^2.1.1", + "std-env": "^3.3.3" }, + "bin": { + "nuxt-telemetry": "bin/nuxt-telemetry.mjs" + } + }, + "node_modules/@nuxt/telemetry/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@rollup/plugin-json/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==" + "node_modules/@nuxt/ui-templates": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@nuxt/ui-templates/-/ui-templates-1.2.0.tgz", + "integrity": "sha512-MSZza7dxccNb/p7nuzGF8/m4POaFpHzVhNdR7f4xahOpH7Ja02lFeYR+rHtoHIJC0yym4qriqv0mQ+Qf/R61bQ==" }, - "node_modules/@rollup/plugin-node-resolve": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.0.1.tgz", - "integrity": "sha512-ReY88T7JhJjeRVbfCyNj+NXAG3IIsVMsX9b5/9jC98dRP8/yxlZdz7mHZbHk5zHr24wZZICS5AcXsFZAXYUQEg==", - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "@types/resolve": "1.20.2", - "deepmerge": "^4.2.2", - "is-builtin-module": "^3.2.0", - "is-module": "^1.0.0", - "resolve": "^1.22.1" + "node_modules/@nuxt/vite-builder": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/@nuxt/vite-builder/-/vite-builder-3.6.5.tgz", + "integrity": "sha512-pwSpt257ApCp3XWUs8vrC7X9QHeHUv5PbbIR3+5w0n5f95XPNOQWDJa2fTPX/H6oaRJCPYAsBPqiQhQ7qW/NZQ==", + "dependencies": { + "@nuxt/kit": "3.6.5", + "@rollup/plugin-replace": "^5.0.2", + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^3.0.1", + "autoprefixer": "^10.4.14", + "clear": "^0.1.0", + "consola": "^3.2.3", + "cssnano": "^6.0.1", + "defu": "^6.1.2", + "esbuild": "^0.18.11", + "escape-string-regexp": "^5.0.0", + "estree-walker": "^3.0.3", + "externality": "^1.0.2", + "fs-extra": "^11.1.1", + "get-port-please": "^3.0.1", + "h3": "^1.7.1", + "knitwork": "^1.0.0", + "magic-string": "^0.30.1", + "mlly": "^1.4.0", + "ohash": "^1.1.2", + "pathe": "^1.1.1", + "perfect-debounce": "^1.0.0", + "pkg-types": "^1.0.3", + "postcss": "^8.4.24", + "postcss-import": "^15.1.0", + "postcss-url": "^10.1.3", + "rollup-plugin-visualizer": "^5.9.2", + "std-env": "^3.3.3", + "strip-literal": "^1.0.1", + "ufo": "^1.1.2", + "unplugin": "^1.3.2", + "vite": "~4.3.9", + "vite-node": "^0.33.0", + "vite-plugin-checker": "^0.6.1", + "vue-bundle-renderer": "^1.0.3" }, "engines": { - "node": ">=14.0.0" + "node": "^14.18.0 || >=16.10.0" }, "peerDependencies": { - "rollup": "^2.78.0||^3.0.0" + "vue": "^3.3.4" + } + }, + "node_modules/@nuxt/vite-builder/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==", + "engines": { + "node": ">=12" }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@rollup/plugin-node-resolve/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==", + "node_modules/@nuxt/vite-builder/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": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" + "@jridgewell/sourcemap-codec": "^1.4.15" }, "engines": { - "node": ">=14.0.0" + "node": ">=12" + } + }, + "node_modules/@nuxtjs/eslint-config": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@nuxtjs/eslint-config/-/eslint-config-12.0.0.tgz", + "integrity": "sha512-ewenelo75x0eYEUK+9EBXjc/OopQCvdkmYmlZuoHq5kub/vtiRpyZ/autppwokpHUq8tiVyl2ejMakoiHiDTrg==", + "dev": true, + "dependencies": { + "eslint-config-standard": "^17.0.0", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-n": "^15.5.1", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-unicorn": "^44.0.2", + "eslint-plugin-vue": "^9.7.0", + "local-pkg": "^0.4.2" }, "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0" + "eslint": "^8.23.0" + } + }, + "node_modules/@nuxtjs/eslint-config-typescript": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@nuxtjs/eslint-config-typescript/-/eslint-config-typescript-12.0.0.tgz", + "integrity": "sha512-HJR0ho5MYuOCFjkL+eMX/VXbUwy36J12DUMVy+dj3Qz1GYHwX92Saxap3urFzr8oPkzzFiuOknDivfCeRBWakg==", + "dev": true, + "dependencies": { + "@nuxtjs/eslint-config": "^12.0.0", + "@typescript-eslint/eslint-plugin": "^5.42.1", + "@typescript-eslint/parser": "^5.42.1", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-vue": "^9.7.0" }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } + "peerDependencies": { + "eslint": "^8.23.0" } }, - "node_modules/@rollup/plugin-node-resolve/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==" + "node_modules/@nuxtjs/i18n": { + "version": "8.0.0-beta.13", + "resolved": "https://registry.npmjs.org/@nuxtjs/i18n/-/i18n-8.0.0-beta.13.tgz", + "integrity": "sha512-h0OqoSSdD9MGCXYZIDpYgQNN90r7MQ/sKVtyBQnrpGQLh1pqI7uLXoAVz4l4r09JzE2nNXK5U0thcx7Tq7ONUg==", + "dev": true, + "dependencies": { + "@intlify/bundle-utils": "^7.0.1", + "@intlify/shared": "9.3.0-beta.22", + "@intlify/unplugin-vue-i18n": "^0.12.1", + "@mizchi/sucrase": "^4.1.0", + "@nuxt/kit": "^3.4.1", + "@vue/compiler-sfc": "^3.3.4", + "cookie-es": "^0.5.0", + "debug": "^4.3.4", + "defu": "^6.1.2", + "estree-walker": "^3.0.3", + "is-https": "^4.0.0", + "js-cookie": "^3.0.5", + "knitwork": "^1.0.0", + "magic-string": "^0.27.0", + "mlly": "^1.4.0", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "ufo": "^1.1.2", + "unplugin": "^1.3.2", + "unstorage": "^1.5.0", + "vue-i18n": "9.3.0-beta.22", + "vue-i18n-routing": "^0.13.0" + }, + "engines": { + "node": "^14.16.0 || >=16.11.0" + } }, - "node_modules/@rollup/plugin-replace": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-5.0.1.tgz", - "integrity": "sha512-Z3MfsJ4CK17BfGrZgvrcp/l6WXoKb0kokULO+zt/7bmcyayokDaQ2K3eDJcRLCTAlp5FPI4/gz9MHAsosz4Rag==", + "node_modules/@nuxtjs/i18n/node_modules/@intlify/shared": { + "version": "9.3.0-beta.22", + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.3.0-beta.22.tgz", + "integrity": "sha512-GS+OHgYcHaq7a+zC1dlVvEHUYHVPKPC/tV3OmFyKJ2Lm7qAFmX29MQn9WOG4WtUme86tPp5LRFz6mYL5VQUJqQ==", + "dev": true, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@nuxtjs/i18n/node_modules/@intlify/vue-devtools": { + "version": "9.3.0-beta.22", + "resolved": "https://registry.npmjs.org/@intlify/vue-devtools/-/vue-devtools-9.3.0-beta.22.tgz", + "integrity": "sha512-Qd0kKXsWe1DagjdebFgpbSYe2eWi1rs6fROg8pTbCSqyvOMqsscxMu+Tl+MiXYrZxkfXisR0BefONO7Zpi8UbQ==", + "dev": true, "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "magic-string": "^0.26.4" + "@intlify/core-base": "9.3.0-beta.22", + "@intlify/shared": "9.3.0-beta.22" }, "engines": { - "node": ">=14.0.0" + "node": ">= 16" }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0" + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@nuxtjs/i18n/node_modules/vue-i18n": { + "version": "9.3.0-beta.22", + "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.3.0-beta.22.tgz", + "integrity": "sha512-i/MQ1x5kEXTMzmg5Cg9dnXDaTWv0S+O0ZTf8+qLWhFJDT4ERa5GLh5V+Ya748x1D+kwpStJxIW3kZGESJG7XCg==", + "dev": true, + "dependencies": { + "@intlify/core-base": "9.3.0-beta.22", + "@intlify/shared": "9.3.0-beta.22", + "@intlify/vue-devtools": "9.3.0-beta.22", + "@vue/devtools-api": "^6.5.0" }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + }, + "peerDependencies": { + "vue": "^3.0.0" } }, - "node_modules/@rollup/plugin-replace/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==", + "node_modules/@nuxtjs/i18n/node_modules/vue-i18n-routing": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/vue-i18n-routing/-/vue-i18n-routing-0.13.1.tgz", + "integrity": "sha512-F+VYikc86UqJSUziXtRvEJM7/ZIusN27hjtbvMKjweznBTVD4FWour+xe4d3zi0ETnajBsldu4FddZN7VlUOyg==", + "dev": true, "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" + "@intlify/shared": "next", + "@intlify/vue-i18n-bridge": "^0.8.0", + "@intlify/vue-router-bridge": "^0.8.0", + "ufo": "^1.0.0", + "vue-demi": "^0.13.11" }, "engines": { - "node": ">=14.0.0" + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" }, "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0" + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^2.6.14 || ^2.7.0 || ^3.2.0", + "vue-i18n": "^8.26.1 || ^9.2.0 || ^9.3.0-beta.10", + "vue-i18n-bridge": "^9.2.0 || ^9.3.0-beta.10", + "vue-router": "^3.5.3 || ^3.6.0 || ^4.0.0" }, "peerDependenciesMeta": { - "rollup": { + "@vue/composition-api": { + "optional": true + }, + "vue": { + "optional": true + }, + "vue-i18n": { + "optional": true + }, + "vue-i18n-bridge": { + "optional": true + }, + "vue-router": { "optional": true } } }, - "node_modules/@rollup/plugin-replace/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==" - }, - "node_modules/@rollup/plugin-wasm": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-wasm/-/plugin-wasm-6.0.1.tgz", - "integrity": "sha512-a5yRknFQG/QGhb1xGkazWXgjpsv0hhWlx34irsf5adMEo55NdpzhZLg+jx49u+bzH6ekktuFg2WKA1RAF+WEDQ==", + "node_modules/@nuxtjs/i18n/node_modules/vue-i18n-routing/node_modules/@intlify/vue-i18n-bridge": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@intlify/vue-i18n-bridge/-/vue-i18n-bridge-0.8.0.tgz", + "integrity": "sha512-wQ18fSccm9QaWpUW2vq2QHvojgKIog7s+UMj9LeY3pUV3yD9bU4YZI+1PTNoX3tOA+BE71gQyqVGox/TVQKP6Q==", + "dev": true, + "hasInstallScript": true, + "bin": { + "vue-i18n-fix": "bin/fix.js", + "vue-i18n-switch": "bin/switch.js" + }, "engines": { - "node": ">=14.0.0" + "node": ">= 12" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" }, "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0" + "@vue/composition-api": "^1.0.0-rc.1", + "vue-i18n": "^8.26.1 || ^9.2.0-beta.25 || ^9.3.0-beta.5", + "vue-i18n-bridge": "^9.2.0-beta.25 || ^9.3.0-beta.5" }, "peerDependenciesMeta": { - "rollup": { + "@vue/composition-api": { + "optional": true + }, + "vue-i18n": { + "optional": true + }, + "vue-i18n-bridge": { "optional": true } } }, - "node_modules/@rollup/pluginutils": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", - "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", + "node_modules/@nuxtjs/i18n/node_modules/vue-i18n-routing/node_modules/@intlify/vue-router-bridge": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@intlify/vue-router-bridge/-/vue-router-bridge-0.8.0.tgz", + "integrity": "sha512-CNxOgvyQcRhtGmRrksicL+HGjDijXtz+J/x04C/RslZ74CFdZkxjCe8MABkeD3xr+ry8G8tCm2nV2hLjZbynQw==", "dev": true, + "hasInstallScript": true, "dependencies": { - "estree-walker": "^2.0.1", - "picomatch": "^2.2.2" + "vue-demi": "^0.13.5" + }, + "bin": { + "vue-router-fix": "bin/fix.js", + "vue-router-switch": "bin/switch.js" }, "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/@rollup/pluginutils/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 - }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@types/chai": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==" - }, - "node_modules/@types/chai-subset": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", - "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", - "dependencies": { - "@types/chai": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", - "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==" - }, - "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==" - }, - "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "node_modules/@types/node": { - "version": "18.11.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", - "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==" - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true - }, - "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==", - "dev": true - }, - "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==" - }, - "node_modules/@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", - "dev": true - }, - "node_modules/@types/web-bluetooth": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", - "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.46.1.tgz", - "integrity": "sha512-YpzNv3aayRBwjs4J3oz65eVLXc9xx0PDbIRisHj+dYhvBn02MjYOD96P8YGiWEIFBrojaUjxvkaUpakD82phsA==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.46.1", - "@typescript-eslint/type-utils": "5.46.1", - "@typescript-eslint/utils": "5.46.1", - "debug": "^4.3.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "regexpp": "^3.2.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">= 12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://github.com/sponsors/kazupon" }, "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@vue/composition-api": "^1.0.0-rc.1", + "vue-router": "^4.0.0-0 || ^3.0.0" }, "peerDependenciesMeta": { - "typescript": { + "@vue/composition-api": { + "optional": true + }, + "vue-router": { "optional": true } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "node_modules/@nuxtjs/i18n/node_modules/vue-i18n-routing/node_modules/vue-demi": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz", + "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, + "hasInstallScript": true, "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.46.1.tgz", - "integrity": "sha512-RelQ5cGypPh4ySAtfIMBzBGyrNerQcmfA1oJvPj5f+H4jI59rl9xxpn4bonC0tQvUKOEN7eGBFWxFLK3Xepneg==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.46.1", - "@typescript-eslint/types": "5.46.1", - "@typescript-eslint/typescript-estree": "5.46.1", - "debug": "^4.3.4" + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://github.com/sponsors/antfu" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" }, "peerDependenciesMeta": { - "typescript": { + "@vue/composition-api": { "optional": true } } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.46.1.tgz", - "integrity": "sha512-iOChVivo4jpwUdrJZyXSMrEIM/PvsbbDOX1y3UCKjSgWn+W89skxWaYXACQfxmIGhPVpRWK/VWPYc+bad6smIA==", + "node_modules/@pkgr/utils": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", + "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.46.1", - "@typescript-eslint/visitor-keys": "5.46.1" + "cross-spawn": "^7.0.3", + "fast-glob": "^3.3.0", + "is-glob": "^4.0.3", + "open": "^9.1.0", + "picocolors": "^1.0.0", + "tslib": "^2.6.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://opencollective.com/unts" } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.46.1.tgz", - "integrity": "sha512-V/zMyfI+jDmL1ADxfDxjZ0EMbtiVqj8LUGPAGyBkXXStWmCUErMpW873zEHsyguWCuq2iN4BrlWUkmuVj84yng==", + "node_modules/@pkgr/utils/node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "5.46.1", - "@typescript-eslint/utils": "5.46.1", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@typescript-eslint/types": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.46.1.tgz", - "integrity": "sha512-Z5pvlCaZgU+93ryiYUwGwLl9AQVB/PQ1TsJ9NZ/gHzZjN7g9IAn6RSDkpCV8hqTwAiaj6fmCcKSQeBPlIpW28w==", + "node_modules/@pkgr/utils/node_modules/open": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", "dev": true, + "dependencies": { + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^2.2.0" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=14.16" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.46.1.tgz", - "integrity": "sha512-j9W4t67QiNp90kh5Nbr1w92wzt+toiIsaVPnEblB2Ih2U9fqBTyqV9T3pYWZBRt6QoMh/zVWP59EpuCjc4VRBg==", - "dev": true, + "node_modules/@rollup/plugin-alias": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-alias/-/plugin-alias-5.0.0.tgz", + "integrity": "sha512-l9hY5chSCjuFRPsnRm16twWBiSApl2uYFLsepQYwtBuAxNMQ/1dJqADld40P0Jkqm65GRTLy/AC6hnpVebtLsA==", "dependencies": { - "@typescript-eslint/types": "5.46.1", - "@typescript-eslint/visitor-keys": "5.46.1", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "slash": "^4.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=14.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0" }, "peerDependenciesMeta": { - "typescript": { + "rollup": { "optional": true } } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, + "node_modules/@rollup/plugin-commonjs": { + "version": "25.0.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.3.tgz", + "integrity": "sha512-uBdtWr/H3BVcgm97MUdq2oJmqBR23ny1hOrWe2PKo9FTbjsGqg32jfasJUKYAI5ouqacjRnj65mBB/S79F+GQA==", "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" + "@rollup/pluginutils": "^5.0.1", + "commondir": "^1.0.1", + "estree-walker": "^2.0.2", + "glob": "^8.0.3", + "is-reference": "1.2.1", + "magic-string": "^0.27.0" }, "engines": { - "node": ">=10" + "node": ">=14.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "rollup": "^2.68.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, + "node_modules/@rollup/plugin-commonjs/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==", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" }, "engines": { - "node": ">=10" + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, - "node_modules/@typescript-eslint/typescript-estree/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/@rollup/plugin-commonjs/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==" }, - "node_modules/@typescript-eslint/utils": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.46.1.tgz", - "integrity": "sha512-RBdBAGv3oEpFojaCYT4Ghn4775pdjvwfDOfQ2P6qzNVgQOVrnSPe5/Pb88kv7xzYQjoio0eKHKB9GJ16ieSxvA==", - "dev": true, + "node_modules/@rollup/plugin-inject": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-5.0.3.tgz", + "integrity": "sha512-411QlbL+z2yXpRWFXSmw/teQRMkXcAAC8aYTemc15gwJRpvEVDQwoe+N/HTFD8RFG8+88Bme9DK2V9CVm7hJdA==", "dependencies": { - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.46.1", - "@typescript-eslint/types": "5.46.1", - "@typescript-eslint/typescript-estree": "5.46.1", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", - "semver": "^7.3.7" + "@rollup/pluginutils": "^5.0.1", + "estree-walker": "^2.0.2", + "magic-string": "^0.27.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=14.0.0" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "rollup": "^1.20.0||^2.0.0||^3.0.0" }, - "engines": { - "node": ">=10" + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.46.1.tgz", - "integrity": "sha512-jczZ9noovXwy59KjRTk1OftT78pwygdcmCuBf8yMoWt/8O8l+6x2LSEze0E4TeepXK4MezW3zGSyoDRZK7Y9cg==", - "dev": true, + "node_modules/@rollup/plugin-inject/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==", "dependencies": { - "@typescript-eslint/types": "5.46.1", - "eslint-visitor-keys": "^3.3.0" + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=14.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } + "node_modules/@rollup/plugin-inject/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==" }, - "node_modules/@unhead/dom": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@unhead/dom/-/dom-1.0.4.tgz", - "integrity": "sha512-Mzkevk50k5xQo6mIcNcKGKJ4R7tYyCg8ZN5NfmiUXIfvjaM4zWEZK8DhZNbQ8/548oO6Eq2Y73+53W8rLsSaoQ==", + "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==", "dependencies": { - "@unhead/schema": "1.0.4" + "@rollup/pluginutils": "^5.0.1" }, - "funding": { - "url": "https://github.com/sponsors/harlan-zw" - } - }, - "node_modules/@unhead/schema": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@unhead/schema/-/schema-1.0.4.tgz", - "integrity": "sha512-bCkwV+GkAQN5yByelaeASmLVgdXypMC1O3xChW8oAC7ySz/ZqV9nXPt1Gx6jrNX4wL7Vbv3eCQ8jtB3QFH92ag==", - "dependencies": { - "@zhead/schema": "^1.0.4", - "hookable": "^5.4.2" + "engines": { + "node": ">=14.0.0" }, - "funding": { - "url": "https://github.com/sponsors/harlan-zw" - } - }, - "node_modules/@unhead/ssr": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@unhead/ssr/-/ssr-1.0.4.tgz", - "integrity": "sha512-/uyJLBGM3OfemBHt9hWvQOMpbWaMjJCns2WmYcuiOE6EFNy68SjSzHbm0rYkarhZWYZqxy0Sq6zuzVsM0Gi15Q==", - "dependencies": { - "@unhead/schema": "1.0.4" + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0" }, - "funding": { - "url": "https://github.com/sponsors/harlan-zw" + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, - "node_modules/@unhead/vue": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@unhead/vue/-/vue-1.0.4.tgz", - "integrity": "sha512-dW4FY4SRNaoGcFXuk6dU2Fp7fFHluBZqdOxpekMKO3q4zn+sOcnqHdzDmSnXPgoqr4huumnG8zNjVsuyRQ0+Mg==", + "node_modules/@rollup/plugin-json/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==", "dependencies": { - "@unhead/schema": "1.0.4", - "hookable": "^5.4.2" + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" }, - "funding": { - "url": "https://github.com/sponsors/harlan-zw" + "engines": { + "node": ">=14.0.0" }, "peerDependencies": { - "vue": ">=2.7 || >=3" - } - }, - "node_modules/@vercel/nft": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-0.22.1.tgz", - "integrity": "sha512-lYYZIoxRurqDOSoVIdBicGnpUIpfyaS5qVjdPq+EfI285WqtZK3NK/dyCkiyBul+X2U2OEhRyeMdXPCHGJbohw==", - "dependencies": { - "@mapbox/node-pre-gyp": "^1.0.5", - "acorn": "^8.6.0", - "async-sema": "^3.1.1", - "bindings": "^1.4.0", - "estree-walker": "2.0.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.2", - "node-gyp-build": "^4.2.2", - "resolve-from": "^5.0.0", - "rollup-pluginutils": "^2.8.2" + "rollup": "^1.20.0||^2.0.0||^3.0.0" }, - "bin": { - "nft": "out/cli.js" + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, - "node_modules/@vercel/nft/node_modules/estree-walker": { + "node_modules/@rollup/plugin-json/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==" }, - "node_modules/@vercel/nft/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/@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==", "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" + "@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" }, "engines": { - "node": "*" + "node": ">=14.0.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@vercel/nft/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==", - "engines": { - "node": ">=8" + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, - "node_modules/@vitejs/plugin-vue": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-3.2.0.tgz", - "integrity": "sha512-E0tnaL4fr+qkdCNxJ+Xd0yM31UwMkQje76fsDVBBUCoGOUPexu2VDUYHL8P4CwV+zMvWw6nlRw19OnRKmYAJpw==", + "node_modules/@rollup/plugin-node-resolve/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==", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": ">=14.0.0" }, "peerDependencies": { - "vite": "^3.0.0", - "vue": "^3.2.25" + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, - "node_modules/@vitejs/plugin-vue-jsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-2.1.1.tgz", - "integrity": "sha512-JgDhxstQlwnHBvZ1BSnU5mbmyQ14/t5JhREc6YH5kWyu2QdAAOsLF6xgHoIWarj8tddaiwFrNzLbWJPudpXKYA==", + "node_modules/@rollup/plugin-node-resolve/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==" + }, + "node_modules/@rollup/plugin-replace": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-5.0.2.tgz", + "integrity": "sha512-M9YXNekv/C/iHHK+cvORzfRYfPbq0RDD8r0G+bMiTXjNGKulPnCT9O3Ss46WfhI6ZOCgApOP7xAdmCQJ+U2LAA==", "dependencies": { - "@babel/core": "^7.19.6", - "@babel/plugin-transform-typescript": "^7.20.0", - "@vue/babel-plugin-jsx": "^1.1.1" + "@rollup/pluginutils": "^5.0.1", + "magic-string": "^0.27.0" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": ">=14.0.0" }, "peerDependencies": { - "vite": "^3.0.0", - "vue": "^3.0.0" + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, - "node_modules/@vitest/coverage-c8": { - "version": "0.29.8", - "resolved": "https://registry.npmjs.org/@vitest/coverage-c8/-/coverage-c8-0.29.8.tgz", - "integrity": "sha512-y+sEMQMctWokjnSqm3FCQEYFkjLrYaznsxEZHxcx8z2aftpYg3A5tvI1S5himfdEFo7o+OeHzh40bPSWZHW4oQ==", + "node_modules/@rollup/plugin-replace/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==", "dependencies": { - "c8": "^7.13.0", - "picocolors": "^1.0.0", - "std-env": "^3.3.1" + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" }, - "funding": { - "url": "https://github.com/sponsors/antfu" + "engines": { + "node": ">=14.0.0" }, "peerDependencies": { - "vitest": ">=0.29.0 <1" - } - }, - "node_modules/@vitest/expect": { - "version": "0.29.8", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.29.8.tgz", - "integrity": "sha512-xlcVXn5I5oTq6NiZSY3ykyWixBxr5mG8HYtjvpgg6KaqHm0mvhX18xuwl5YGxIRNt/A5jidd7CWcNHrSvgaQqQ==", - "dependencies": { - "@vitest/spy": "0.29.8", - "@vitest/utils": "0.29.8", - "chai": "^4.3.7" + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, - "node_modules/@vitest/runner": { - "version": "0.29.8", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.29.8.tgz", - "integrity": "sha512-FzdhnRDwEr/A3Oo1jtIk/B952BBvP32n1ObMEb23oEJNO+qO5cBet6M2XWIDQmA7BDKGKvmhUf2naXyp/2JEwQ==", - "dependencies": { - "@vitest/utils": "0.29.8", - "p-limit": "^4.0.0", - "pathe": "^1.1.0" - } + "node_modules/@rollup/plugin-replace/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==" }, - "node_modules/@vitest/runner/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==", + "node_modules/@rollup/plugin-terser": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.3.tgz", + "integrity": "sha512-EF0oejTMtkyhrkwCdg0HJ0IpkcaVg1MMSf2olHb2Jp+1mnLM04OhjpJWGma4HobiDTF0WCyViWuvadyE9ch2XA==", "dependencies": { - "yocto-queue": "^1.0.0" + "serialize-javascript": "^6.0.1", + "smob": "^1.0.0", + "terser": "^5.17.4" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=14.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "rollup": "^2.x || ^3.x" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, - "node_modules/@vitest/runner/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==", + "node_modules/@rollup/plugin-wasm": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-wasm/-/plugin-wasm-6.1.3.tgz", + "integrity": "sha512-7ItTTeyauE6lwdDtQWceEHZ9+txbi4RRy0mYPFn9BW7rD7YdgBDu7HTHsLtHrRzJc313RM/1m6GKgV3np/aEaw==", "engines": { - "node": ">=12.20" + "node": ">=14.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@vitest/spy": { - "version": "0.29.8", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.29.8.tgz", - "integrity": "sha512-VdjBe9w34vOMl5I5mYEzNX8inTxrZ+tYUVk9jxaZJmHFwmDFC/GV3KBFTA/JKswr3XHvZL+FE/yq5EVhb6pSAw==", - "dependencies": { - "tinyspy": "^1.0.2" - } - }, - "node_modules/@vitest/utils": { - "version": "0.29.8", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.29.8.tgz", - "integrity": "sha512-qGzuf3vrTbnoY+RjjVVIBYfuWMjn3UMUqyQtdGNZ6ZIIyte7B37exj6LaVkrZiUTvzSadVvO/tJm8AEgbGCBPg==", - "dependencies": { - "cli-truncate": "^3.1.0", - "diff": "^5.1.0", - "loupe": "^2.3.6", - "pretty-format": "^27.5.1" - } - }, - "node_modules/@volar/language-core": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.0.13.tgz", - "integrity": "sha512-aJhRiNjKFgLLB3nRJOfAeyle4StnEQgOKa0UpJU+k5EZd3QdiMfQmekXjxYeQj7NOZNQU7zCBEIvQ3gy15I7tA==", - "dev": true, - "dependencies": { - "@volar/source-map": "1.0.13", - "@vue/reactivity": "^3.2.45", - "muggle-string": "^0.1.0" - } - }, - "node_modules/@volar/source-map": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.0.13.tgz", - "integrity": "sha512-dU0plR9BS+bLs7u4chWay+VEIFTrLF15rG2634lGcu7o+z01bRO1U2cegZuIPy46SNkN3ONErLHwS09NBM+Ucg==", - "dev": true, - "dependencies": { - "muggle-string": "^0.1.0" - } - }, - "node_modules/@volar/typescript": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.0.13.tgz", - "integrity": "sha512-CfJ4higRZrLDAHVGY84gZ444ZUcA3ktPqVMW0fM3mgHDbzYViB3/tsvXOtZk76D3HK2ap6n4cDwBSv3cY4xqlg==", - "dev": true, - "dependencies": { - "@volar/language-core": "1.0.13" - } - }, - "node_modules/@volar/vue-language-core": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/@volar/vue-language-core/-/vue-language-core-1.0.13.tgz", - "integrity": "sha512-DRUg7yk4w2+5XFk8LS1dbXEM0na2uAddOj3KWHROPQmn78pfgXEH3r0NGDCnxElWJX5Y16iameisOjtOhevxog==", - "dev": true, - "dependencies": { - "@volar/language-core": "1.0.13", - "@volar/source-map": "1.0.13", - "@vue/compiler-dom": "^3.2.45", - "@vue/compiler-sfc": "^3.2.45", - "@vue/reactivity": "^3.2.45", - "@vue/shared": "^3.2.45", - "minimatch": "^5.1.0", - "vue-template-compiler": "^2.7.14" - } - }, - "node_modules/@volar/vue-language-core/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" + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, - "node_modules/@volar/vue-language-core/node_modules/minimatch": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.1.tgz", - "integrity": "sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g==", - "dev": true, + "node_modules/@rollup/pluginutils": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", + "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", "dependencies": { - "brace-expansion": "^2.0.1" + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" }, "engines": { - "node": ">=10" - } - }, - "node_modules/@volar/vue-typescript": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/@volar/vue-typescript/-/vue-typescript-1.0.13.tgz", - "integrity": "sha512-iEdkF5l6G10fv/G5hs7WcvtT48AT6y/Pm7pvafnB6SxPhm2uHQ+130x3zeWLMaUel5t6h5LBw2pFsF5Bh85QAQ==", - "dev": true, - "dependencies": { - "@volar/typescript": "1.0.13", - "@volar/vue-language-core": "1.0.13" - } - }, - "node_modules/@vue/babel-helper-vue-transform-on": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.0.2.tgz", - "integrity": "sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA==" - }, - "node_modules/@vue/babel-plugin-jsx": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.1.tgz", - "integrity": "sha512-j2uVfZjnB5+zkcbc/zsOc0fSNGCMMjaEXP52wdwdIfn0qjFfEYpYZBFKFg+HHnQeJCVrjOeO0YxgaL7DMrym9w==", - "dependencies": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.0.0", - "@babel/template": "^7.0.0", - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "@vue/babel-helper-vue-transform-on": "^1.0.2", - "camelcase": "^6.0.0", - "html-tags": "^3.1.0", - "svg-tags": "^1.0.0" - } - }, - "node_modules/@vue/compiler-core": { - "version": "3.2.45", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.45.tgz", - "integrity": "sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==", - "dependencies": { - "@babel/parser": "^7.16.4", - "@vue/shared": "3.2.45", - "estree-walker": "^2.0.2", - "source-map": "^0.6.1" + "node": ">= 8.0.0" } }, - "node_modules/@vue/compiler-core/node_modules/estree-walker": { + "node_modules/@rollup/pluginutils/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==" }, - "node_modules/@vue/compiler-dom": { - "version": "3.2.45", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.45.tgz", - "integrity": "sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw==", - "dependencies": { - "@vue/compiler-core": "3.2.45", - "@vue/shared": "3.2.45" - } + "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==" }, - "node_modules/@vue/compiler-sfc": { - "version": "3.2.45", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.45.tgz", - "integrity": "sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q==", - "dependencies": { - "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.45", - "@vue/compiler-dom": "3.2.45", - "@vue/compiler-ssr": "3.2.45", - "@vue/reactivity-transform": "3.2.45", - "@vue/shared": "3.2.45", - "estree-walker": "^2.0.2", - "magic-string": "^0.25.7", - "postcss": "^8.1.10", - "source-map": "^0.6.1" + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "engines": { + "node": ">=10.13.0" } }, - "node_modules/@vue/compiler-sfc/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==" - }, - "node_modules/@vue/compiler-sfc/node_modules/magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "dependencies": { - "sourcemap-codec": "^1.4.8" - } + "node_modules/@types/chai": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", + "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==" }, - "node_modules/@vue/compiler-ssr": { - "version": "3.2.45", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.45.tgz", - "integrity": "sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ==", + "node_modules/@types/chai-subset": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", + "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", "dependencies": { - "@vue/compiler-dom": "3.2.45", - "@vue/shared": "3.2.45" + "@types/chai": "*" } }, - "node_modules/@vue/devtools-api": { - "version": "6.4.5", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.4.5.tgz", - "integrity": "sha512-JD5fcdIuFxU4fQyXUu3w2KpAJHzTVdN+p4iOX2lMWSHMOoQdMAcpFLZzm9Z/2nmsoZ1a96QEhZ26e50xLBsgOQ==" + "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==" }, - "node_modules/@vue/reactivity": { - "version": "3.2.45", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.45.tgz", - "integrity": "sha512-PRvhCcQcyEVohW0P8iQ7HDcIOXRjZfAsOds3N99X/Dzewy8TVhTCT4uXpAHfoKjVTJRA0O0K+6QNkDIZAxNi3A==", + "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==", "dependencies": { - "@vue/shared": "3.2.45" + "@types/node": "*" } }, - "node_modules/@vue/reactivity-transform": { - "version": "3.2.45", - "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.45.tgz", - "integrity": "sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==", - "dependencies": { - "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.45", - "@vue/shared": "3.2.45", - "estree-walker": "^2.0.2", - "magic-string": "^0.25.7" - } + "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==" }, - "node_modules/@vue/reactivity-transform/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==" + "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==", + "dev": true }, - "node_modules/@vue/reactivity-transform/node_modules/magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "dependencies": { - "sourcemap-codec": "^1.4.8" - } + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true }, - "node_modules/@vue/runtime-core": { - "version": "3.2.45", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.45.tgz", - "integrity": "sha512-gzJiTA3f74cgARptqzYswmoQx0fIA+gGYBfokYVhF8YSXjWTUA2SngRzZRku2HbGbjzB6LBYSbKGIaK8IW+s0A==", - "dependencies": { - "@vue/reactivity": "3.2.45", - "@vue/shared": "3.2.45" - } + "node_modules/@types/node": { + "version": "20.4.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.4.tgz", + "integrity": "sha512-CukZhumInROvLq3+b5gLev+vgpsIqC2D0deQr/yS1WnxvmYLlJXZpaQrQiseMY+6xusl79E04UjWoqyr+t1/Ew==" }, - "node_modules/@vue/runtime-dom": { - "version": "3.2.45", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.45.tgz", - "integrity": "sha512-cy88YpfP5Ue2bDBbj75Cb4bIEZUMM/mAkDMfqDTpUYVgTf/kuQ2VQ8LebuZ8k6EudgH8pYhsGWHlY0lcxlvTwA==", - "dependencies": { - "@vue/runtime-core": "3.2.45", - "@vue/shared": "3.2.45", - "csstype": "^2.6.8" - } + "node_modules/@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true }, - "node_modules/@vue/server-renderer": { - "version": "3.2.45", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.45.tgz", - "integrity": "sha512-ebiMq7q24WBU1D6uhPK//2OTR1iRIyxjF5iVq/1a5I1SDMDyDu4Ts6fJaMnjrvD3MqnaiFkKQj+LKAgz5WIK3g==", - "dependencies": { - "@vue/compiler-ssr": "3.2.45", - "@vue/shared": "3.2.45" - }, - "peerDependencies": { - "vue": "3.2.45" - } + "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==", + "dev": true }, - "node_modules/@vue/shared": { - "version": "3.2.45", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.45.tgz", - "integrity": "sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==" + "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==" }, - "node_modules/@vuetify/loader-shared": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@vuetify/loader-shared/-/loader-shared-1.7.0.tgz", - "integrity": "sha512-Db4K67wMhduDsbvdRBYkrYuomti+j0E/1vlz1lnDng5F9LYYBcXa60qypIazVGI6GX/CuY1vshN6XGtGQI4FKg==", - "dependencies": { - "find-cache-dir": "^3.3.2", - "upath": "^2.0.1" - }, - "peerDependencies": { - "vue": "^3.0.0", - "vuetify": "^3.0.0-beta.4" - } + "node_modules/@types/semver": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "dev": true }, - "node_modules/@vueuse/core": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.6.0.tgz", - "integrity": "sha512-qGUcjKQXHgN+jqXEgpeZGoxdCbIDCdVPz3QiF1uyecVGbMuM63o96I1GjYx5zskKgRI0FKSNsVWM7rwrRMTf6A==", - "dependencies": { - "@types/web-bluetooth": "^0.0.16", - "@vueuse/metadata": "9.6.0", - "@vueuse/shared": "9.6.0", - "vue-demi": "*" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } + "node_modules/@types/web-bluetooth": { + "version": "0.0.17", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.17.tgz", + "integrity": "sha512-4p9vcSmxAayx72yn70joFoL44c9MO/0+iVEBIQXe3v2h2SiAsEIo/G5v6ObFWvNKRFjbrVadNf9LqEEZeQPzdA==" }, - "node_modules/@vueuse/core/node_modules/vue-demi": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz", - "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==", - "hasInstallScript": true, - "bin": { - "vue-demi-fix": "bin/vue-demi-fix.js", - "vue-demi-switch": "bin/vue-demi-switch.js" + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" }, "engines": { - "node": ">=12" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/antfu" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^3.0.0-0 || ^2.6.0" + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { - "@vue/composition-api": { + "typescript": { "optional": true } } }, - "node_modules/@vueuse/head": { - "version": "1.0.18", - "resolved": "https://registry.npmjs.org/@vueuse/head/-/head-1.0.18.tgz", - "integrity": "sha512-V3EuLoZFrMgvCQYSE0pJupYglZ0ID3rr/8ATIgnZNn+fjRrIEn8oAwAe8FRFAUKgBb0rZt+QY94PaDF6/HOLOQ==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, "dependencies": { - "@unhead/dom": "^1.0.4", - "@unhead/schema": "^1.0.4", - "@unhead/ssr": "^1.0.4", - "@unhead/vue": "^1.0.4" + "yallist": "^4.0.0" }, - "peerDependencies": { - "vue": ">=2.7 || >=3" - } - }, - "node_modules/@vueuse/metadata": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.6.0.tgz", - "integrity": "sha512-sIC8R+kWkIdpi5X2z2Gk8TRYzmczDwHRhEFfCu2P+XW2JdPoXrziqsGpDDsN7ykBx4ilwieS7JUIweVGhvZ93w==", - "funding": { - "url": "https://github.com/sponsors/antfu" + "engines": { + "node": ">=10" } }, - "node_modules/@vueuse/nuxt": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/@vueuse/nuxt/-/nuxt-9.6.0.tgz", - "integrity": "sha512-r+ngzHijvrfn89KnwlFCSe/xzFCiuskwmxbDdzFtpcZ57RHqLPdUS34YYrDxt7XasM0vlD3dmLIKEH//btf7sw==", + "node_modules/@typescript-eslint/eslint-plugin/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==", + "dev": true, "dependencies": { - "@nuxt/kit": "^3.0.0-rc.13", - "@vueuse/core": "9.6.0", - "@vueuse/metadata": "9.6.0", - "local-pkg": "^0.4.2", - "vue-demi": "*" + "lru-cache": "^6.0.0" }, - "funding": { - "url": "https://github.com/sponsors/antfu" + "bin": { + "semver": "bin/semver.js" }, - "peerDependencies": { - "nuxt": "^3.0.0-rc.9" + "engines": { + "node": ">=10" } }, - "node_modules/@vueuse/nuxt/node_modules/vue-demi": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz", - "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==", - "hasInstallScript": true, - "bin": { - "vue-demi-fix": "bin/vue-demi-fix.js", - "vue-demi-switch": "bin/vue-demi-switch.js" + "node_modules/@typescript-eslint/eslint-plugin/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" }, "engines": { - "node": ">=12" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/antfu" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^3.0.0-0 || ^2.6.0" + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { - "@vue/composition-api": { + "typescript": { "optional": true } } }, - "node_modules/@vueuse/shared": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.6.0.tgz", - "integrity": "sha512-/eDchxYYhkHnFyrb00t90UfjCx94kRHxc7J1GtBCqCG4HyPMX+krV9XJgVtWIsAMaxKVU4fC8NSUviG1JkwhUQ==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, "dependencies": { - "vue-demi": "*" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/antfu" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@vueuse/shared/node_modules/vue-demi": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz", - "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==", - "hasInstallScript": true, - "bin": { - "vue-demi-fix": "bin/vue-demi-fix.js", - "vue-demi-switch": "bin/vue-demi-switch.js" + "node_modules/@typescript-eslint/type-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" }, "engines": { - "node": ">=12" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/antfu" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^3.0.0-0 || ^2.6.0" + "eslint": "*" }, "peerDependenciesMeta": { - "@vue/composition-api": { + "typescript": { "optional": true } } }, - "node_modules/@zhead/schema": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@zhead/schema/-/schema-1.0.4.tgz", - "integrity": "sha512-v/CM22nH0TW9VU5IcRXlshwrMtsZPnFQWhcLBvpZjOJvfEmjl8cUb6OIJQJRR2WESNjjPW2Cji8mgL9XSVLjxA==", - "funding": { - "url": "https://github.com/sponsors/harlan-zw" - } - }, - "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==" - }, - "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==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "devOptional": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.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==", + "node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, "engines": { - "node": ">=0.4.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "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==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, "dependencies": { - "debug": "4" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" }, "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "devOptional": 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" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/ansi-escapes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.0.0.tgz", - "integrity": "sha512-IG23inYII3dWlU2EyiAiGj6Bwal5GzsgPMwjYGvc1HPE2dgbj4ZB5ToWBKSquKw74nB3TIuOwaI6/jSULzfgrw==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, "dependencies": { - "type-fest": "^3.0.0" + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" }, "engines": { - "node": ">=14.16" + "node": ">=10" }, "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==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "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==", + "node_modules/@typescript-eslint/typescript-estree/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==", + "dev": true, "dependencies": { - "color-convert": "^1.9.0" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=4" + "node": ">=10" } }, - "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==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, + "node_modules/@typescript-eslint/typescript-estree/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": ">=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==" + "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, - "node_modules/arch": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", - "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", - "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/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } }, - "node_modules/archiver": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz", - "integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==", + "node_modules/@typescript-eslint/utils/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, "dependencies": { - "archiver-utils": "^2.1.0", - "async": "^3.2.3", - "buffer-crc32": "^0.2.1", - "readable-stream": "^3.6.0", - "readdir-glob": "^1.0.0", - "tar-stream": "^2.2.0", - "zip-stream": "^4.1.0" + "yallist": "^4.0.0" }, "engines": { - "node": ">= 10" + "node": ">=10" } }, - "node_modules/archiver-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", - "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "node_modules/@typescript-eslint/utils/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==", + "dev": true, "dependencies": { - "glob": "^7.1.4", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^2.0.0" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">= 6" + "node": ">=10" } }, - "node_modules/archiver-utils/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/@typescript-eslint/utils/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "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" + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" }, "engines": { - "node": "*" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/archiver-utils/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "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/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/archiver-utils/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==" - }, - "node_modules/archiver-utils/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==", + "node_modules/@unhead/dom": { + "version": "1.1.32", + "resolved": "https://registry.npmjs.org/@unhead/dom/-/dom-1.1.32.tgz", + "integrity": "sha512-AMpHlKEKcm1dxSAvm6GPXhjoZHzXh7ZeR8DAnXVH7Sd9a48xaJhQjmxETweFAcNBSnAn9e7TxTPZVrUcW0ej2w==", "dependencies": { - "safe-buffer": "~5.1.0" + "@unhead/schema": "1.1.32", + "@unhead/shared": "1.1.32" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" } }, - "node_modules/are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "node_modules/@unhead/schema": { + "version": "1.1.32", + "resolved": "https://registry.npmjs.org/@unhead/schema/-/schema-1.1.32.tgz", + "integrity": "sha512-XxrNazZEO9T+r1ORduy6gnKA9rDzRgxr/p5UEPRM+TZVuM8ZEFzYr2/aE5bMgTCXp20z0pjv/2rewpVSXp4pFQ==", "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" + "hookable": "^5.5.3", + "zhead": "^2.0.9" }, - "engines": { - "node": ">=10" + "funding": { + "url": "https://github.com/sponsors/harlan-zw" } }, - "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==", - "devOptional": true + "node_modules/@unhead/shared": { + "version": "1.1.32", + "resolved": "https://registry.npmjs.org/@unhead/shared/-/shared-1.1.32.tgz", + "integrity": "sha512-oguyfbwbG4+wNphXQjQ3YrEe4NzabocpTQKNCKdTUPtpK9HYNiI+dffEoSiM3tWcwlG3iYrXj5WvREq3FoACWQ==", + "dependencies": { + "@unhead/schema": "1.1.32" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + } }, - "node_modules/array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", - "dev": true, + "node_modules/@unhead/ssr": { + "version": "1.1.32", + "resolved": "https://registry.npmjs.org/@unhead/ssr/-/ssr-1.1.32.tgz", + "integrity": "sha512-3DGh/EvHFuUx9k0M5CN5KmQHEaZMbrwtRlv2aQjicLqeeJGSI+okpRbaEu4A9WWwPmkR0u8FBnv1WCAPMcj3ZA==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "is-string": "^1.0.7" + "@unhead/schema": "1.1.32", + "@unhead/shared": "1.1.32" }, - "engines": { - "node": ">= 0.4" + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + } + }, + "node_modules/@unhead/vue": { + "version": "1.1.32", + "resolved": "https://registry.npmjs.org/@unhead/vue/-/vue-1.1.32.tgz", + "integrity": "sha512-rpQVxgI/crwlC+z8GnfPV6EwVN/kyeVSvEfzJO9VMIdrWMrh6vAV0WNv3v+BFd0bVLiRyNzhvbY76yhmAX4Zvw==", + "dependencies": { + "@unhead/schema": "1.1.32", + "@unhead/shared": "1.1.32", + "hookable": "^5.5.3", + "unhead": "1.1.32" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/harlan-zw" + }, + "peerDependencies": { + "vue": ">=2.7 || >=3" } }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, + "node_modules/@vercel/nft": { + "version": "0.22.6", + "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-0.22.6.tgz", + "integrity": "sha512-gTsFnnT4mGxodr4AUlW3/urY+8JKKB452LwF3m477RFUJTAaDmcz2JqFuInzvdybYIeyIv1sSONEJxsxnbQ5JQ==", + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.5", + "@rollup/pluginutils": "^4.0.0", + "acorn": "^8.6.0", + "async-sema": "^3.1.1", + "bindings": "^1.4.0", + "estree-walker": "2.0.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.2", + "node-gyp-build": "^4.2.2", + "resolve-from": "^5.0.0" + }, + "bin": { + "nft": "out/cli.js" + }, "engines": { - "node": ">=8" + "node": ">=14" } }, - "node_modules/array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", - "dev": true, + "node_modules/@vercel/nft/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==" + }, + "node_modules/@vercel/nft/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" + "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": ">= 0.4" + "node": "*" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "node_modules/@vercel/nft/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==", "engines": { - "node": "*" + "node": ">=8" } }, - "node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" - }, - "node_modules/async-sema": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/async-sema/-/async-sema-3.1.1.tgz", - "integrity": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "node_modules/@vitejs/plugin-vue": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.2.3.tgz", + "integrity": "sha512-R6JDUfiZbJA9cMiguQ7jxALsgiprjBeHL5ikpXfJCH62pPHtI+JdJ5xWj6Ev73yXSlYl86+blXn1kZHQ7uElxw==", + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.0.0", + "vue": "^3.2.25" + } }, - "node_modules/autoprefixer": { - "version": "10.4.13", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", - "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - } - ], + "node_modules/@vitejs/plugin-vue-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-3.0.1.tgz", + "integrity": "sha512-+Jb7ggL48FSPS1uhPnJbJwWa9Sr90vQ+d0InW+AhBM22n+cfuYqJZDckBc+W3QSHe1WDvewMZfa4wZOtk5pRgw==", "dependencies": { - "browserslist": "^4.21.4", - "caniuse-lite": "^1.0.30001426", - "fraction.js": "^4.2.0", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" + "@babel/core": "^7.20.7", + "@babel/plugin-transform-typescript": "^7.20.7", + "@vue/babel-plugin-jsx": "^1.1.1" }, "engines": { - "node": "^10 || ^12 || >=14" + "node": "^14.18.0 || >=16.0.0" }, "peerDependencies": { - "postcss": "^8.1.0" + "vite": "^4.0.0", + "vue": "^3.0.0" } }, - "node_modules/axios": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.1.3.tgz", - "integrity": "sha512-00tXVRwKx/FZr/IDVFt4C+f9FYairX517WoGCL6dpOntqLkZofjhu43F/Xl44UOpqa+9sLFDrG/XAnFsUYgkDA==", + "node_modules/@vitest/coverage-c8": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/coverage-c8/-/coverage-c8-0.33.0.tgz", + "integrity": "sha512-DaF1zJz4dcOZS4k/neiQJokmOWqsGXwhthfmUdPGorXIQHjdPvV6JQSYhQDI41MyI8c+IieQUdIDs5XAMHtDDw==", "dependencies": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" + "@ampproject/remapping": "^2.2.1", + "c8": "^7.14.0", + "magic-string": "^0.30.1", + "picocolors": "^1.0.0", + "std-env": "^3.3.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": ">=0.30.0 <1" } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "node_modules/@vitest/coverage-c8/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": ">=8" + "node": ">=12" } }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "node_modules/@vitest/expect": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.33.0.tgz", + "integrity": "sha512-sVNf+Gla3mhTCxNJx+wJLDPp/WcstOe0Ksqz4Vec51MmgMth/ia0MGFEkIZmVGeTL5HtjYR4Wl/ZxBxBXZJTzQ==", "dependencies": { - "file-uri-to-path": "1.0.0" + "@vitest/spy": "0.33.0", + "@vitest/utils": "0.33.0", + "chai": "^4.3.7" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/bl": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", - "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", + "node_modules/@vitest/runner": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.33.0.tgz", + "integrity": "sha512-UPfACnmCB6HKRHTlcgCoBh6ppl6fDn+J/xR8dTufWiKt/74Y9bHci5CKB8tESSV82zKYtkBJo9whU3mNvfaisg==", "dependencies": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" + "@vitest/utils": "0.33.0", + "p-limit": "^4.0.0", + "pathe": "^1.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "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==" - }, - "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/@vitest/runner/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==", "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==", - "dependencies": { - "fill-range": "^7.0.1" + "yocto-queue": "^1.0.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" - }, - "bin": { - "browserslist": "cli.js" - }, + "node_modules/@vitest/runner/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==", "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/@vitest/snapshot": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.33.0.tgz", + "integrity": "sha512-tJjrl//qAHbyHajpFvr8Wsk8DIOODEebTu7pgBrP07iOepR5jYkLFiqLq2Ltxv+r0uptUb4izv1J8XBOwKkVYA==", "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "pretty-format": "^29.5.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "node_modules/@vitest/snapshot/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": "*" + "node": ">=12" } }, - "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==" - }, - "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==", - "engines": { - "node": ">=6" + "node_modules/@vitest/spy": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.33.0.tgz", + "integrity": "sha512-Kv+yZ4hnH1WdiAkPUQTpRxW8kGtH8VRTnus7ZTGovFYM1ZezJpvGtb9nPIjPnptHbsyIAxYZsEpVPYgtpjGnrg==", + "dependencies": { + "tinyspy": "^2.1.1" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/vitest" } }, - "node_modules/builtins": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", - "dev": true, + "node_modules/@vitest/utils": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.33.0.tgz", + "integrity": "sha512-pF1w22ic965sv+EN6uoePkAOTkAPWM03Ri/jXNyMIKBb/XHLDPfhLvf/Fa9g0YECevAIz56oVYXhodLvLQ/awA==", "dependencies": { - "semver": "^7.0.0" + "diff-sequences": "^29.4.3", + "loupe": "^2.3.6", + "pretty-format": "^29.5.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/builtins/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, + "node_modules/@volar/language-core": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.9.1.tgz", + "integrity": "sha512-FlllCDE0HdUYh66zS1S4u8WobqKFStOwkd3OCXCOhPmalfm4Fte3gHNXzqs+R8VlbjK7ZvBxrG9MSiaRGXZygg==", + "devOptional": true, "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" + "@volar/source-map": "1.9.1" } }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "node_modules/@volar/source-map": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.9.1.tgz", + "integrity": "sha512-KIttDVrbr3ACLzEP891uj+XdVaCnNErFNRGjNQio+gW2a9fDdz407usAJu6DHgIkJU1l18HyOxMU2VX1l2+D5g==", + "devOptional": true, "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" + "muggle-string": "^0.3.1" } }, - "node_modules/c12": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/c12/-/c12-1.1.2.tgz", - "integrity": "sha512-fHT5HDEHNMb2oImnqJ88/UlpEOkY/chdyYxSd3YCpvBqBvU0IDlHTkNc7GnjObDMxdis2lL+rwlQcNq8VeZESA==", + "node_modules/@volar/typescript": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.9.1.tgz", + "integrity": "sha512-UO8bhflYMNuOpXeGYHSm3xItU4kEVhJQNGjwgw1ZqLr/sm1C7Y+pVQ/S01NpsojhFC8S+P6/p+jOTK6DO214kQ==", + "devOptional": true, "dependencies": { - "defu": "^6.1.2", - "dotenv": "^16.0.3", - "giget": "^1.1.0", - "jiti": "^1.17.1", - "mlly": "^1.1.1", - "pathe": "^1.1.0", - "pkg-types": "^1.0.2", - "rc9": "^2.0.1" + "@volar/language-core": "1.9.1" } }, - "node_modules/c8": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/c8/-/c8-7.13.0.tgz", - "integrity": "sha512-/NL4hQTv1gBL6J6ei80zu3IiTrmePDKXKXOTLpHvcIWZTVYQlDhVWjjWvkhICylE8EwwnMVzDZugCvdx0/DIIA==", + "node_modules/@vue-macros/common": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vue-macros/common/-/common-1.6.0.tgz", + "integrity": "sha512-sgDo9qN5DI0y7FJ+E0qOxhcsrBlVNp0erW5mfLzYtGYRFfuuIS5hEanNao7QZWVmK39kvmNOPbPOV1oiWBMrng==", "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@istanbuljs/schema": "^0.1.3", - "find-up": "^5.0.0", - "foreground-child": "^2.0.0", - "istanbul-lib-coverage": "^3.2.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-reports": "^3.1.4", - "rimraf": "^3.0.2", - "test-exclude": "^6.0.0", - "v8-to-istanbul": "^9.0.0", - "yargs": "^16.2.0", - "yargs-parser": "^20.2.9" - }, - "bin": { - "c8": "bin/c8.js" + "@babel/types": "^7.22.5", + "@rollup/pluginutils": "^5.0.2", + "@vue/compiler-sfc": "^3.3.4", + "ast-kit": "^0.9.4", + "local-pkg": "^0.4.3", + "magic-string-ast": "^0.2.0" }, "engines": { - "node": ">=10.12.0" + "node": ">=16.14.0" + }, + "peerDependencies": { + "vue": "^2.7.0 || ^3.2.25" + }, + "peerDependenciesMeta": { + "vue": { + "optional": true + } } }, - "node_modules/c8/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/@vue-macros/common/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==", "dependencies": { - "color-convert": "^2.0.1" + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" }, "engines": { - "node": ">=8" + "node": ">=14.0.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, - "node_modules/c8/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==", + "node_modules/@vue-macros/common/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==" + }, + "node_modules/@vue/babel-helper-vue-transform-on": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.1.5.tgz", + "integrity": "sha512-SgUymFpMoAyWeYWLAY+MkCK3QEROsiUnfaw5zxOVD/M64KQs8D/4oK6Q5omVA2hnvEOE0SCkH2TZxs/jnnUj7w==" + }, + "node_modules/@vue/babel-plugin-jsx": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.5.tgz", + "integrity": "sha512-nKs1/Bg9U1n3qSWnsHhCVQtAzI6aQXqua8j/bZrau8ywT1ilXQbK4FwEJGmU8fV7tcpuFvWmmN7TMmV1OBma1g==", + "dependencies": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5", + "@vue/babel-helper-vue-transform-on": "^1.1.5", + "camelcase": "^6.3.0", + "html-tags": "^3.3.1", + "svg-tags": "^1.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.4.tgz", + "integrity": "sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "@babel/parser": "^7.21.3", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "source-map-js": "^1.0.2" } }, - "node_modules/c8/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/@vue/compiler-core/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==" + }, + "node_modules/@vue/compiler-dom": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz", + "integrity": "sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==", "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "@vue/compiler-core": "3.3.4", + "@vue/shared": "3.3.4" } }, - "node_modules/c8/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/@vue/compiler-sfc": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz", + "integrity": "sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==", + "dependencies": { + "@babel/parser": "^7.20.15", + "@vue/compiler-core": "3.3.4", + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-ssr": "3.3.4", + "@vue/reactivity-transform": "3.3.4", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.0", + "postcss": "^8.1.10", + "source-map-js": "^1.0.2" + } }, - "node_modules/c8/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==" + "node_modules/@vue/compiler-sfc/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==" }, - "node_modules/c8/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==", + "node_modules/@vue/compiler-sfc/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": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "@jridgewell/sourcemap-codec": "^1.4.15" }, "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/c8/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==", + "node_modules/@vue/compiler-ssr": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz", + "integrity": "sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "@vue/compiler-dom": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz", + "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==" + }, + "node_modules/@vue/language-core": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-1.8.6.tgz", + "integrity": "sha512-PyYDMArbR7hnhqw9OEupr0s4ut0/ZfITp7WEjigF58cd2R0lRLNM1HPvzFMuULpy3ImBEOZI11KRIDirqOe+tQ==", + "devOptional": true, + "dependencies": { + "@volar/language-core": "~1.9.0", + "@volar/source-map": "~1.9.0", + "@vue/compiler-dom": "^3.3.0", + "@vue/reactivity": "^3.3.0", + "@vue/shared": "^3.3.0", + "minimatch": "^9.0.0", + "muggle-string": "^0.3.1", + "vue-template-compiler": "^2.7.14" }, - "engines": { - "node": ">=10" + "peerDependencies": { + "typescript": "*" }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/c8/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "node_modules/@vue/language-core/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": { - "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": ">=10" - } - }, - "node_modules/c8/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==", - "engines": { - "node": ">=10" - } - }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "engines": { - "node": ">=8" + "balanced-match": "^1.0.0" } }, - "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==", + "node_modules/@vue/language-core/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": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "brace-expansion": "^2.0.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "devOptional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "node_modules/@vue/reactivity": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.4.tgz", + "integrity": "sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==", "dependencies": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" + "@vue/shared": "3.3.4" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001434", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz", - "integrity": "sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] - }, - "node_modules/chai": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", - "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "node_modules/@vue/reactivity-transform": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz", + "integrity": "sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==", "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^4.1.2", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" - }, - "engines": { - "node": ">=4" + "@babel/parser": "^7.20.15", + "@vue/compiler-core": "3.3.4", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.0" } }, - "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==", + "node_modules/@vue/reactivity-transform/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==" + }, + "node_modules/@vue/reactivity-transform/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": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@jridgewell/sourcemap-codec": "^1.4.15" }, "engines": { - "node": ">=4" + "node": ">=12" } }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" - }, - "node_modules/check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", - "engines": { - "node": "*" + "node_modules/@vue/runtime-core": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.4.tgz", + "integrity": "sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==", + "dependencies": { + "@vue/reactivity": "3.3.4", + "@vue/shared": "3.3.4" } }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], + "node_modules/@vue/runtime-dom": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.4.tgz", + "integrity": "sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==", "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "@vue/runtime-core": "3.3.4", + "@vue/shared": "3.3.4", + "csstype": "^3.1.1" } }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/@vue/server-renderer": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.4.tgz", + "integrity": "sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==", "dependencies": { - "is-glob": "^4.0.1" + "@vue/compiler-ssr": "3.3.4", + "@vue/shared": "3.3.4" }, - "engines": { - "node": ">= 6" + "peerDependencies": { + "vue": "3.3.4" } }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "engines": { - "node": ">=10" - } + "node_modules/@vue/shared": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.4.tgz", + "integrity": "sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==" }, - "node_modules/ci-info": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.6.1.tgz", - "integrity": "sha512-up5ggbaDqOqJ4UqLKZ2naVkyqSJQgJi5lwD6b6mM748ysrghDBX0bx/qJTUHzw7zu6Mq4gycviSF5hJnwceD8w==", - "engines": { - "node": ">=8" + "node_modules/@vue/typescript": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@vue/typescript/-/typescript-1.8.6.tgz", + "integrity": "sha512-sDQ5tltrSVS3lAkE3JtMRGJo91CLIxcWPy7yms/DT+ssxXpwxbVRD5Gok68HenEZBA4Klq7nW99sG/nTRnpPuQ==", + "devOptional": true, + "dependencies": { + "@volar/typescript": "~1.9.0", + "@vue/language-core": "1.8.6" } }, - "node_modules/clean-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", - "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==", - "dev": true, + "node_modules/@vuetify/loader-shared": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@vuetify/loader-shared/-/loader-shared-1.7.1.tgz", + "integrity": "sha512-kLUvuAed6RCvkeeTNJzuy14pqnkur8lTuner7v7pNE/kVhPR97TuyXwBSBMR1cJeiLiOfu6SF5XlCYbXByEx1g==", "dependencies": { - "escape-string-regexp": "^1.0.5" + "find-cache-dir": "^3.3.2", + "upath": "^2.0.1" }, - "engines": { - "node": ">=4" + "peerDependencies": { + "vue": "^3.0.0", + "vuetify": "^3.0.0-beta.4" } }, - "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==", + "node_modules/@vueuse/core": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.2.1.tgz", + "integrity": "sha512-c441bfMbkAwTNwVRHQ0zdYZNETK//P84rC01aP2Uy/aRFCiie9NE/k9KdIXbno0eDYP5NPUuWv0aA/I4Unr/7w==", "dependencies": { - "restore-cursor": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "@types/web-bluetooth": "^0.0.17", + "@vueuse/metadata": "10.2.1", + "@vueuse/shared": "10.2.1", + "vue-demi": ">=0.14.5" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/antfu" } }, - "node_modules/cli-spinners": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", - "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==", + "node_modules/@vueuse/core/node_modules/vue-demi": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.5.tgz", + "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, "engines": { - "node": ">=6" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "dependencies": { - "slice-ansi": "^5.0.0", - "string-width": "^5.0.0" + "url": "https://github.com/sponsors/antfu" }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } } }, - "node_modules/cli-width": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.0.0.tgz", - "integrity": "sha512-ZksGS2xpa/bYkNzN3BAw1wEjsLV/ZKOf/CCrJ/QOBsxx6fOARIkwTutxp1XIOIohi6HKmOFjMoK/XaqDVUpEEw==", - "engines": { - "node": ">= 12" + "node_modules/@vueuse/metadata": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.2.1.tgz", + "integrity": "sha512-3Gt68mY/i6bQvFqx7cuGBzrCCQu17OBaGWS5JdwISpMsHnMKKjC2FeB5OAfMcCQ0oINfADP3i9A4PPRo0peHdQ==", + "funding": { + "url": "https://github.com/sponsors/antfu" } }, - "node_modules/clipboardy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-3.0.0.tgz", - "integrity": "sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==", + "node_modules/@vueuse/nuxt": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/@vueuse/nuxt/-/nuxt-10.2.1.tgz", + "integrity": "sha512-01iDXnjZFDaGZnEL0nvlmSTNV0EG6WY+VSFyWnBji9lbxdQwOn4DHvLou3ePe8ipaoQVtY58WcL0OHIFa4+fBA==", "dependencies": { - "arch": "^2.2.0", - "execa": "^5.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "@nuxt/kit": "^3.6.1", + "@vueuse/core": "10.2.1", + "@vueuse/metadata": "10.2.1", + "local-pkg": "^0.4.3", + "nuxt": "^3.6.1", + "vue-demi": ">=0.14.5" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "url": "https://github.com/sponsors/antfu" }, - "engines": { - "node": ">=12" + "peerDependencies": { + "nuxt": "^3.0.0" } }, - "node_modules/cliui/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" + "node_modules/@vueuse/nuxt/node_modules/vue-demi": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.5.tgz", + "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/cliui/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" + "url": "https://github.com/sponsors/antfu" }, - "engines": { - "node": ">=7.0.0" + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } } }, - "node_modules/cliui/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/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==" - }, - "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==", + "node_modules/@vueuse/shared": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.2.1.tgz", + "integrity": "sha512-QWHq2bSuGptkcxx4f4M/fBYC3Y8d3M2UYyLsyzoPgEoVzJURQ0oJeWXu79OiLlBb8gTKkqe4mO85T/sf39mmiw==", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "vue-demi": ">=0.14.5" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/antfu" } }, - "node_modules/cliui/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==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "node_modules/@vueuse/shared/node_modules/vue-demi": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.5.tgz", + "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } } }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "engines": { - "node": ">=0.8" - } + "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==" }, - "node_modules/cluster-key-slot": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", - "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "bin": { + "acorn": "bin/acorn" + }, "engines": { - "node": ">=0.10.0" + "node": ">=0.4.0" } }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "devOptional": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/color-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==", - "bin": { - "color-support": "bin.js" + "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==", + "engines": { + "node": ">=0.4.0" } }, - "node_modules/colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" - }, - "node_modules/colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" - }, - "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==", + "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==", "dependencies": { - "delayed-stream": "~1.0.0" + "debug": "4" }, "engines": { - "node": ">= 0.8" + "node": ">= 6.0.0" } }, - "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==", - "engines": { - "node": ">= 10" + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "devOptional": 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/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + "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==", + "engines": { + "node": ">=6" + } }, - "node_modules/compress-commons": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", - "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", + "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==", "dependencies": { - "buffer-crc32": "^0.2.13", - "crc32-stream": "^4.0.2", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" + "type-fest": "^0.21.3" }, "engines": { - "node": ">= 10" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/consola": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", - "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" - }, - "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==" - }, - "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==" - }, - "node_modules/cookie-es": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-0.5.0.tgz", - "integrity": "sha512-RyZrFi6PNpBFbIaQjXDlFIhFVqV42QeKSZX1yQIl6ihImq6vcHNGMtqQ/QzY3RMPuYSkvsRwtnt5M9NeYxKt0g==" - }, - "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==" - }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "bin": { - "crc32": "bin/crc32.njs" + "node_modules/ansi-escapes/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==", + "engines": { + "node": ">=10" }, + "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==", "engines": { - "node": ">=0.8" + "node": ">=8" } }, - "node_modules/crc32-stream": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", - "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", + "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==", "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^3.4.0" + "color-convert": "^1.9.0" }, "engines": { - "node": ">= 10" + "node": ">=4" } }, - "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==" - }, - "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==", + "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==", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" }, "engines": { "node": ">= 8" } }, - "node_modules/css-declaration-sorter": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz", - "integrity": "sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==", - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } + "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==" }, - "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==", - "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/arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "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/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "node_modules/archiver": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz", + "integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==", "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" + "archiver-utils": "^2.1.0", + "async": "^3.2.3", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.0.0", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" }, "engines": { - "node": ">=8.0.0" - } - }, - "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==", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "node": ">= 10" } }, - "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==", - "bin": { - "cssesc": "bin/cssesc" + "node_modules/archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dependencies": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" }, "engines": { - "node": ">=4" + "node": ">= 6" } }, - "node_modules/cssnano": { - "version": "5.1.14", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.14.tgz", - "integrity": "sha512-Oou7ihiTocbKqi0J1bB+TRJIQX5RMR3JghA8hcWSw9mjBLQ5Y3RWqEDoYG3sRNlAbCIXpqMoZGbq5KDR3vdzgw==", + "node_modules/archiver-utils/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dependencies": { - "cssnano-preset-default": "^5.2.13", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" + "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": "^10 || ^12 || >=14.0" + "node": "*" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/cssnano" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/cssnano-preset-default": { - "version": "5.2.13", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.13.tgz", - "integrity": "sha512-PX7sQ4Pb+UtOWuz8A1d+Rbi+WimBIxJTRyBdgGp1J75VU0r/HFQeLnMYgHiCAp6AR4rqrc7Y4R+1Rjk3KJz6DQ==", + "node_modules/archiver-utils/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/archiver-utils/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==", "dependencies": { - "css-declaration-sorter": "^6.3.1", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.3", - "postcss-discard-comments": "^5.1.2", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.7", - "postcss-merge-rules": "^5.1.3", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.4", - "postcss-minify-selectors": "^5.2.1", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.1", - "postcss-normalize-repeat-style": "^5.1.1", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.1", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.1", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "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/cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node_modules/archiver-utils/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==", + "dependencies": { + "safe-buffer": "~5.1.0" } }, - "node_modules/csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", "dependencies": { - "css-tree": "^1.1.2" + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" }, "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/csstype": { - "version": "2.6.21", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", - "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" - }, - "node_modules/cuint": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", - "integrity": "sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==" - }, - "node_modules/data-uri-to-buffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz", - "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==", - "engines": { - "node": ">= 12" + "node": ">=10" } }, - "node_modules/de-indent": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", - "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", - "dev": true + "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==" }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "node_modules/array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dev": true, "dependencies": { - "type-detect": "^4.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" }, "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "devOptional": true - }, - "node_modules/deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "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==", + "node_modules/array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dev": true, "dependencies": { - "clone": "^1.0.2" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", "dev": true, "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -4286,3135 +3907,3284 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/defu": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.2.tgz", - "integrity": "sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ==" - }, - "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/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "engines": { - "node": ">=0.4.0" + "node": "*" } }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" - }, - "node_modules/denque": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", - "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "node_modules/ast-kit": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/ast-kit/-/ast-kit-0.9.4.tgz", + "integrity": "sha512-UrZHsdj87OS6NM+IXRii+asdAUA/P0SMa4r1NrZvsUy72hDvCYwk8c9PsbKf1MvJ0BvP+rF1B8tFP54eT370Tg==", + "dependencies": { + "@babel/parser": "^7.22.7", + "@rollup/pluginutils": "^5.0.2", + "pathe": "^1.1.1" + }, "engines": { - "node": ">=0.10" + "node": ">=16.14.0" } }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "node_modules/ast-kit/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==", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, "engines": { - "node": ">= 0.8" + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, - "node_modules/destr": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/destr/-/destr-1.2.2.tgz", - "integrity": "sha512-lrbCJwD9saUQrqUfXvl6qoM+QN3W7tLV5pAOs+OqOmopCCz/JkE05MHedJR1xfk4IAnZuJXPVuN5+7jNA2ZCiA==" + "node_modules/ast-kit/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==" }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "node_modules/ast-walker-scope": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/ast-walker-scope/-/ast-walker-scope-0.4.2.tgz", + "integrity": "sha512-vdCU9JvpsrxWxvJiRHAr8If8cu07LWJXDPhkqLiP4ErbN1fu/mK623QGmU4Qbn2Nq4Mx0vR/Q017B6+HcHg1aQ==", + "dependencies": { + "@babel/parser": "^7.22.4", + "@babel/types": "^7.22.4" + }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">=16.14.0" } }, - "node_modules/detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", - "engines": { - "node": ">=8" - } + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" }, - "node_modules/diff": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", - "engines": { - "node": ">=0.3.1" - } + "node_modules/async-sema": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/async-sema/-/async-sema-3.1.1.tgz", + "integrity": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==" }, - "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==", + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/autoprefixer": { + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], "dependencies": { - "path-type": "^4.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": ">=8" + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "devOptional": true, - "dependencies": { - "esutils": "^2.0.2" - }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, "engines": { - "node": ">=6.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/axios": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", + "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "funding": [ { "type": "github", - "url": "https://github.com/sponsors/fb55" + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" } ] }, - "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", "dependencies": { - "domelementtype": "^2.2.0" + "safe-buffer": "5.1.2" }, "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" + "node": ">= 0.8" } }, - "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "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/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "dev": true, + "engines": { + "node": ">=0.6" } }, - "node_modules/dot-prop": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-7.2.0.tgz", - "integrity": "sha512-Ol/IPXUARn9CSbkrdV4VJo7uCy1I3VuSiWCaFSg+8BdUOzF9n3jefIpcgAydvUZbTdEBZs2vEiTiS9m61ssiDA==", - "dependencies": { - "type-fest": "^2.11.2" - }, + "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==", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/dot-prop/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dependencies": { + "file-uri-to-path": "1.0.0" } }, - "node_modules/dotenv": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", - "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", - "engines": { - "node": ">=12" + "node_modules/bl": { + "version": "4.1.0", + "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", + "readable-stream": "^3.4.0" } }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + "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==" }, - "node_modules/eastasianwidth": { + "node_modules/bplist-parser": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" - }, - "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/electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==" - }, - "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==" - }, - "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==", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dev": true, + "dependencies": { + "big-integer": "^1.6.44" + }, "engines": { - "node": ">= 0.8" + "node": ">= 5.10.0" } }, - "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==", + "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": { - "once": "^1.4.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/enhanced-resolve": { - "version": "5.11.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.11.0.tgz", - "integrity": "sha512-0Gcraf7gAJSQoPg+bTSXNhuzAYtXqLc4C011vb8S3B8XUSEkGYNBk20c68X9291VF4vvsCD8SPkr6Mza+DwU+g==", + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dependencies": { - "graceful-fs": "^4.2.9", - "tapable": "^2.2.0" + "fill-range": "^7.0.1" }, "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "2.2.0", - "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": ">=8" } }, - "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==", + "node_modules/browserslist": { + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "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": { - "prr": "~1.0.1" + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" }, "bin": { - "errno": "cli.js" + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "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, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { - "is-arrayish": "^0.2.1" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "node_modules/es-abstract": { - "version": "1.20.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz", - "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", - "get-symbol-description": "^1.0.0", - "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "unbox-primitive": "^1.0.2" - }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "engines": { - "node": ">= 0.4" + "node": "*" + } + }, + "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==" + }, + "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==", + "engines": { + "node": ">=6" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "node_modules/builtins": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", "dev": true, "dependencies": { - "has": "^1.0.3" + "semver": "^7.0.0" } }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "node_modules/builtins/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "yallist": "^4.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=10" } }, - "node_modules/esbuild": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.15.tgz", - "integrity": "sha512-TEw/lwK4Zzld9x3FedV6jy8onOUHqcEX3ADFk4k+gzPUwrxn8nWV62tH0udo8jOtjFodlEfc4ypsqX3e+WWO6w==", - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" + "node_modules/builtins/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==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" }, - "engines": { - "node": ">=12" + "bin": { + "semver": "bin/semver.js" }, - "optionalDependencies": { - "@esbuild/android-arm": "0.15.15", - "@esbuild/linux-loong64": "0.15.15", - "esbuild-android-64": "0.15.15", - "esbuild-android-arm64": "0.15.15", - "esbuild-darwin-64": "0.15.15", - "esbuild-darwin-arm64": "0.15.15", - "esbuild-freebsd-64": "0.15.15", - "esbuild-freebsd-arm64": "0.15.15", - "esbuild-linux-32": "0.15.15", - "esbuild-linux-64": "0.15.15", - "esbuild-linux-arm": "0.15.15", - "esbuild-linux-arm64": "0.15.15", - "esbuild-linux-mips64le": "0.15.15", - "esbuild-linux-ppc64le": "0.15.15", - "esbuild-linux-riscv64": "0.15.15", - "esbuild-linux-s390x": "0.15.15", - "esbuild-netbsd-64": "0.15.15", - "esbuild-openbsd-64": "0.15.15", - "esbuild-sunos-64": "0.15.15", - "esbuild-windows-32": "0.15.15", - "esbuild-windows-64": "0.15.15", - "esbuild-windows-arm64": "0.15.15" - } - }, - "node_modules/esbuild-linux-64": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.15.tgz", - "integrity": "sha512-217KPmWMirkf8liO+fj2qrPwbIbhNTGNVtvqI1TnOWJgcMjUWvd677Gq3fTzXEjilkx2yWypVnTswM2KbXgoAg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=12" + "node": ">=10" } }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "node_modules/builtins/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/bundle-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", + "dev": true, + "dependencies": { + "run-applescript": "^5.0.0" + }, "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" + "node_modules/c12": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/c12/-/c12-1.4.2.tgz", + "integrity": "sha512-3IP/MuamSVRVw8W8+CHWAz9gKN4gd+voF2zm/Ln6D25C2RhytEZ1ABbC8MjKr4BR9rhoV1JQ7jJA158LDiTkLg==", + "dependencies": { + "chokidar": "^3.5.3", + "defu": "^6.1.2", + "dotenv": "^16.3.1", + "giget": "^1.1.2", + "jiti": "^1.18.2", + "mlly": "^1.4.0", + "ohash": "^1.1.2", + "pathe": "^1.1.1", + "perfect-debounce": "^1.0.0", + "pkg-types": "^1.0.3", + "rc9": "^2.1.1" } }, - "node_modules/eslint": { - "version": "8.28.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.28.0.tgz", - "integrity": "sha512-S27Di+EVyMxcHiwDrFzk8dJYAaD+/5SoWKxL1ri/71CRHsnJnRDPNt2Kzj24+MT9FDupf4aqqyqPrvI8MvQ4VQ==", - "devOptional": true, + "node_modules/c8": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/c8/-/c8-7.14.0.tgz", + "integrity": "sha512-i04rtkkcNcCf7zsQcSv/T9EbUn4RXQ6mropeMcjFOsQXQ0iGLAr/xT6TImQg4+U9hmNpN9XdvPkjUL1IzbgxJw==", "dependencies": { - "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.11.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", + "@bcoe/v8-coverage": "^0.2.3", + "@istanbuljs/schema": "^0.1.3", "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.15.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" + "foreground-child": "^2.0.0", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-reports": "^3.1.4", + "rimraf": "^3.0.2", + "test-exclude": "^6.0.0", + "v8-to-istanbul": "^9.0.0", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9" }, "bin": { - "eslint": "bin/eslint.js" + "c8": "bin/c8.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=10.12.0" } }, - "node_modules/eslint-config-prettier": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", - "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "engines": { + "node": ">=8" } }, - "node_modules/eslint-config-standard": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.0.0.tgz", - "integrity": "sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "peerDependencies": { - "eslint": "^8.0.1", - "eslint-plugin-import": "^2.25.2", - "eslint-plugin-n": "^15.0.0", - "eslint-plugin-promise": "^6.0.0" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", - "dev": true, + "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": { - "debug": "^3.2.7", - "resolve": "^1.20.0" + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "devOptional": true, + "engines": { + "node": ">=6" } }, - "node_modules/eslint-import-resolver-typescript": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.2.tgz", - "integrity": "sha512-zX4ebnnyXiykjhcBvKIf5TNvt8K7yX6bllTRZ14MiurKPjDpCAZujlszTdB8pcNXhZcOf+god4s9SjQa5GnytQ==", - "dev": true, - "dependencies": { - "debug": "^4.3.4", - "enhanced-resolve": "^5.10.0", - "get-tsconfig": "^4.2.0", - "globby": "^13.1.2", - "is-core-module": "^2.10.0", - "is-glob": "^4.0.3", - "synckit": "^0.8.4" - }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": ">=10" }, "funding": { - "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" - }, - "peerDependencies": { - "eslint": "*", - "eslint-plugin-import": "*" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", - "dev": true, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", "dependencies": { - "debug": "^3.2.7" + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001517", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz", + "integrity": "sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==", + "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/chai": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" }, "engines": { "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } } }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, + "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==", "dependencies": { - "ms": "^2.1.1" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/eslint-plugin-es": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz", - "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==", - "dev": true, - "dependencies": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" - }, + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", "engines": { - "node": ">=8.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=4.19.1" + "node": "*" } }, - "node_modules/eslint-plugin-es/node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], "dependencies": { - "eslint-visitor-keys": "^1.1.0" + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" }, "engines": { - "node": ">=6" + "node": ">= 8.10.0" }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/eslint-plugin-import": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", - "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.3", - "has": "^1.0.3", - "is-core-module": "^2.8.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", - "tsconfig-paths": "^3.14.1" - }, + "node_modules/ci-info": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + "node": ">=8" } }, - "node_modules/eslint-plugin-import/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, + "node_modules/citty": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.2.tgz", + "integrity": "sha512-Me9nf0/BEmMOnuQzMOVXgpzkMUNbd0Am8lTl/13p0aRGAoLGk5T5sdet/42CrIGmWdG67BgHUhcKK1my1ujUEg==", "dependencies": { - "ms": "2.0.0" + "consola": "^3.2.3" } }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "node_modules/clean-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", + "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==", "dev": true, "dependencies": { - "esutils": "^2.0.2" + "escape-string-regexp": "^1.0.5" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/eslint-plugin-import/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/clear": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/clear/-/clear-0.1.0.tgz", + "integrity": "sha512-qMjRnoL+JDPJHeLePZJuao6+8orzHMGP04A8CdwCNsKhRbOnKRjefxONR7bwILT3MHecxKBjHkKL/tkZ8r4Uzw==", + "engines": { + "node": "*" + } }, - "node_modules/eslint-plugin-n": { - "version": "15.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.6.0.tgz", - "integrity": "sha512-Hd/F7wz4Mj44Jp0H6Jtty13NcE69GNTY0rVlgTIj1XBnGGVI6UTdDrpE6vqu3AHo07bygq/N+7OH/lgz1emUJw==", - "dev": true, + "node_modules/clipboardy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-3.0.0.tgz", + "integrity": "sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==", "dependencies": { - "builtins": "^5.0.1", - "eslint-plugin-es": "^4.1.0", - "eslint-utils": "^3.0.0", - "ignore": "^5.1.1", - "is-core-module": "^2.11.0", - "minimatch": "^3.1.2", - "resolve": "^1.22.1", - "semver": "^7.3.8" + "arch": "^2.2.0", + "execa": "^5.1.1", + "is-wsl": "^2.2.0" }, "engines": { - "node": ">=12.22.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=7.0.0" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-plugin-n/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, + "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==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cluster-key-slot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", + "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", "engines": { - "node": ">=10" + "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-node": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", - "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", - "dev": 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==", "dependencies": { - "eslint-plugin-es": "^3.0.0", - "eslint-utils": "^2.0.0", - "ignore": "^5.1.1", - "minimatch": "^3.0.4", - "resolve": "^1.10.1", - "semver": "^6.1.0" - }, - "engines": { - "node": ">=8.10.0" - }, - "peerDependencies": { - "eslint": ">=5.16.0" + "color-name": "1.1.3" } }, - "node_modules/eslint-plugin-node/node_modules/eslint-plugin-es": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", - "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", - "dev": true, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/color-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==", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dependencies": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" + "delayed-stream": "~1.0.0" }, "engines": { - "node": ">=8.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=4.19.1" + "node": ">= 0.8" } }, - "node_modules/eslint-plugin-node/node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, + "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==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + }, + "node_modules/compress-commons": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", + "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", "dependencies": { - "eslint-visitor-keys": "^1.1.0" + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" + "node": ">= 10" } }, - "node_modules/eslint-plugin-node/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/consola": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", + "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", "engines": { - "node": ">=4" + "node": "^14.18.0 || >=16.10.0" } }, - "node_modules/eslint-plugin-nuxt": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-nuxt/-/eslint-plugin-nuxt-4.0.0.tgz", - "integrity": "sha512-v3Vwdk8YKe52bAz8eSIDqQuTtfL/T1r9dSl1uhC5SyR5pgLxgKkQdxXVf/Bf6Ax7uyd9rHqiAuYVdqqDb7ILdA==", - "dev": true, - "dependencies": { - "eslint-plugin-vue": "^9.4.0", - "semver": "^7.3.7", - "vue-eslint-parser": "^9.0.3" - } + "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==" }, - "node_modules/eslint-plugin-nuxt/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" - }, + "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==" + }, + "node_modules/cookie-es": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-0.5.0.tgz", + "integrity": "sha512-RyZrFi6PNpBFbIaQjXDlFIhFVqV42QeKSZX1yQIl6ihImq6vcHNGMtqQ/QzY3RMPuYSkvsRwtnt5M9NeYxKt0g==", + "dev": true + }, + "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==" + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", "bin": { - "semver": "bin/semver.js" + "crc32": "bin/crc32.njs" }, "engines": { - "node": ">=10" + "node": ">=0.8" } }, - "node_modules/eslint-plugin-prettier": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", - "dev": true, + "node_modules/crc32-stream": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", + "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", "dependencies": { - "prettier-linter-helpers": "^1.0.0" + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" }, "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "eslint": ">=7.28.0", - "prettier": ">=2.0.0" + "node": ">= 10" + } + }, + "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==" + }, + "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==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, - "peerDependenciesMeta": { - "eslint-config-prettier": { - "optional": true - } + "engines": { + "node": ">= 8" } }, - "node_modules/eslint-plugin-promise": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", - "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", - "dev": true, + "node_modules/css-declaration-sorter": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", + "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^10 || ^12 || >=14" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "postcss": "^8.0.9" } }, - "node_modules/eslint-plugin-unicorn": { - "version": "44.0.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-44.0.2.tgz", - "integrity": "sha512-GLIDX1wmeEqpGaKcnMcqRvMVsoabeF0Ton0EX4Th5u6Kmf7RM9WBl705AXFEsns56ESkEs0uyelLuUTvz9Tr0w==", - "dev": true, + "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==", "dependencies": { - "@babel/helper-validator-identifier": "^7.19.1", - "ci-info": "^3.4.0", - "clean-regexp": "^1.0.0", - "eslint-utils": "^3.0.0", - "esquery": "^1.4.0", - "indent-string": "^4.0.0", - "is-builtin-module": "^3.2.0", - "lodash": "^4.17.21", - "pluralize": "^8.0.0", - "read-pkg-up": "^7.0.1", - "regexp-tree": "^0.1.24", - "safe-regex": "^2.1.1", - "semver": "^7.3.7", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=14.18" + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" }, "funding": { - "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" - }, - "peerDependencies": { - "eslint": ">=8.23.1" + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/eslint-plugin-unicorn/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" }, "engines": { - "node": ">=10" + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" } }, - "node_modules/eslint-plugin-vue": { - "version": "9.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.7.0.tgz", - "integrity": "sha512-DrOO3WZCZEwcLsnd3ohFwqCoipGRSTKTBTnLwdhqAbYZtzWl0o7D+D8ZhlmiZvABKTEl8AFsqH1GHGdybyoQmw==", - "dev": true, - "dependencies": { - "eslint-utils": "^3.0.0", - "natural-compare": "^1.4.0", - "nth-check": "^2.0.1", - "postcss-selector-parser": "^6.0.9", - "semver": "^7.3.5", - "vue-eslint-parser": "^9.0.1", - "xml-name-validator": "^4.0.0" - }, + "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==", "engines": { - "node": "^14.17.0 || >=16.0.0" + "node": ">= 6" }, - "peerDependencies": { - "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0" + "funding": { + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/eslint-plugin-vue/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" - }, + "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==", "bin": { - "semver": "bin/semver.js" + "cssesc": "bin/cssesc" }, "engines": { - "node": ">=10" + "node": ">=4" } }, - "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, + "node_modules/cssfilter": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz", + "integrity": "sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==" + }, + "node_modules/cssnano": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.0.1.tgz", + "integrity": "sha512-fVO1JdJ0LSdIGJq68eIxOqFpIJrZqXUsBt8fkrBcztCQqAjQD51OhZp7tc0ImcbwXD4k7ny84QTV90nZhmqbkg==", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "cssnano-preset-default": "^6.0.1", + "lilconfig": "^2.1.0" }, "engines": { - "node": ">=8.0.0" + "node": "^14 || ^16 || >=18.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "devOptional": true, + "node_modules/cssnano-preset-default": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.0.1.tgz", + "integrity": "sha512-7VzyFZ5zEB1+l1nToKyrRkuaJIx0zi/1npjvZfbBwbtNTzhLtlvYraK/7/uqmX2Wb2aQtd983uuGw79jAjLSuQ==", "dependencies": { - "eslint-visitor-keys": "^2.0.0" + "css-declaration-sorter": "^6.3.1", + "cssnano-utils": "^4.0.0", + "postcss-calc": "^9.0.0", + "postcss-colormin": "^6.0.0", + "postcss-convert-values": "^6.0.0", + "postcss-discard-comments": "^6.0.0", + "postcss-discard-duplicates": "^6.0.0", + "postcss-discard-empty": "^6.0.0", + "postcss-discard-overridden": "^6.0.0", + "postcss-merge-longhand": "^6.0.0", + "postcss-merge-rules": "^6.0.1", + "postcss-minify-font-values": "^6.0.0", + "postcss-minify-gradients": "^6.0.0", + "postcss-minify-params": "^6.0.0", + "postcss-minify-selectors": "^6.0.0", + "postcss-normalize-charset": "^6.0.0", + "postcss-normalize-display-values": "^6.0.0", + "postcss-normalize-positions": "^6.0.0", + "postcss-normalize-repeat-style": "^6.0.0", + "postcss-normalize-string": "^6.0.0", + "postcss-normalize-timing-functions": "^6.0.0", + "postcss-normalize-unicode": "^6.0.0", + "postcss-normalize-url": "^6.0.0", + "postcss-normalize-whitespace": "^6.0.0", + "postcss-ordered-values": "^6.0.0", + "postcss-reduce-initial": "^6.0.0", + "postcss-reduce-transforms": "^6.0.0", + "postcss-svgo": "^6.0.0", + "postcss-unique-selectors": "^6.0.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.0.tgz", + "integrity": "sha512-Z39TLP+1E0KUcd7LGyF4qMfu8ZufI0rDzhdyAMsa/8UyNUU8wpS0fhdBxbQbv32r64ea00h4878gommRVg2BHw==", "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "eslint": ">=5" + "postcss": "^8.2.15" } }, - "node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "devOptional": true, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "dependencies": { + "css-tree": "~2.2.0" + }, "engines": { - "node": ">=10" + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" } }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "devOptional": true, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", "dependencies": { - "color-convert": "^2.0.1" + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" } }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "devOptional": true, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==" + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, + "node_modules/cuint": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", + "integrity": "sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==" + }, + "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/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "devOptional": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "ms": "2.1.2" }, "engines": { - "node": ">=10" + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "devOptional": true, + "node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", "dependencies": { - "color-name": "~1.1.4" + "type-detect": "^4.0.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=6" } }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "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==", "devOptional": true }, - "node_modules/eslint/node_modules/escape-string-regexp": { + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "devOptional": true, + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", + "dev": true, + "dependencies": { + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^7.1.1", + "titleize": "^3.0.0" + }, "engines": { - "node": ">=10" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "devOptional": true, + "node_modules/default-browser-id": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", + "dev": true, "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "devOptional": true, + "node_modules/default-browser/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==", + "dev": true, + "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": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "devOptional": true, + "node_modules/default-browser/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, "engines": { - "node": ">=4.0" + "node": ">=14.18.0" } }, - "node_modules/eslint/node_modules/globals": { - "version": "13.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz", - "integrity": "sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==", - "devOptional": true, - "dependencies": { - "type-fest": "^0.20.2" - }, + "node_modules/default-browser/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, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/has-flag": { + "node_modules/default-browser/node_modules/mimic-fn": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "devOptional": true, + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "devOptional": true, + "node_modules/default-browser/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, "dependencies": { - "has-flag": "^4.0.0" + "path-key": "^4.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "devOptional": true, - "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/espree": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", - "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", - "devOptional": true, + "node_modules/default-browser/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, "dependencies": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "mimic-fn": "^4.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=12" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "devOptional": true, + "node_modules/default-browser/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, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "devOptional": true, - "dependencies": { - "estraverse": "^5.1.0" + "node": ">=12" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/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": ">=0.10" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "devOptional": true, + "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==", "engines": { - "node": ">=4.0" + "node": ">=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==", - "devOptional": true, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, "dependencies": { - "estraverse": "^5.2.0" + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { - "node": ">=4.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "devOptional": true, - "engines": { - "node": ">=4.0" - } + "node_modules/defu": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.2.tgz", + "integrity": "sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ==" }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "engines": { - "node": ">=4.0" + "node": ">=0.4.0" } }, - "node_modules/estree-walker": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.1.tgz", - "integrity": "sha512-woY0RUD87WzMBUiZLx8NsYr23N5BKsOMZHhu2hoNRVh6NXGfoiT1KOL8G3UHlJAnEDGmfa5ubNA/AacfG+Kb0g==" + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "devOptional": true, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", "engines": { - "node": ">=0.10.0" + "node": ">=0.10" } }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "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.6" + "node": ">= 0.8" } }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + "node_modules/destr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.0.tgz", + "integrity": "sha512-FJ9RDpf3GicEBvzI3jxc2XhHzbqD8p4ANw/1kPsFBfTvP1b7Gn/Lg1vO7R9J4IVgoMbyUmFrFGZafJ1hPZpvlg==" }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "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==", - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, + "node_modules/detect-libc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", "engines": { - "node": ">=4" - } - }, - "node_modules/externality": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/externality/-/externality-1.0.0.tgz", - "integrity": "sha512-MAU9ci3XdpqOX1aoIoyL2DMzW97P8LYeJxIUkfXhOfsrkH4KLHFaYDwKN0B2l6tqedVJWiTIJtWmxmZfa05vOQ==", - "dependencies": { - "enhanced-resolve": "^5.10.0", - "mlly": "^1.0.0", - "pathe": "^1.0.0", - "ufo": "^1.0.0" + "node": ">=8" } }, - "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==", - "devOptional": true + "node_modules/devalue": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-4.3.2.tgz", + "integrity": "sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==" }, - "node_modules/fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true + "node_modules/diff-sequences": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", + "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } }, - "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==", + "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==", "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" + "path-type": "^4.0.0" }, "engines": { - "node": ">=8.6.0" + "node": ">=8" } }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "devOptional": true, "dependencies": { - "is-glob": "^4.0.1" + "esutils": "^2.0.2" }, "engines": { - "node": ">= 6" + "node": ">=6.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==", - "devOptional": true - }, - "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==", - "devOptional": true - }, - "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "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==", "dependencies": { - "reusify": "^1.0.4" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "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==", + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "funding": [ { "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "paypal", - "url": "https://paypal.me/jimmywarting" + "url": "https://github.com/sponsors/fb55" } - ], + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dependencies": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" + "domelementtype": "^2.3.0" }, "engines": { - "node": "^12.20 || >= 14.13" + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "node_modules/figures": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", - "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "dependencies": { - "escape-string-regexp": "^5.0.0", - "is-unicode-supported": "^1.2.0" + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-prop": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-7.2.0.tgz", + "integrity": "sha512-Ol/IPXUARn9CSbkrdV4VJo7uCy1I3VuSiWCaFSg+8BdUOzF9n3jefIpcgAydvUZbTdEBZs2vEiTiS9m61ssiDA==", + "dependencies": { + "type-fest": "^2.11.2" }, "engines": { - "node": ">=14" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/figures/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==", + "node_modules/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/motdotla/dotenv?sponsor=1" } }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "devOptional": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + "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/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==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, + "node_modules/electron-to-chromium": { + "version": "1.4.468", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.468.tgz", + "integrity": "sha512-6M1qyhaJOt7rQtNti1lBA0GwclPH+oKCmsra/hkcWs5INLxfXXD/dtdnaKUYQu/pjOBP/8Osoe4mAcNvvzoFag==" + }, + "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==" + }, + "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": ">=8" + "node": ">= 0.8" } }, - "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==", + "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==", "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" + "once": "^1.4.0" } }, - "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==", + "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==", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" }, "engines": { - "node": ">=10" + "node": ">=10.13.0" + } + }, + "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/sponsors/sindresorhus" + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "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==", + "dependencies": { + "prr": "~1.0.1" + }, "bin": { - "flat": "cli.js" + "errno": "cli.js" } }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "devOptional": 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": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" + "is-arrayish": "^0.2.1" } }, - "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "devOptional": true - }, - "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==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], + "node_modules/es-abstract": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" + }, "engines": { - "node": ">=4.0" + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">= 0.4" } }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" + "has": "^1.0.3" } }, - "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==", + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, "dependencies": { - "fetch-blob": "^3.1.2" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" }, "engines": { - "node": ">=12.20.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/esbuild": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.16.tgz", + "integrity": "sha512-1xLsOXrDqwdHxyXb/x/SOyg59jpf/SH7YMvU5RNSU7z3TInaASNJWNFJ6iRvLvLETZMasF3d1DdZLg7sgRimRQ==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, "engines": { - "node": "*" + "node": ">=12" }, - "funding": { - "type": "patreon", - "url": "https://www.patreon.com/infusion" + "optionalDependencies": { + "@esbuild/android-arm": "0.18.16", + "@esbuild/android-arm64": "0.18.16", + "@esbuild/android-x64": "0.18.16", + "@esbuild/darwin-arm64": "0.18.16", + "@esbuild/darwin-x64": "0.18.16", + "@esbuild/freebsd-arm64": "0.18.16", + "@esbuild/freebsd-x64": "0.18.16", + "@esbuild/linux-arm": "0.18.16", + "@esbuild/linux-arm64": "0.18.16", + "@esbuild/linux-ia32": "0.18.16", + "@esbuild/linux-loong64": "0.18.16", + "@esbuild/linux-mips64el": "0.18.16", + "@esbuild/linux-ppc64": "0.18.16", + "@esbuild/linux-riscv64": "0.18.16", + "@esbuild/linux-s390x": "0.18.16", + "@esbuild/linux-x64": "0.18.16", + "@esbuild/netbsd-x64": "0.18.16", + "@esbuild/openbsd-x64": "0.18.16", + "@esbuild/sunos-x64": "0.18.16", + "@esbuild/win32-arm64": "0.18.16", + "@esbuild/win32-ia32": "0.18.16", + "@esbuild/win32-x64": "0.18.16" } }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "engines": { - "node": ">= 0.6" + "node": ">=6" } }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + "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/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "engines": { - "node": ">=12" + "node": ">=0.8.0" } }, - "node_modules/fs-memo": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fs-memo/-/fs-memo-1.2.0.tgz", - "integrity": "sha512-YEexkCpL4j03jn5SxaMHqcO6IuWuqm8JFUYhyCep7Ao89JIYmB8xoKhK7zXXJ9cCaNXpyNH5L3QtAmoxjoHW2w==" - }, - "node_modules/fs-minipass": { + "node_modules/escodegen": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, "dependencies": { - "minipass": "^3.0.0" + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" }, - "engines": { - "node": ">= 8" - } - }, - "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==", - "dependencies": { - "yallist": "^4.0.0" + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" }, "engines": { - "node": ">=8" + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], + "node_modules/escodegen/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=4.0" } }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dev": true, + "node_modules/eslint": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz", + "integrity": "sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==", + "devOptional": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.1.0", + "@eslint/js": "8.44.0", + "@humanwhocodes/config-array": "^0.11.10", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.6.0", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" }, "engines": { - "node": ">= 0.4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint" } }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "node_modules/eslint-config-prettier": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", + "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" + "bin": { + "eslint-config-prettier": "bin/cli.js" }, - "engines": { - "node": ">=10" + "peerDependencies": { + "eslint": ">=7.0.0" } }, - "node_modules/gauge/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==" - }, - "node_modules/gauge/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" - }, + "node_modules/eslint-config-standard": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", + "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", + "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" + } + ], "engines": { - "node": ">=8" + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": "^8.0.1", + "eslint-plugin-import": "^2.25.2", + "eslint-plugin-n": "^15.0.0 || ^16.0.0 ", + "eslint-plugin-promise": "^6.0.0" } }, - "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==", - "engines": { - "node": ">=6.9.0" + "node_modules/eslint-import-resolver-node": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.11.0", + "resolve": "^1.22.1" } }, - "node_modules/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==", - "engines": { - "node": "6.* || 8.* || >= 10.*" + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" } }, - "node_modules/get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "node_modules/eslint-import-resolver-typescript": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.5.tgz", + "integrity": "sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "enhanced-resolve": "^5.12.0", + "eslint-module-utils": "^2.7.4", + "get-tsconfig": "^4.5.0", + "globby": "^13.1.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "synckit": "^0.8.5" + }, "engines": { - "node": "*" + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*" } }, - "node_modules/get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "node_modules/eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "debug": "^3.2.7" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, - "node_modules/get-port-please": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/get-port-please/-/get-port-please-2.6.1.tgz", - "integrity": "sha512-4PDSrL6+cuMM1xs6w36ZIkaKzzE0xzfVBCfebHIJ3FE8iB9oic/ECwPw3iNiD4h1AoJ5XLLBhEviFAVrZsDC5A==", + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, "dependencies": { - "fs-memo": "^1.2.0" + "ms": "^2.1.1" } }, - "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==", + "node_modules/eslint-plugin-es": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz", + "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==", + "dev": true, + "dependencies": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + }, "engines": { - "node": ">=10" + "node": ">=8.10.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=4.19.1" } }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "node_modules/eslint-plugin-es/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "eslint-visitor-keys": "^1.1.0" }, "engines": { - "node": ">= 0.4" + "node": ">=6" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/get-tsconfig": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.2.0.tgz", - "integrity": "sha512-X8u8fREiYOE6S8hLbq99PeykTDoLVnxvF4DjWKJmz9xy2nNRdUcV8ZN9tniJFeKyTU3qnC9lL8n4Chd6LmVKHg==", + "node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + "engines": { + "node": ">=4" } }, - "node_modules/giget": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/giget/-/giget-1.1.2.tgz", - "integrity": "sha512-HsLoS07HiQ5oqvObOI+Qb2tyZH4Gj5nYGfF9qQcZNrPw+uEFhdXtgJr01aO2pWadGHucajYDLxxbtQkm97ON2A==", + "node_modules/eslint-plugin-import": { + "version": "2.27.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", + "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "dev": true, "dependencies": { - "colorette": "^2.0.19", - "defu": "^6.1.2", - "https-proxy-agent": "^5.0.1", - "mri": "^1.2.0", - "node-fetch-native": "^1.0.2", - "pathe": "^1.1.0", - "tar": "^6.1.13" + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.7.4", + "has": "^1.0.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.6", + "resolve": "^1.22.1", + "semver": "^6.3.0", + "tsconfig-paths": "^3.14.1" }, - "bin": { - "giget": "dist/cli.mjs" - } - }, - "node_modules/git-config-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/git-config-path/-/git-config-path-2.0.0.tgz", - "integrity": "sha512-qc8h1KIQbJpp+241id3GuAtkdyJ+IK+LIVtkiFTRKRrmddDzs3SI9CvP1QYmWBFvm1I/PWRwj//of8bgAc0ltA==", "engines": { "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" } }, - "node_modules/git-up": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", - "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, "dependencies": { - "is-ssh": "^1.4.0", - "parse-url": "^8.1.0" + "ms": "^2.1.1" } }, - "node_modules/git-url-parse": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-13.1.0.tgz", - "integrity": "sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==", + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, "dependencies": { - "git-up": "^7.0.0" + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/glob": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "node_modules/eslint-plugin-n": { + "version": "15.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz", + "integrity": "sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==", + "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "builtins": "^5.0.1", + "eslint-plugin-es": "^4.1.0", + "eslint-utils": "^3.0.0", + "ignore": "^5.1.1", + "is-core-module": "^2.11.0", + "minimatch": "^3.1.2", + "resolve": "^1.22.1", + "semver": "^7.3.8" }, "engines": { - "node": ">=12" + "node": ">=12.22.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=7.0.0" } }, - "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==", - "devOptional": true, + "node_modules/eslint-plugin-n/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, "dependencies": { - "is-glob": "^4.0.3" + "yallist": "^4.0.0" }, "engines": { - "node": ">=10.13.0" - } - }, - "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==", - "dependencies": { - "balanced-match": "^1.0.0" + "node": ">=10" } }, - "node_modules/glob/node_modules/minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "node_modules/eslint-plugin-n/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==", + "dev": true, "dependencies": { - "brace-expansion": "^2.0.1" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/globalyzer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", - "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==", + "node_modules/eslint-plugin-n/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "node_modules/globby": { - "version": "13.1.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz", - "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==", + "node_modules/eslint-plugin-node": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", + "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", + "dev": true, "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^4.0.0" + "eslint-plugin-es": "^3.0.0", + "eslint-utils": "^2.0.0", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.1.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=8.10.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "eslint": ">=5.16.0" } }, - "node_modules/globrex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", - "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", - "dev": true - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "node_modules/eslint-plugin-node/node_modules/eslint-plugin-es": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", + "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.3" + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + }, + "engines": { + "node": ">=8.10.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=4.19.1" } }, - "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" - }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "devOptional": true - }, - "node_modules/gzip-size": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-7.0.0.tgz", - "integrity": "sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA==", + "node_modules/eslint-plugin-node/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, "dependencies": { - "duplexer": "^0.1.2" + "eslint-visitor-keys": "^1.1.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=6" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/h3": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/h3/-/h3-1.0.1.tgz", - "integrity": "sha512-gDCGpRvjchZW2JBlTqbJ9IOs+mdkXXuwSQkSye+jubHAv/UhdamKqoQvd4RFgyBNjHSId8Y+b10UdTcPlP/V+w==", - "dependencies": { - "cookie-es": "^0.5.0", - "destr": "^1.2.1", - "radix3": "^1.0.0", - "ufo": "^1.0.0" + "url": "https://github.com/sponsors/mysticatea" } }, - "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" - }, + "node_modules/eslint-plugin-node/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, "engines": { - "node": ">= 0.4.0" + "node": ">=4" } }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "node_modules/eslint-plugin-nuxt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-nuxt/-/eslint-plugin-nuxt-4.0.0.tgz", + "integrity": "sha512-v3Vwdk8YKe52bAz8eSIDqQuTtfL/T1r9dSl1uhC5SyR5pgLxgKkQdxXVf/Bf6Ax7uyd9rHqiAuYVdqqDb7ILdA==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "eslint-plugin-vue": "^9.4.0", + "semver": "^7.3.7", + "vue-eslint-parser": "^9.0.3" } }, - "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==", + "node_modules/eslint-plugin-nuxt/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": ">=4" + "node": ">=10" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "node_modules/eslint-plugin-nuxt/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==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.1" + "lru-cache": "^6.0.0" }, - "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" + "bin": { + "semver": "bin/semver.js" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=10" } }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "node_modules/eslint-plugin-nuxt/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.0.tgz", + "integrity": "sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==", "dev": true, "dependencies": { - "has-symbols": "^1.0.2" + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.5" }, "engines": { - "node": ">= 0.4" + "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } } }, - "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==" - }, - "node_modules/hash-sum": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz", - "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==" - }, - "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==", + "node_modules/eslint-plugin-promise": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", + "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", "dev": true, - "bin": { - "he": "bin/he" + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" } }, - "node_modules/hookable": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.4.2.tgz", - "integrity": "sha512-6rOvaUiNKy9lET1X0ECnyZ5O5kSV0PJbtA5yZUgdEF7fGJEVwSLSislltyt7nFwVVALYHQJtfGeAR2Y0A0uJkg==" - }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "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==" - }, - "node_modules/html-tags": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", - "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==", + "node_modules/eslint-plugin-unicorn": { + "version": "44.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-44.0.2.tgz", + "integrity": "sha512-GLIDX1wmeEqpGaKcnMcqRvMVsoabeF0Ton0EX4Th5u6Kmf7RM9WBl705AXFEsns56ESkEs0uyelLuUTvz9Tr0w==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.19.1", + "ci-info": "^3.4.0", + "clean-regexp": "^1.0.0", + "eslint-utils": "^3.0.0", + "esquery": "^1.4.0", + "indent-string": "^4.0.0", + "is-builtin-module": "^3.2.0", + "lodash": "^4.17.21", + "pluralize": "^8.0.0", + "read-pkg-up": "^7.0.1", + "regexp-tree": "^0.1.24", + "safe-regex": "^2.1.1", + "semver": "^7.3.7", + "strip-indent": "^3.0.0" + }, "engines": { - "node": ">=8" + "node": ">=14.18" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" + }, + "peerDependencies": { + "eslint": ">=8.23.1" } }, - "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==", + "node_modules/eslint-plugin-unicorn/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": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "yallist": "^4.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">=10" } }, - "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==", + "node_modules/eslint-plugin-unicorn/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==", + "dev": true, "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=8.0.0" + "node": ">=10" } }, - "node_modules/http-shutdown": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/http-shutdown/-/http-shutdown-1.2.2.tgz", - "integrity": "sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } + "node_modules/eslint-plugin-unicorn/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/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==", + "node_modules/eslint-plugin-vue": { + "version": "9.15.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.15.1.tgz", + "integrity": "sha512-CJE/oZOslvmAR9hf8SClTdQ9JLweghT6JCBQNrT2Iel1uVw0W0OLJxzvPd6CxmABKCvLrtyDnqGV37O7KQv6+A==", + "dev": true, "dependencies": { - "agent-base": "6", - "debug": "4" + "@eslint-community/eslint-utils": "^4.3.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.0.1", + "postcss-selector-parser": "^6.0.9", + "semver": "^7.3.5", + "vue-eslint-parser": "^9.3.0", + "xml-name-validator": "^4.0.0" }, "engines": { - "node": ">= 6" + "node": "^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.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==", + "node_modules/eslint-plugin-vue/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.17.0" + "node": ">=10" } }, - "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==", + "node_modules/eslint-plugin-vue/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==", + "dev": true, "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "node_modules/eslint-plugin-vue/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/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, "engines": { - "node": ">= 4" + "node": ">=8.0.0" } }, - "node_modules/immutable": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", - "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==" - }, - "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==", - "devOptional": true, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "eslint-visitor-keys": "^2.0.0" }, "engines": { - "node": ">=6" + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "devOptional": true, + "node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, "engines": { - "node": ">=0.8.19" + "node": ">=10" } }, - "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==", - "dev": true, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "devOptional": true, + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "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==", + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "devOptional": true, "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "node_modules/inquirer": { - "version": "9.1.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.1.4.tgz", - "integrity": "sha512-9hiJxE5gkK/cM2d1mTEnuurGTAoHebbkX0BYl3h7iEg7FYfuNIom+nDfBCSWtvSnoSrWCeBxqqBZu26xdlJlXA==", - "dependencies": { - "ansi-escapes": "^6.0.0", - "chalk": "^5.1.2", - "cli-cursor": "^4.0.0", - "cli-width": "^4.0.0", - "external-editor": "^3.0.3", - "figures": "^5.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^6.1.2", - "run-async": "^2.4.0", - "rxjs": "^7.5.7", - "string-width": "^5.1.2", - "strip-ansi": "^7.0.1", - "through": "^2.3.6", - "wrap-ansi": "^8.0.1" + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "devOptional": true, + "dependencies": { + "color-name": "~1.1.4" }, "engines": { - "node": ">=12.0.0" + "node": ">=7.0.0" } }, - "node_modules/inquirer/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==", + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "devOptional": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "devOptional": true, "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/inquirer/node_modules/chalk": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.1.2.tgz", - "integrity": "sha512-E5CkT4jWURs1Vy5qGJye+XwCkNj7Od3Af7CP6SujMetSMkLs8Do2RWJK5yx1wamHV/op8Rz+9rltjaTQWDnEFQ==", + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.1.tgz", + "integrity": "sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==", + "devOptional": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://opencollective.com/eslint" } }, - "node_modules/inquirer/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "devOptional": true, "engines": { - "node": ">=12" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "url": "https://opencollective.com/eslint" } }, - "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "devOptional": true, "engines": { - "node": ">= 0.4" + "node": ">=4.0" } }, - "node_modules/ioredis": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.2.4.tgz", - "integrity": "sha512-qIpuAEt32lZJQ0XyrloCRdlEdUUNGG9i0UOk6zgzK6igyudNWqEBxfH6OlbnOOoBBvr1WB02mm8fR55CnikRng==", + "node_modules/eslint/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==", + "devOptional": true, "dependencies": { - "@ioredis/commands": "^1.1.1", - "cluster-key-slot": "^1.1.0", - "debug": "^4.3.4", - "denque": "^2.0.1", - "lodash.defaults": "^4.2.0", - "lodash.isarguments": "^3.1.0", - "redis-errors": "^1.2.0", - "redis-parser": "^3.0.0", - "standard-as-callback": "^2.1.0" + "is-glob": "^4.0.3" }, "engines": { - "node": ">=12.22.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/ioredis" + "node": ">=10.13.0" } }, - "node_modules/ip-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-5.0.0.tgz", - "integrity": "sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw==", + "node_modules/eslint/node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "devOptional": true, + "dependencies": { + "type-fest": "^0.20.2" + }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "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-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "devOptional": true, + "engines": { + "node": ">=8" } }, - "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==", + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "devOptional": true, "dependencies": { - "binary-extensions": "^2.0.0" + "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "devOptional": true, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-builtin-module": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.0.tgz", - "integrity": "sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==", + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "devOptional": true, "dependencies": { - "builtin-modules": "^3.3.0" + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": ">=6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "devOptional": true, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dependencies": { - "has": "^1.0.3" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint" } }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "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, - "dependencies": { - "has-tostringtag": "^1.0.0" + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4" } }, - "node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "bin": { - "is-docker": "cli.js" + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "devOptional": true, + "dependencies": { + "estraverse": "^5.1.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "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==", + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "devOptional": true, "engines": { - "node": ">=0.10.0" + "node": ">=4.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==", + "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==", + "devOptional": true, + "dependencies": { + "estraverse": "^5.2.0" + }, "engines": { - "node": ">=8" + "node": ">=4.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==", - "dependencies": { - "is-extglob": "^2.1.1" - }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "devOptional": true, "engines": { - "node": ">=0.10.0" + "node": ">=4.0" } }, - "node_modules/is-https": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-https/-/is-https-4.0.0.tgz", - "integrity": "sha512-FeMLiqf8E5g6SdiVJsPcNZX8k4h2fBs1wp5Bb6uaNxn58ufK1axBqQZdmAQsqh0t9BuwFObybrdVJh6MKyPlyg==", - "dev": true - }, - "node_modules/is-interactive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "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": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4.0" } }, - "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==" + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dependencies": { + "@types/estree": "^1.0.0" + } }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "devOptional": true, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "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==", + "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.12.0" + "node": ">= 0.6" } }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dependencies": { - "has-tostringtag": "^1.0.0" + "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": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "devOptional": true, - "engines": { - "node": ">=8" + "node_modules/externality": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/externality/-/externality-1.0.2.tgz", + "integrity": "sha512-LyExtJWKxtgVzmgtEHyQtLFpw1KFhQphF9nTG8TpAIVkiI/xQ3FJh75tRFLYl4hkn7BNIIdLJInuDAavX35pMw==", + "dependencies": { + "enhanced-resolve": "^5.14.1", + "mlly": "^1.3.0", + "pathe": "^1.1.1", + "ufo": "^1.1.2" } }, - "node_modules/is-primitive": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-3.0.1.tgz", - "integrity": "sha512-GljRxhWvlCNRfZyORiH77FwdFwGcMO620o37EOYC0ORWdq+WYNVqW0w2Juzew4M+L81l6/QS3t5gkkihyRqv9w==", + "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==", + "devOptional": true + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "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==", + "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": ">=0.10.0" + "node": ">=8.6.0" } }, - "node_modules/is-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==" + "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==", + "devOptional": true }, - "node_modules/is-reference": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", - "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "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==", + "devOptional": true + }, + "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==", "dependencies": { - "@types/estree": "*" + "reusify": "^1.0.4" } }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, + "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": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^12.20 || >= 14.13" } }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "devOptional": true, "dependencies": { - "call-bind": "^1.0.2" + "flat-cache": "^3.0.4" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/is-ssh": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", - "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", - "dependencies": { - "protocols": "^2.0.1" - } + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" }, - "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==", + "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==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dependencies": { - "has-tostringtag": "^1.0.0" + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" }, "engines": { - "node": ">= 0.4" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, + "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==", "dependencies": { - "has-symbols": "^1.0.2" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", - "engines": { - "node": ">=12" - }, - "funding": { - "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==", + "bin": { + "flat": "cli.js" } }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "devOptional": true, "dependencies": { - "is-docker": "^2.0.0" + "flatted": "^3.1.0", + "rimraf": "^3.0.2" }, "engines": { - "node": ">=8" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/is-wsl/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==", - "bin": { - "is-docker": "cli.js" - }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "devOptional": true + }, + "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==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], "engines": { - "node": ">=8" + "node": ">=4.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "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==", - "engines": { - "node": ">=8" + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" } }, - "node_modules/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==", + "node_modules/foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" }, "engines": { - "node": ">=8" + "node": ">=8.0.0" } }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { + "node_modules/form-data": { "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/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, "engines": { - "node": ">=8" + "node": ">= 6" } }, - "node_modules/istanbul-lib-report/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/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": { - "has-flag": "^4.0.0" + "fetch-blob": "^3.1.2" }, "engines": { - "node": ">=8" + "node": ">=12.20.0" } }, - "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==", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" + "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==", + "engines": { + "node": "*" }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "node_modules/fs-extra": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">= 10.13.0" + "node": ">=14.14" } }, - "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==", + "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==", + "dependencies": { + "minipass": "^3.0.0" + }, "engines": { - "node": ">=8" + "node": ">= 8" } }, - "node_modules/jest-worker/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/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dependencies": { - "has-flag": "^4.0.0" + "yallist": "^4.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/jiti": { - "version": "1.17.2", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.17.2.tgz", - "integrity": "sha512-Xf0nU8+8wuiQpLcqdb2HRyHqYwGk2Pd+F7kstyp20ZuqTyCmB9dqpX2NxaxFc1kovraa2bG6c1RL3W7XfapiZg==", - "bin": { - "jiti": "bin/jiti.js" + "node_modules/fs-minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/js-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.1.tgz", - "integrity": "sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw==", + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/js-sdsl": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", - "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==", - "devOptional": true, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "devOptional": true, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", "dependencies": { - "argparse": "^2.0.1" + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=10" } }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" + "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==", + "engines": { + "node": ">=6.9.0" } }, - "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/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==", - "devOptional": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "devOptional": true + "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==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "bin": { - "json5": "lib/cli.js" - }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "engines": { - "node": ">=6" + "node": "*" } }, - "node_modules/jsonc-eslint-parser": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsonc-eslint-parser/-/jsonc-eslint-parser-1.4.1.tgz", - "integrity": "sha512-hXBrvsR1rdjmB2kQmUjf1rEIa+TqHBGMge8pwi++C+Si1ad7EjZrJcpgwym+QGK/pqTx+K7keFAtLlVNdLRJOg==", - "dev": true, + "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": { - "acorn": "^7.4.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^1.3.0", - "espree": "^6.0.0", - "semver": "^6.3.0" + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" }, - "engines": { - "node": ">=8.10.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jsonc-eslint-parser/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" - }, + "node_modules/get-port-please": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/get-port-please/-/get-port-please-3.0.1.tgz", + "integrity": "sha512-R5pcVO8Z1+pVDu8Ml3xaJCEkBiiy1VQN9za0YqH8GIi1nIqD4IzQhzY6dDzMRtdS1lyiGlucRzm8IN8wtLIXng==" + }, + "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==", "engines": { - "node": ">=0.4.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jsonc-eslint-parser/node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", "dev": true, "dependencies": { - "eslint-visitor-keys": "^1.1.0" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" }, "engines": { - "node": ">=6" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/jsonc-eslint-parser/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jsonc-eslint-parser/node_modules/espree": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", - "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "node_modules/get-tsconfig": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.6.2.tgz", + "integrity": "sha512-E5XrT4CbbXcXWy+1jChlZmrmCwd5KGx502kDCXJJ7y898TtWW9FwoG5HfOLVRKmlmDGkWN2HM9Ho+/Y8F0sJDg==", "dev": true, "dependencies": { - "acorn": "^7.1.1", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.1.0" + "resolve-pkg-maps": "^1.0.0" }, - "engines": { - "node": ">=6.0.0" + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, - "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==" - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "node_modules/giget": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/giget/-/giget-1.1.2.tgz", + "integrity": "sha512-HsLoS07HiQ5oqvObOI+Qb2tyZH4Gj5nYGfF9qQcZNrPw+uEFhdXtgJr01aO2pWadGHucajYDLxxbtQkm97ON2A==", "dependencies": { - "universalify": "^2.0.0" + "colorette": "^2.0.19", + "defu": "^6.1.2", + "https-proxy-agent": "^5.0.1", + "mri": "^1.2.0", + "node-fetch-native": "^1.0.2", + "pathe": "^1.1.0", + "tar": "^6.1.13" }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "bin": { + "giget": "dist/cli.mjs" } }, - "node_modules/klona": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", - "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", + "node_modules/git-config-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/git-config-path/-/git-config-path-2.0.0.tgz", + "integrity": "sha512-qc8h1KIQbJpp+241id3GuAtkdyJ+IK+LIVtkiFTRKRrmddDzs3SI9CvP1QYmWBFvm1I/PWRwj//of8bgAc0ltA==", "engines": { - "node": ">= 8" + "node": ">=4" } }, - "node_modules/knitwork": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/knitwork/-/knitwork-1.0.0.tgz", - "integrity": "sha512-dWl0Dbjm6Xm+kDxhPQJsCBTxrJzuGl0aP9rhr+TG8D3l+GL90N8O8lYUi7dTSAN2uuDqCtNgb6aEuQH5wsiV8Q==" + "node_modules/git-up": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", + "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", + "dependencies": { + "is-ssh": "^1.4.0", + "parse-url": "^8.1.0" + } }, - "node_modules/lazystream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "node_modules/git-url-parse": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-13.1.0.tgz", + "integrity": "sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==", "dependencies": { - "readable-stream": "^2.0.5" - }, - "engines": { - "node": ">= 0.6.3" + "git-up": "^7.0.0" } }, - "node_modules/lazystream/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", "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" + "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/lazystream/node_modules/safe-buffer": { + "node_modules/glob-parent": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } }, - "node_modules/lazystream/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==", + "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==", "dependencies": { - "safe-buffer": "~5.1.0" + "balanced-match": "^1.0.0" } }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "devOptional": true, + "node_modules/glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">= 0.8.0" + "node": ">=10" } }, - "node_modules/lilconfig": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", - "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", + "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==", "engines": { - "node": ">=10" + "node": ">=4" } }, - "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/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/listhen": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/listhen/-/listhen-1.0.0.tgz", - "integrity": "sha512-frdf7TVqT/JSHzRjEuo/vWIgbBYzEuY3oeTq8Yv1XkQVTKDPs2M4yotXICqYZYj2QxbkqKssSo8Wa6QCtBnFhg==", + "node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "dependencies": { - "clipboardy": "^3.0.0", - "colorette": "^2.0.19", - "defu": "^6.1.1", - "get-port-please": "^2.6.1", - "http-shutdown": "^1.2.2", - "ip-regex": "^5.0.0", - "node-forge": "^1.3.1", - "ufo": "^1.0.0" - } - }, - "node_modules/local-pkg": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", - "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, "engines": { - "node": ">=14" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/antfu" + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "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": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" + "get-intrinsic": "^1.1.3" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==" - }, - "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==" - }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" - }, - "node_modules/lodash.difference": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==" - }, - "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==" - }, - "node_modules/lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" - }, - "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==" + "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==" }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "devOptional": true }, - "node_modules/lodash.pick": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==" - }, - "node_modules/lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "node_modules/gzip-size": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-7.0.0.tgz", + "integrity": "sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA==", "dependencies": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" + "duplexer": "^0.1.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash.templatesettings": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "node_modules/h3": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/h3/-/h3-1.7.1.tgz", + "integrity": "sha512-A9V2NEDNHet7v1gCg7CMwerSigLi0SRbhTy7C3lGb0N4YKIpPmLDjedTUopqp4dnn7COHfqUjjaz3zbtz4QduA==", "dependencies": { - "lodash._reinterpolate": "^3.0.0" + "cookie-es": "^1.0.0", + "defu": "^6.1.2", + "destr": "^2.0.0", + "iron-webcrypto": "^0.7.0", + "radix3": "^1.0.1", + "ufo": "^1.1.2", + "uncrypto": "^0.1.3" } }, - "node_modules/lodash.union": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", - "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==" - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + "node_modules/h3/node_modules/cookie-es": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.0.0.tgz", + "integrity": "sha512-mWYvfOLrfEc996hlKcdABeIiPHUPC6DM2QYZdGGOvhOTbA3tjm2eBwqlJpoFdjC89NI4Qt6h0Pu06Mp+1Pj5OQ==" }, - "node_modules/log-symbols": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", - "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", + "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": { - "chalk": "^5.0.0", - "is-unicode-supported": "^1.1.0" + "function-bind": "^1.1.1" }, "engines": { - "node": ">=12" - }, + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.1.2.tgz", - "integrity": "sha512-E5CkT4jWURs1Vy5qGJye+XwCkNj7Od3Af7CP6SujMetSMkLs8Do2RWJK5yx1wamHV/op8Rz+9rltjaTQWDnEFQ==", + "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==", "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=4" } }, - "node_modules/loupe": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", - "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, "dependencies": { - "get-func-name": "^2.0.0" + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" + "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": ">=10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/magic-string": { - "version": "0.26.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz", - "integrity": "sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==", + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, "dependencies": { - "sourcemap-codec": "^1.4.8" + "has-symbols": "^1.0.2" }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dependencies": { - "semver": "^6.0.0" - }, + "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==" + }, + "node_modules/hash-sum": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz", + "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==" + }, + "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==", + "devOptional": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==" + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "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==" + }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", "engines": { "node": ">=8" }, @@ -7422,670 +7192,504 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + "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/memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "node_modules/http-graceful-shutdown": { + "version": "3.1.13", + "resolved": "https://registry.npmjs.org/http-graceful-shutdown/-/http-graceful-shutdown-3.1.13.tgz", + "integrity": "sha512-Ci5LRufQ8AtrQ1U26AevS8QoMXDOhnAHCJI3eZu1com7mZGHxREmw3dNj85ftpQokQCvak8nI2pnFS8zyM1M+Q==", "dependencies": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" + "debug": "^4.3.4" }, "engines": { - "node": ">=4.3.0 <5.0.0 || >=5.10" + "node": ">=4.0.0" } }, - "node_modules/memory-fs/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "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==", "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/memory-fs/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==" - }, - "node_modules/memory-fs/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==", - "dependencies": { - "safe-buffer": "~5.1.0" + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" } }, - "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==" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "node_modules/http-shutdown": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/http-shutdown/-/http-shutdown-1.2.2.tgz", + "integrity": "sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==", "engines": { - "node": ">= 8" + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" } }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "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==", "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" + "agent-base": "6", + "debug": "4" }, "engines": { - "node": ">=8.6" + "node": ">= 6" } }, - "node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "bin": { - "mime": "cli.js" - }, + "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==", "engines": { - "node": ">=10.0.0" + "node": ">=10.17.0" } }, - "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/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "engines": { - "node": ">= 0.6" + "node": ">= 4" } }, - "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==", + "node_modules/immutable": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.1.tgz", + "integrity": "sha512-lj9cnmB/kVS0QHsJnYKD1uo3o39nrbKxszjnqS9Fr6NB7bZzW45U6WSGBPKXDL/CvDKqDNPA4r3DoDQ8GTxo2A==" + }, + "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==", + "devOptional": true, "dependencies": { - "mime-db": "1.52.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": ">= 0.6" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "devOptional": true, "engines": { - "node": ">=6" + "node": ">=0.8.19" } }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "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==", "dev": true, "engines": { - "node": ">=4" + "node": ">=8" } }, - "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/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "once": "^1.3.0", + "wrappy": "1" } }, - "node_modules/minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "node_modules/minipass": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.4.tgz", - "integrity": "sha512-lwycX3cBMTvcejsHITUgYj6Gy6A7Nh4Q6h9NP4sTHY1ccJlC7yKzDmiShEHsJ16Jf1nKGDEaiHxiltsJEvk0nQ==", - "engines": { - "node": ">=8" - } + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, - "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/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" }, "engines": { - "node": ">= 8" + "node": ">= 0.4" } }, - "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/ioredis": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.3.2.tgz", + "integrity": "sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==", "dependencies": { - "yallist": "^4.0.0" + "@ioredis/commands": "^1.1.1", + "cluster-key-slot": "^1.1.0", + "debug": "^4.3.4", + "denque": "^2.1.0", + "lodash.defaults": "^4.2.0", + "lodash.isarguments": "^3.1.0", + "redis-errors": "^1.2.0", + "redis-parser": "^3.0.0", + "standard-as-callback": "^2.1.0" }, "engines": { - "node": ">=8" + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ioredis" } }, - "node_modules/mkdir": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/mkdir/-/mkdir-0.0.2.tgz", - "integrity": "sha512-98OnjcWaNEIRUJJe9rFoWlbkQ5n9z8F86wIPCrI961YEViiVybTuJln919WuuSHSnlrqXy0ELKCntoPy8C7lqg==", - "engines": { - "node": ">=0.4.0" + "node_modules/iron-webcrypto": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-0.7.1.tgz", + "integrity": "sha512-K/UmlEhPCPXEHV5hAtH5C0tI5JnFuOrv4yO/j7ODPl3HaiiHBLbOLTde+ieUaAyfCATe4LoAnclyF+hmSCOVmQ==", + "funding": { + "url": "https://github.com/sponsors/brc-dd" } }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" }, - "engines": { - "node": ">=10" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/mlly": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.1.1.tgz", - "integrity": "sha512-Jnlh4W/aI4GySPo6+DyTN17Q75KKbLTyFK8BrGhjNP4rxuUjbRWhE6gHg3bs33URWAF44FRm7gdQA348i3XxRw==", + "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-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, "dependencies": { - "acorn": "^8.8.2", - "pathe": "^1.1.0", - "pkg-types": "^1.0.1", - "ufo": "^1.1.0" + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "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==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/muggle-string": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.1.0.tgz", - "integrity": "sha512-Tr1knR3d2mKvvWthlk7202rywKbiOm4rVFLsfAaSIhJ6dt9o47W4S+JMtWhd/PW9Wrdew2/S2fSvhz3E2gkfEg==", - "dev": true - }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" - }, - "node_modules/nanoid": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.0.tgz", - "integrity": "sha512-IgBP8piMxe/gf73RTQx7hmnhwz0aaEXYakvqZyE302IXW3HyVNhdNGC+O2MwMAVhLEnvXlvKtGbtJf6wvHihCg==", - "bin": { - "nanoid": "bin/nanoid.js" + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { - "node": "^14 || ^16 || >=18" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "devOptional": true - }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, - "node_modules/nitropack": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/nitropack/-/nitropack-1.0.0.tgz", - "integrity": "sha512-788lHgNgC+NKqecwFgMkAQTuTXwuh2hEgOk2sLwV3qPVUogxrl6P3m5eKdt6Mtzx+mlXIw0G/P90B5TNWEqDSQ==", - "dependencies": { - "@cloudflare/kv-asset-handler": "^0.2.0", - "@netlify/functions": "^1.3.0", - "@rollup/plugin-alias": "^4.0.2", - "@rollup/plugin-commonjs": "^23.0.2", - "@rollup/plugin-inject": "^5.0.2", - "@rollup/plugin-json": "^5.0.1", - "@rollup/plugin-node-resolve": "^15.0.1", - "@rollup/plugin-replace": "^5.0.1", - "@rollup/plugin-wasm": "^6.0.1", - "@rollup/pluginutils": "^5.0.2", - "@vercel/nft": "^0.22.1", - "archiver": "^5.3.1", - "c12": "^1.0.1", - "chalk": "^5.1.2", - "chokidar": "^3.5.3", - "consola": "^2.15.3", - "cookie-es": "^0.5.0", - "defu": "^6.1.1", - "destr": "^1.2.1", - "dot-prop": "^7.2.0", - "esbuild": "^0.15.14", - "escape-string-regexp": "^5.0.0", - "etag": "^1.8.1", - "fs-extra": "^10.1.0", - "globby": "^13.1.2", - "gzip-size": "^7.0.0", - "h3": "^1.0.1", - "hookable": "^5.4.2", - "http-proxy": "^1.18.1", - "is-primitive": "^3.0.1", - "jiti": "^1.16.0", - "klona": "^2.0.5", - "knitwork": "^1.0.0", - "listhen": "^1.0.0", - "mime": "^3.0.0", - "mlly": "^1.0.0", - "mri": "^1.2.0", - "node-fetch-native": "^1.0.1", - "ofetch": "^1.0.0", - "ohash": "^1.0.0", - "pathe": "^1.0.0", - "perfect-debounce": "^0.1.3", - "pkg-types": "^1.0.1", - "pretty-bytes": "^6.0.0", - "radix3": "^1.0.0", - "rollup": "^2.79.1", - "rollup-plugin-terser": "^7.0.2", - "rollup-plugin-visualizer": "^5.8.3", - "scule": "^1.0.0", - "semver": "^7.3.8", - "serve-placeholder": "^2.0.1", - "serve-static": "^1.15.0", - "source-map-support": "^0.5.21", - "std-env": "^3.3.1", - "ufo": "^1.0.0", - "unenv": "^1.0.0", - "unimport": "^1.0.0", - "unstorage": "^1.0.1" - }, - "bin": { - "nitro": "dist/cli.mjs", - "nitropack": "dist/cli.mjs" + "node": ">= 0.4" }, - "engines": { - "node": "^14.16.0 || ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/nitropack/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==", + "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==", "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" + "builtin-modules": "^3.3.0" }, "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0" + "node": ">=6" }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/nitropack/node_modules/chalk": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.1.2.tgz", - "integrity": "sha512-E5CkT4jWURs1Vy5qGJye+XwCkNj7Od3Af7CP6SujMetSMkLs8Do2RWJK5yx1wamHV/op8Rz+9rltjaTQWDnEFQ==", + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/nitropack/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==", - "engines": { - "node": ">=12" + "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==", + "dependencies": { + "has": "^1.0.3" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/nitropack/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==" - }, - "node_modules/nitropack/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=10" - } - }, - "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": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/node-fetch": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.0.tgz", - "integrity": "sha512-BKwRP/O0UvoMKp7GNdwPlObhYGB5DQqwhEDQlNKuoqwVYSxkSZCSbHjnFFmUEtwSKRPU4kNK8PbDYYitwaE3QA==", - "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "bin": { + "is-docker": "cli.js" }, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/node-fetch-native": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.0.2.tgz", - "integrity": "sha512-KIkvH1jl6b3O7es/0ShyCgWLcfXxlBrLBbP3rOr23WArC66IMcU4DeZEeYEOwnopYhawLTn7/y+YtmASe8DFVQ==" + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } }, - "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==", + "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==", "engines": { - "node": ">= 6.13.0" + "node": ">=8" } }, - "node_modules/node-gyp-build": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", - "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" + "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==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" + "node_modules/is-https": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-https/-/is-https-4.0.0.tgz", + "integrity": "sha512-FeMLiqf8E5g6SdiVJsPcNZX8k4h2fBs1wp5Bb6uaNxn58ufK1axBqQZdmAQsqh0t9BuwFObybrdVJh6MKyPlyg==", + "dev": true }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, "dependencies": { - "abbrev": "1" + "is-docker": "^3.0.0" }, "bin": { - "nopt": "bin/nopt.js" + "is-inside-container": "cli.js" }, "engines": { - "node": ">=6" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } + "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==" }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true, - "bin": { - "semver": "bin/semver" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "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==", "engines": { - "node": ">=0.10.0" + "node": ">=0.12.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==", - "engines": { - "node": ">=0.10.0" - } - }, - "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==", + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "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==", - "dependencies": { - "path-key": "^3.0.0" - }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "devOptional": true, "engines": { "node": ">=8" } }, - "node_modules/npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" + "node_modules/is-primitive": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-3.0.1.tgz", + "integrity": "sha512-GljRxhWvlCNRfZyORiH77FwdFwGcMO620o37EOYC0ORWdq+WYNVqW0w2Juzew4M+L81l6/QS3t5gkkihyRqv9w==", + "engines": { + "node": ">=0.10.0" } }, - "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==", + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==" + }, + "node_modules/is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" + "@types/estree": "*" } }, - "node_modules/nuxi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/nuxi/-/nuxi-3.0.0.tgz", - "integrity": "sha512-VWh1kKFffxD2yadZWcQSd6eTf9okXRr7d3HsjLiI4B3Q1/8iKdIUiodGo7X71OZ+gPVnX6Oh/XFzcb7mr+8TbQ==", - "bin": { - "nuxi": "bin/nuxi.mjs" + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { - "node": "^14.16.0 || ^16.10.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + "node": ">= 0.4" }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/nuxt": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/nuxt/-/nuxt-3.0.0.tgz", - "integrity": "sha512-RNlD78uv04ZiXWmlx9f1tnJfrqsYAWHU+4gbgOTQpIBmQzHWPWiox+fm/1m93iKfEd5sJi9TJUoXX5yBObVZYw==", - "dependencies": { - "@nuxt/devalue": "^2.0.0", - "@nuxt/kit": "3.0.0", - "@nuxt/schema": "3.0.0", - "@nuxt/telemetry": "^2.1.8", - "@nuxt/ui-templates": "^1.0.0", - "@nuxt/vite-builder": "3.0.0", - "@unhead/ssr": "^1.0.0", - "@vue/reactivity": "^3.2.45", - "@vue/shared": "^3.2.45", - "@vueuse/head": "^1.0.15", - "chokidar": "^3.5.3", - "cookie-es": "^0.5.0", - "defu": "^6.1.1", - "destr": "^1.2.1", - "escape-string-regexp": "^5.0.0", - "estree-walker": "^3.0.1", - "fs-extra": "^10.1.0", - "globby": "^13.1.2", - "h3": "^1.0.1", - "hash-sum": "^2.0.0", - "hookable": "^5.4.2", - "knitwork": "^1.0.0", - "magic-string": "^0.26.7", - "mlly": "^1.0.0", - "nitropack": "^1.0.0", - "nuxi": "3.0.0", - "ofetch": "^1.0.0", - "ohash": "^1.0.0", - "pathe": "^1.0.0", - "perfect-debounce": "^0.1.3", - "scule": "^1.0.0", - "strip-literal": "^1.0.0", - "ufo": "^1.0.0", - "ultrahtml": "^1.0.0", - "unctx": "^2.1.0", - "unenv": "^1.0.0", - "unhead": "^1.0.0", - "unimport": "^1.0.1", - "unplugin": "^1.0.0", - "untyped": "^1.0.0", - "vue": "^3.2.45", - "vue-bundle-renderer": "^1.0.0", - "vue-devtools-stub": "^0.1.0", - "vue-router": "^4.1.6" - }, - "bin": { - "nuxi": "bin/nuxt.mjs", - "nuxt": "bin/nuxt.mjs" + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" }, - "engines": { - "node": "^14.16.0 || ^16.10.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/nuxt-icon": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/nuxt-icon/-/nuxt-icon-0.1.8.tgz", - "integrity": "sha512-oPFlLOZCy80MN+hf49+mBkOIHWVF3sOqZREQZw3qD0N6wGlR15QeRQtKQC8qGeQcc+xvpLQm0GvrdJ8FxFOPYg==", - "dev": true, + "node_modules/is-ssh": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", + "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", "dependencies": { - "@iconify/vue": "^4.0.1", - "@nuxt/kit": "^3.0.0" + "protocols": "^2.0.1" } }, - "node_modules/nuxt/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==", + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "engines": { - "node": ">=12" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -8094,15 +7698,13 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "has-symbols": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -8111,92 +7713,45 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ofetch": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.0.0.tgz", - "integrity": "sha512-d40aof8czZFSQKJa4+F7Ch3UC5D631cK1TTUoK+iNEut9NoiCL+u0vykl/puYVUS2df4tIQl5upQcolIcEzQjQ==", - "dependencies": { - "destr": "^1.2.1", - "node-fetch-native": "^1.0.1", - "ufo": "^1.0.0" - } - }, - "node_modules/ohash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ohash/-/ohash-1.0.0.tgz", - "integrity": "sha512-kxSyzq6tt+6EE/xCnD1XaFhCCjUNUaz3X30rJp6mnjGLXAAvuPFqohMdv0aScWzajR45C29HyBaXZ8jXBwnh9A==" - }, - "node_modules/ohmyfetch": { - "version": "0.4.21", - "resolved": "https://registry.npmjs.org/ohmyfetch/-/ohmyfetch-0.4.21.tgz", - "integrity": "sha512-VG7f/JRvqvBOYvL0tHyEIEG7XHWm7OqIfAs6/HqwWwDfjiJ1g0huIpe5sFEmyb+7hpFa1EGNH2aERWR72tlClw==", - "dependencies": { - "destr": "^1.2.0", - "node-fetch-native": "^0.1.8", - "ufo": "^0.8.6", - "undici": "^5.12.0" - } - }, - "node_modules/ohmyfetch/node_modules/node-fetch-native": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-0.1.8.tgz", - "integrity": "sha512-ZNaury9r0NxaT2oL65GvdGDy+5PlSaHTovT6JV5tOW07k1TQmgC0olZETa4C9KZg0+6zBr99ctTYa3Utqj9P/Q==" - }, - "node_modules/ohmyfetch/node_modules/ufo": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-0.8.6.tgz", - "integrity": "sha512-fk6CmUgwKCfX79EzcDQQpSCMxrHstvbLswFChHS0Vump+kFkw7nJBfTZoC1j0bOGoY9I7R3n2DGek5ajbcYnOw==" - }, - "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==", + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, "dependencies": { - "ee-first": "1.1.1" + "which-typed-array": "^1.1.11" }, "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" + "call-bind": "^1.0.2" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "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==", "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" + "is-docker": "^2.0.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/open/node_modules/is-docker": { + "node_modules/is-wsl/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==", @@ -8210,2828 +7765,4558 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "devOptional": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true }, - "node_modules/ora": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/ora/-/ora-6.1.2.tgz", - "integrity": "sha512-EJQ3NiP5Xo94wJXIzAyOtSb0QEIAUu7m8t6UZ9krbz0vAJqr92JpcK/lEXg91q6B9pEGqrykkd2EQplnifDSBw==", - "dependencies": { - "bl": "^5.0.0", - "chalk": "^5.0.0", - "cli-cursor": "^4.0.0", - "cli-spinners": "^2.6.1", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^1.1.0", - "log-symbols": "^5.1.0", - "strip-ansi": "^7.0.1", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "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==" }, - "node_modules/ora/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==", + "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==", "engines": { - "node": ">=12" + "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==", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "engines": { + "node": ">=8" } }, - "node_modules/ora/node_modules/chalk": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.1.2.tgz", - "integrity": "sha512-E5CkT4jWURs1Vy5qGJye+XwCkNj7Od3Af7CP6SujMetSMkLs8Do2RWJK5yx1wamHV/op8Rz+9rltjaTQWDnEFQ==", + "node_modules/istanbul-lib-report/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": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=8" } }, - "node_modules/ora/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "node_modules/istanbul-lib-report/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": { - "ansi-regex": "^6.0.1" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=12" + "node": ">=8" + } + }, + "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==", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "engines": { + "node": ">=8" } }, - "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==", + "node_modules/jiti": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.19.1.tgz", + "integrity": "sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-cookie": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", + "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==", + "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=14" } }, - "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==", + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" + "argparse": "^2.0.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "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==", - "dependencies": { - "p-limit": "^3.0.2" + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "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==", + "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/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==", + "devOptional": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "devOptional": 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==", + "bin": { + "json5": "lib/cli.js" + }, "engines": { "node": ">=6" } }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "devOptional": true, + "node_modules/jsonc-eslint-parser": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsonc-eslint-parser/-/jsonc-eslint-parser-1.4.1.tgz", + "integrity": "sha512-hXBrvsR1rdjmB2kQmUjf1rEIa+TqHBGMge8pwi++C+Si1ad7EjZrJcpgwym+QGK/pqTx+K7keFAtLlVNdLRJOg==", + "dev": true, "dependencies": { - "callsites": "^3.0.0" + "acorn": "^7.4.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^1.3.0", + "espree": "^6.0.0", + "semver": "^6.3.0" }, "engines": { - "node": ">=6" + "node": ">=8.10.0" } }, - "node_modules/parse-git-config": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/parse-git-config/-/parse-git-config-3.0.0.tgz", - "integrity": "sha512-wXoQGL1D+2COYWCD35/xbiKma1Z15xvZL8cI25wvxzled58V51SJM04Urt/uznS900iQor7QO04SgdfT/XlbuA==", - "dependencies": { - "git-config-path": "^2.0.0", - "ini": "^1.3.5" + "node_modules/jsonc-eslint-parser/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": ">=8" + "node": ">=0.4.0" } }, - "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==", + "node_modules/jsonc-eslint-parser/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, "dependencies": { - "@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" + "eslint-visitor-keys": "^1.1.0" }, "engines": { - "node": ">=8" + "node": ">=6" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/parse-path": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz", - "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==", - "dependencies": { - "protocols": "^2.0.0" + "node_modules/jsonc-eslint-parser/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" } }, - "node_modules/parse-url": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", - "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", + "node_modules/jsonc-eslint-parser/node_modules/espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, "dependencies": { - "parse-path": "^7.0.0" + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6.0.0" } }, - "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/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==" + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "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==", + "node_modules/just-performance": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/just-performance/-/just-performance-4.3.0.tgz", + "integrity": "sha512-L7RjvtJsL0QO8xFs5wEoDDzzJwoiowRw6Rn/GnvldlchS2JQr9wFYPiwZcDfrbbujEKqKN0tvENdbjXdYhDp5Q==" + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "engines": { - "node": ">=8" + "node": ">=6" } }, - "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==", + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", "engines": { - "node": ">=0.10.0" + "node": ">= 8" } }, - "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==", + "node_modules/knitwork": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/knitwork/-/knitwork-1.0.0.tgz", + "integrity": "sha512-dWl0Dbjm6Xm+kDxhPQJsCBTxrJzuGl0aP9rhr+TG8D3l+GL90N8O8lYUi7dTSAN2uuDqCtNgb6aEuQH5wsiV8Q==" + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dependencies": { + "readable-stream": "^2.0.5" + }, "engines": { - "node": ">=8" + "node": ">= 0.6.3" } }, - "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==" + "node_modules/lazystream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, - "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==", - "engines": { - "node": ">=8" + "node_modules/lazystream/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==", + "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/pathe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.0.tgz", - "integrity": "sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==" - }, - "node_modules/pathval": { + "node_modules/lazystream/node_modules/string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "devOptional": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, "engines": { - "node": "*" + "node": ">= 0.8.0" } }, - "node_modules/perfect-debounce": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-0.1.3.tgz", - "integrity": "sha512-NOT9AcKiDGpnV/HBhI22Str++XWcErO/bALvHCuhv33owZW/CjH8KAFLZDCmu3727sihe0wTxpDhyGc6M8qacQ==" + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "engines": { + "node": ">=10" + } }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "node_modules/limiter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-2.1.0.tgz", + "integrity": "sha512-361TYz6iay6n+9KvUUImqdLuFigK+K79qrUtBsXhJTLdH4rIt/r1y8r1iozwh8KbZNpujbFTSh74mJ7bwbAMOw==", + "dependencies": { + "just-performance": "4.3.0" + } }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "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/listhen": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/listhen/-/listhen-1.1.2.tgz", + "integrity": "sha512-rLX5V57oonazmc6zoZ2LzfbSOfGzDOLdQ/eTEh/d3f1xYMACH1yIU8nr0YGl2WiR+l31o3QCN4/VH2dUNyYvTA==", + "dependencies": { + "citty": "^0.1.2", + "clipboardy": "^3.0.0", + "consola": "^3.2.3", + "defu": "^6.1.2", + "get-port-please": "^3.0.1", + "http-shutdown": "^1.2.2", + "jiti": "^1.19.1", + "mlly": "^1.4.0", + "node-forge": "^1.3.1", + "pathe": "^1.1.1", + "ufo": "^1.1.2" + }, + "bin": { + "listen": "bin/listhen.mjs", + "listhen": "bin/listhen.mjs" + } + }, + "node_modules/local-pkg": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", "engines": { - "node": ">=8.6" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/sponsors/antfu" } }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "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==", + "dependencies": { + "p-locate": "^5.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pkg-dir": { + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "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==" + }, + "node_modules/lodash.defaults": { "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==", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" + }, + "node_modules/lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==" + }, + "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==" + }, + "node_modules/lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "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==" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "devOptional": true + }, + "node_modules/lodash.pick": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==" + }, + "node_modules/lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + }, + "node_modules/loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", "dependencies": { - "find-up": "^4.0.0" + "get-func-name": "^2.0.0" + } + }, + "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==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" }, "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "node_modules/magic-string-ast": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/magic-string-ast/-/magic-string-ast-0.2.0.tgz", + "integrity": "sha512-GHev7SFZZrIFy+ZyNJOJpK88KoGSn6FUOhGJXSdHhPt7Q6htJKTiKkdGcJFKp9Tt3P4SIL/P+ro0jZ7BSV8KMw==", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "magic-string": "^0.30.1" }, "engines": { - "node": ">=8" + "node": ">=16.14.0" } }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "node_modules/magic-string-ast/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": { - "p-locate": "^4.1.0" + "@jridgewell/sourcemap-codec": "^1.4.15" }, "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dependencies": { - "p-try": "^2.0.0" + "semver": "^6.0.0" }, "engines": { - "node": ">=6" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==" + }, + "node_modules/memory-cache": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/memory-cache/-/memory-cache-0.2.0.tgz", + "integrity": "sha512-OcjA+jzjOYzKmKS6IQVALHLVz+rNTMPoJvCztFaZxwG14wtAW7VRZjwTQu06vKCYOxh4jVnik7ya0SXTB0W+xA==" + }, + "node_modules/memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", "dependencies": { - "p-limit": "^2.2.0" + "errno": "^0.1.3", + "readable-stream": "^2.0.1" }, "engines": { - "node": ">=8" + "node": ">=4.3.0 <5.0.0 || >=5.10" } }, - "node_modules/pkg-types": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.2.tgz", - "integrity": "sha512-hM58GKXOcj8WTqUXnsQyJYXdeAPbythQgEF3nTcEo+nkD49chjQ9IKm/QJy9xf6JakXptz86h7ecP2024rrLaQ==", - "dependencies": { - "jsonc-parser": "^3.2.0", - "mlly": "^1.1.1", - "pathe": "^1.1.0" - } + "node_modules/memory-fs/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, - "node_modules/pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "dev": true, - "engines": { - "node": ">=4" + "node_modules/memory-fs/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==", + "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/postcss": { - "version": "8.4.19", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.19.tgz", - "integrity": "sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - } - ], + "node_modules/memory-fs/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==", "dependencies": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" + "safe-buffer": "~5.1.0" } }, - "node_modules/postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", - "dependencies": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" - }, - "peerDependencies": { - "postcss": "^8.2.2" + "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==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" } }, - "node_modules/postcss-colormin": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", - "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dependencies": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "colord": "^2.9.1", - "postcss-value-parser": "^4.2.0" + "braces": "^3.0.2", + "picomatch": "^2.3.1" }, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">=8.6" } }, - "node_modules/postcss-convert-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", - "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", - "dependencies": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" + "node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "bin": { + "mime": "cli.js" }, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">=10.0.0" } }, - "node_modules/postcss-discard-comments": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", - "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "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": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">= 0.6" } }, - "node_modules/postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "engines": { - "node": "^10 || ^12 || >=14.0" + "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" }, - "peerDependencies": { - "postcss": "^8.2.15" + "engines": { + "node": ">= 0.6" } }, - "node_modules/postcss-discard-empty": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "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": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">=6" } }, - "node_modules/postcss-discard-overridden": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">=4" } }, - "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==", + "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": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-import-resolver": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-import-resolver/-/postcss-import-resolver-2.0.0.tgz", - "integrity": "sha512-y001XYgGvVwgxyxw9J1a5kqM/vtmIQGzx34g0A0Oy44MFcy/ZboZw1hu/iN3VYFjSTRzbvd7zZJJz0Kh0AGkTw==", - "dependencies": { - "enhanced-resolve": "^4.1.1" + "node": "*" } }, - "node_modules/postcss-import-resolver/node_modules/enhanced-resolve": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", - "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", - "dependencies": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - }, - "engines": { - "node": ">=6.9.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/postcss-import-resolver/node_modules/tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/postcss-merge-longhand": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", - "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "dependencies": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.1" + "minipass": "^3.0.0", + "yallist": "^4.0.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">= 8" } }, - "node_modules/postcss-merge-rules": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.3.tgz", - "integrity": "sha512-LbLd7uFC00vpOuMvyZop8+vvhnfRGpp2S+IMQKeuOZZapPRY4SMq5ErjQeHbHsjCUgJkRNrlU+LmxsKIqPKQlA==", + "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==", "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", - "postcss-selector-parser": "^6.0.5" + "yallist": "^4.0.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">=8" } }, - "node_modules/postcss-minify-font-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", - "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" + "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==" + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" }, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">=10" } }, - "node_modules/postcss-minify-gradients": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", - "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "node_modules/mlly": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.0.tgz", + "integrity": "sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==", "dependencies": { - "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "acorn": "^8.9.0", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "ufo": "^1.1.2" } }, - "node_modules/postcss-minify-params": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", - "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", - "dependencies": { - "browserslist": "^4.21.4", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">=4" } }, - "node_modules/postcss-minify-selectors": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", - "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "node_modules/postcss-normalize-charset": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } + "node_modules/muggle-string": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.3.1.tgz", + "integrity": "sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==", + "devOptional": true }, - "node_modules/postcss-normalize-display-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", - "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" + "node_modules/nanoid": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz", + "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.js" }, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": "^14 || ^16 || >=18" } }, - "node_modules/postcss-normalize-positions": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", - "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "devOptional": true }, - "node_modules/postcss-normalize-repeat-style": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", - "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", - "dependencies": { - "postcss-value-parser": "^4.2.0" + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "node_modules/nitropack": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/nitropack/-/nitropack-2.5.2.tgz", + "integrity": "sha512-hXEHY9NJmOOETFFTPCBB9PB0+txoAbU/fB2ovUF6UMRo4ucQZztYnZdX+YSxa6FVz6eONvcxXvf9/9s6t08KWw==", + "dependencies": { + "@cloudflare/kv-asset-handler": "^0.3.0", + "@netlify/functions": "^1.6.0", + "@rollup/plugin-alias": "^5.0.0", + "@rollup/plugin-commonjs": "^25.0.2", + "@rollup/plugin-inject": "^5.0.3", + "@rollup/plugin-json": "^6.0.0", + "@rollup/plugin-node-resolve": "^15.1.0", + "@rollup/plugin-replace": "^5.0.2", + "@rollup/plugin-terser": "^0.4.3", + "@rollup/plugin-wasm": "^6.1.3", + "@rollup/pluginutils": "^5.0.2", + "@types/http-proxy": "^1.17.11", + "@vercel/nft": "^0.22.6", + "archiver": "^5.3.1", + "c12": "^1.4.2", + "chalk": "^5.2.0", + "chokidar": "^3.5.3", + "citty": "^0.1.1", + "consola": "^3.2.2", + "cookie-es": "^1.0.0", + "defu": "^6.1.2", + "destr": "^2.0.0", + "dot-prop": "^7.2.0", + "esbuild": "^0.18.10", + "escape-string-regexp": "^5.0.0", + "etag": "^1.8.1", + "fs-extra": "^11.1.1", + "globby": "^13.2.0", + "gzip-size": "^7.0.0", + "h3": "^1.7.1", + "hookable": "^5.5.3", + "http-graceful-shutdown": "^3.1.13", + "http-proxy": "^1.18.1", + "is-primitive": "^3.0.1", + "jiti": "^1.18.2", + "klona": "^2.0.6", + "knitwork": "^1.0.0", + "listhen": "^1.0.4", + "magic-string": "^0.30.0", + "mime": "^3.0.0", + "mlly": "^1.4.0", + "mri": "^1.2.0", + "node-fetch-native": "^1.2.0", + "ofetch": "^1.1.1", + "ohash": "^1.1.2", + "openapi-typescript": "^6.2.8", + "pathe": "^1.1.1", + "perfect-debounce": "^1.0.0", + "pkg-types": "^1.0.3", + "pretty-bytes": "^6.1.0", + "radix3": "^1.0.1", + "rollup": "^3.25.3", + "rollup-plugin-visualizer": "^5.9.2", + "scule": "^1.0.0", + "semver": "^7.5.3", + "serve-placeholder": "^2.0.1", + "serve-static": "^1.15.0", + "source-map-support": "^0.5.21", + "std-env": "^3.3.3", + "ufo": "^1.1.2", + "uncrypto": "^0.1.3", + "unenv": "^1.5.1", + "unimport": "^3.0.11", + "unstorage": "^1.7.0" }, - "engines": { - "node": "^10 || ^12 || >=14.0" + "bin": { + "nitro": "dist/cli.mjs", + "nitropack": "dist/cli.mjs" }, - "peerDependencies": { - "postcss": "^8.2.15" + "engines": { + "node": "^14.16.0 || ^16.11.0 || >=17.0.0" } }, - "node_modules/postcss-normalize-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", - "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "node_modules/nitropack/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==", "dependencies": { - "postcss-value-parser": "^4.2.0" + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">=14.0.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, - "node_modules/postcss-normalize-timing-functions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", - "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, + "node_modules/nitropack/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, - "peerDependencies": { - "postcss": "^8.2.15" + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/postcss-normalize-unicode": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", - "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", - "dependencies": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" - }, + "node_modules/nitropack/node_modules/cookie-es": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.0.0.tgz", + "integrity": "sha512-mWYvfOLrfEc996hlKcdABeIiPHUPC6DM2QYZdGGOvhOTbA3tjm2eBwqlJpoFdjC89NI4Qt6h0Pu06Mp+1Pj5OQ==" + }, + "node_modules/nitropack/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==", "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">=12" }, - "peerDependencies": { - "postcss": "^8.2.15" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/postcss-normalize-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", - "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "node_modules/nitropack/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==" + }, + "node_modules/nitropack/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dependencies": { - "normalize-url": "^6.0.1", - "postcss-value-parser": "^4.2.0" + "yallist": "^4.0.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">=10" } }, - "node_modules/postcss-normalize-whitespace": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", - "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "node_modules/nitropack/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": { - "postcss-value-parser": "^4.2.0" + "@jridgewell/sourcemap-codec": "^1.4.15" }, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">=12" } }, - "node_modules/postcss-ordered-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", - "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "node_modules/nitropack/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dependencies": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" + "lru-cache": "^6.0.0" }, - "engines": { - "node": "^10 || ^12 || >=14.0" + "bin": { + "semver": "bin/semver.js" }, - "peerDependencies": { - "postcss": "^8.2.15" + "engines": { + "node": ">=10" } }, - "node_modules/postcss-reduce-initial": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.1.tgz", - "integrity": "sha512-//jeDqWcHPuXGZLoolFrUXBDyuEGbr9S2rMo19bkTIjBQ4PqkaO+oI8wua5BOUxpfi97i3PCoInsiFIEBfkm9w==", - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0" - }, + "node_modules/nitropack/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/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 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">=10.5.0" } }, - "node_modules/postcss-reduce-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", - "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "node_modules/node-fetch": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.1.tgz", + "integrity": "sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==", "dependencies": { - "postcss-value-parser": "^4.2.0" + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, - "peerDependencies": { - "postcss": "^8.2.15" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" } }, - "node_modules/postcss-selector-parser": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", - "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, + "node_modules/node-fetch-native": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.2.0.tgz", + "integrity": "sha512-5IAMBTl9p6PaAjYCnMv5FmqIF6GcZnawAVnzaCG0rX2aYZJ4CxEkZNtVPuTRug7fL7wyM5BQYTlAzcyMPi6oTQ==" + }, + "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==", "engines": { - "node": ">=4" + "node": ">= 6.13.0" } }, - "node_modules/postcss-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", - "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "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==", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" } }, - "node_modules/postcss-unique-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", - "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "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==" + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", "dependencies": { - "postcss-selector-parser": "^6.0.5" + "abbrev": "1" }, - "engines": { - "node": "^10 || ^12 || >=14.0" + "bin": { + "nopt": "bin/nopt.js" }, - "peerDependencies": { - "postcss": "^8.2.15" + "engines": { + "node": ">=6" } }, - "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==", - "dependencies": { - "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/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.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==", + "node_modules/normalize-package-data/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, "bin": { - "mime": "cli.js" - }, + "semver": "bin/semver" + } + }, + "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==", "engines": { - "node": ">=4.0.0" + "node": ">=0.10.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/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==", + "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==", "dependencies": { - "brace-expansion": "^1.1.7" + "path-key": "^3.0.0" }, "engines": { - "node": "*" + "node": ">=8" } }, - "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==" + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } }, - "node_modules/postcss/node_modules/nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "bin": { - "nanoid": "bin/nanoid.cjs" + "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==", + "dependencies": { + "boolbase": "^1.0.0" }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "devOptional": true, + "node_modules/nuxi": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/nuxi/-/nuxi-3.6.5.tgz", + "integrity": "sha512-4XEXYz71UiWWiKC1/cJCzqRSUEImYRmjcvKpSsBKMU58ALYVSx5KIoas5SwLO8tEKO5BS4DAe4u7MYix7hfuHQ==", + "bin": { + "nuxi": "bin/nuxi.mjs" + }, "engines": { - "node": ">= 0.8.0" + "node": "^14.18.0 || >=16.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", - "dev": true, - "peer": true, + "node_modules/nuxt": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/nuxt/-/nuxt-3.6.5.tgz", + "integrity": "sha512-0A7V8B1HrIXX9IlqPc2w+5ZPXi+7MYa9QVhtuGYuLvjRKoSFANhCoMPRP6pKdoxigM1MBxhLue2VmHA/VbtJCw==", + "dependencies": { + "@nuxt/devalue": "^2.0.2", + "@nuxt/kit": "3.6.5", + "@nuxt/schema": "3.6.5", + "@nuxt/telemetry": "^2.3.0", + "@nuxt/ui-templates": "^1.2.0", + "@nuxt/vite-builder": "3.6.5", + "@unhead/ssr": "^1.1.30", + "@unhead/vue": "^1.1.30", + "@vue/shared": "^3.3.4", + "acorn": "8.10.0", + "c12": "^1.4.2", + "chokidar": "^3.5.3", + "cookie-es": "^1.0.0", + "defu": "^6.1.2", + "destr": "^2.0.0", + "devalue": "^4.3.2", + "esbuild": "^0.18.11", + "escape-string-regexp": "^5.0.0", + "estree-walker": "^3.0.3", + "fs-extra": "^11.1.1", + "globby": "^13.2.2", + "h3": "^1.7.1", + "hookable": "^5.5.3", + "jiti": "^1.19.1", + "klona": "^2.0.6", + "knitwork": "^1.0.0", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.1", + "mlly": "^1.4.0", + "nitropack": "^2.5.2", + "nuxi": "3.6.5", + "nypm": "^0.2.2", + "ofetch": "^1.1.1", + "ohash": "^1.1.2", + "pathe": "^1.1.1", + "perfect-debounce": "^1.0.0", + "prompts": "^2.4.2", + "scule": "^1.0.0", + "strip-literal": "^1.0.1", + "ufo": "^1.1.2", + "ultrahtml": "^1.2.0", + "uncrypto": "^0.1.3", + "unctx": "^2.3.1", + "unenv": "^1.5.1", + "unimport": "^3.0.14", + "unplugin": "^1.3.2", + "unplugin-vue-router": "^0.6.4", + "untyped": "^1.3.2", + "vue": "^3.3.4", + "vue-bundle-renderer": "^1.0.3", + "vue-devtools-stub": "^0.1.0", + "vue-router": "^4.2.4" + }, "bin": { - "prettier": "bin-prettier.js" + "nuxi": "bin/nuxt.mjs", + "nuxt": "bin/nuxt.mjs" }, "engines": { - "node": ">=10.13.0" + "node": "^14.18.0 || >=16.10.0" }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "peerDependencies": { + "@parcel/watcher": "^2.1.0", + "@types/node": "^14.18.0 || >=16.10.0" + }, + "peerDependenciesMeta": { + "@parcel/watcher": { + "optional": true + } } }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "node_modules/nuxt-csurf": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/nuxt-csurf/-/nuxt-csurf-1.2.0.tgz", + "integrity": "sha512-sO8Hm3fR+GB3DMc0y1Slzt+f9LiUKpvF/qvUUZBWz1ZknfTRTYemZkfSNcoYf0/hoL2Wb9O0c8pFtzj0hs8Spw==", + "dependencies": { + "@nuxt/kit": "^3.1.0", + "defu": "^6.1.1" + } + }, + "node_modules/nuxt-icon": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/nuxt-icon/-/nuxt-icon-0.4.2.tgz", + "integrity": "sha512-yFpvDA+FuUz+ixtt1eRzctTfR4sl7egZoXu7LL+CUc42qFlzCMaTZJ9eqFR2FTW8zu9tfLIZ83RJmUa1jNEWgg==", "dev": true, "dependencies": { - "fast-diff": "^1.1.2" + "@iconify/vue": "^4.1.1", + "@nuxt/kit": "^3.6.1" + } + }, + "node_modules/nuxt-security": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/nuxt-security/-/nuxt-security-0.14.2.tgz", + "integrity": "sha512-2AmOxwmJOgOBYnYxy8QapIJx98DnLq6EAAvH24l6jMx7wSPJEtT/bb6i3VGy7EticHZkfJFM7H3eD2LxgxJ16Q==", + "dependencies": { + "@nuxt/kit": "^3.2.2", + "basic-auth": "^2.0.1", + "defu": "^6.1.1", + "limiter": "^2.1.0", + "memory-cache": "^0.2.0", + "nuxt-csurf": "^1.1.0", + "pathe": "^1.0.0", + "xss": "^1.0.14" + } + }, + "node_modules/nuxt-simple-sitemap": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/nuxt-simple-sitemap/-/nuxt-simple-sitemap-3.1.4.tgz", + "integrity": "sha512-rP2ZxiaEyrz1S16zOb6mmtVyxTgmUAErsy0QRaxIIEMJvnZ/0oFEgH6IbpnZchjw0dxlKCAhYgNof3QDF5VQ9Q==", + "dev": true, + "dependencies": { + "@nuxt/devtools-kit": "^0.7.4", + "@nuxt/kit": "^3.6.5", + "chalk": "^5.3.0", + "defu": "^6.1.2", + "escape-string-regexp": "^5.0.0", + "fast-glob": "^3.3.1", + "knitwork": "^1.0.0", + "nuxt-site-config": "^1.0.10", + "nuxt-site-config-kit": "^1.0.10", + "pathe": "^1.1.1", + "radix3": "^1.0.1", + "semver": "^7.5.4", + "site-config-stack": "^1.0.10", + "ufo": "^1.2.0" }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + } + }, + "node_modules/nuxt-simple-sitemap/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, "engines": { - "node": ">=6.0.0" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/pretty-bytes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.0.0.tgz", - "integrity": "sha512-6UqkYefdogmzqAZWzJ7laYeJnaXDy2/J+ZqiiMtS7t7OfpXWTlaeGMwX8U6EFvPV/YWWEKRkS8hKS4k60WHTOg==", + "node_modules/nuxt-simple-sitemap/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": "^14.13.1 || >=16.0.0" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "node_modules/nuxt-simple-sitemap/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": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" + "yallist": "^4.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=10" } }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "node_modules/nuxt-simple-sitemap/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==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, "engines": { "node": ">=10" + } + }, + "node_modules/nuxt-simple-sitemap/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/nuxt-site-config": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nuxt-site-config/-/nuxt-site-config-1.0.10.tgz", + "integrity": "sha512-rXiyDMeJTn32EBSZ5sSLAPrGOee2aacCCbCSFOlLfcQD3uXxNk25FZWFJbNO9RGVaSajY3qcNKcqa5vRKEy35A==", + "dev": true, + "dependencies": { + "@nuxt/kit": "^3.6.5", + "@nuxt/schema": "^3.6.5", + "nuxt-site-config-kit": "1.0.10", + "pathe": "^1.1.1", + "site-config-stack": "1.0.10", + "ufo": "^1.2.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/harlan-zw" } }, - "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==" + "node_modules/nuxt-site-config-kit": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nuxt-site-config-kit/-/nuxt-site-config-kit-1.0.10.tgz", + "integrity": "sha512-LvuXp2mWLONdB3biY4GmUPHu47XBZvoPIy2yDceWiGWa4tfwdCp/jVBJwgyFYVqwiXNZ7uJxG0omjNRPafXkqw==", + "dev": true, + "dependencies": { + "@nuxt/kit": "^3.6.5", + "@nuxt/schema": "^3.6.5", + "defu": "^6.1.2", + "pkg-types": "^1.0.3", + "site-config-stack": "1.0.10", + "ufo": "^1.2.0" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + } }, - "node_modules/protocols": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", - "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==" + "node_modules/nuxt/node_modules/cookie-es": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.0.0.tgz", + "integrity": "sha512-mWYvfOLrfEc996hlKcdABeIiPHUPC6DM2QYZdGGOvhOTbA3tjm2eBwqlJpoFdjC89NI4Qt6h0Pu06Mp+1Pj5OQ==" }, - "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==" + "node_modules/nuxt/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==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==" + "node_modules/nuxt/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/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "devOptional": true, + "node_modules/nypm": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.2.2.tgz", + "integrity": "sha512-O7bumfWgUXlJefT1Y41SF4vsCvzeUYmnKABuOKStheCObzrkWPDmqJc+RJVU+57oFu9bITcrUq8sKFIHgjCnTg==", + "dependencies": { + "execa": "^7.1.1" + }, "engines": { - "node": ">=6" + "node": "^14.16.0 || >=16.10.0" } }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "node_modules/nypm/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==", "dependencies": { - "side-channel": "^1.0.4" + "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": ">=0.6" + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "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==", - "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/radix3": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.0.0.tgz", - "integrity": "sha512-6n3AEXth91ASapMVKiEh2wrbFJmI+NBilrWE0AbiGgfm0xet0QXC8+a3K19r1UVYjUjctUgB053c3V/J6V0kCQ==" - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dependencies": { - "safe-buffer": "^5.1.0" + "node_modules/nypm/node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "engines": { + "node": ">=14.18.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==", + "node_modules/nypm/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==", "engines": { - "node": ">= 0.6" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/rc9": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.0.1.tgz", - "integrity": "sha512-9EfjLgNmzP9255YX8bGnILQcmdtOXKtUlFTu8bOZPJVtaUDZ2imswcUdpK51tMjTRQyB7r5RebNijrzuyGXcVA==", - "dependencies": { - "defu": "^6.1.2", - "destr": "^1.2.2", - "flat": "^5.0.2" + "node_modules/nypm/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==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" - }, - "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==", + "node_modules/nypm/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==", "dependencies": { - "pify": "^2.3.0" + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, + "node_modules/nypm/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==", "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" + "mimic-fn": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, + "node_modules/nypm/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==", "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg-up/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" + "node_modules/nypm/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==", + "engines": { + "node": ">=12" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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": ">=8" + "node": ">=0.10.0" } }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, "dependencies": { - "p-try": "^2.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" }, "engines": { - "node": ">=6" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "node_modules/object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", "dev": true, "dependencies": { - "p-limit": "^2.2.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" + "node_modules/ofetch": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.1.1.tgz", + "integrity": "sha512-SSMoktrp9SNLi20BWfB/BnnKcL0RDigXThD/mZBeQxkIRv1xrd9183MtLdsqRYLYSqW0eTr5t8w8MqjNhvoOQQ==", + "dependencies": { + "destr": "^2.0.0", + "node-fetch-native": "^1.2.0", + "ufo": "^1.1.2" } }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "engines": { - "node": ">=8" - } + "node_modules/ohash": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-1.1.2.tgz", + "integrity": "sha512-9CIOSq5945rI045GFtcO3uudyOkYVY1nyfFxVQp+9BRgslr8jPNiSSrsFGg/BNTUFOLqx0P5tng6G32brIPw0w==" }, - "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "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": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "ee-first": "1.1.1" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/readdir-glob": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.2.tgz", - "integrity": "sha512-6RLVvwJtVwEDfPdn6X6Ille4/lxGl0ATOY4FN/B9nxQcgOazvvI0nodiD19ScKq0PvA/29VpaOQML36o5IzZWA==", - "dependencies": { - "minimatch": "^5.1.0" + "node": ">= 0.8" } }, - "node_modules/readdir-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==", + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dependencies": { - "balanced-match": "^1.0.0" + "wrappy": "1" } }, - "node_modules/readdir-glob/node_modules/minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dependencies": { - "brace-expansion": "^2.0.1" + "mimic-fn": "^2.1.0" }, "engines": { - "node": ">=10" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "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==", "dependencies": { - "picomatch": "^2.2.1" + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" }, "engines": { - "node": ">=8.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/redis-errors": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", - "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", + "node_modules/open/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==", + "bin": { + "is-docker": "cli.js" + }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/redis-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", - "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", + "node_modules/openapi-typescript": { + "version": "6.3.7", + "resolved": "https://registry.npmjs.org/openapi-typescript/-/openapi-typescript-6.3.7.tgz", + "integrity": "sha512-hZKa43Ii/N8tbz1fc0cyyyWBEY4CARXeEmmUwI7D5Z+pfwQz1oei94IRJH3D/ZhGTHn74ETXZWmRO5AJI0cKuA==", "dependencies": { - "redis-errors": "^1.0.0" + "ansi-colors": "^4.1.3", + "fast-glob": "^3.3.0", + "js-yaml": "^4.1.0", + "supports-color": "^9.4.0", + "undici": "^5.22.1", + "yargs-parser": "^21.1.1" }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regexp-tree": { - "version": "0.1.24", - "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.24.tgz", - "integrity": "sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==", - "dev": true, "bin": { - "regexp-tree": "bin/regexp-tree" + "openapi-typescript": "bin/cli.js" } }, - "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - }, + "node_modules/openapi-typescript/node_modules/supports-color": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz", + "integrity": "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==", "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "devOptional": true, + "node_modules/openapi-typescript/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==", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" + "node": ">=12" } }, - "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==", + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "devOptional": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8.0" } }, - "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==" - }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "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==", "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "yocto-queue": "^0.1.0" }, - "bin": { - "resolve": "bin/resolve" + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "devOptional": true, - "engines": { - "node": ">=4" + "url": "https://github.com/sponsors/sindresorhus" } }, - "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/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==", "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "p-limit": "^3.0.2" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=10" }, "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==", + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "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==", + "devOptional": true, "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" + "callsites": "^3.0.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">=6" } }, - "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==", + "node_modules/parse-git-config": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/parse-git-config/-/parse-git-config-3.0.0.tgz", + "integrity": "sha512-wXoQGL1D+2COYWCD35/xbiKma1Z15xvZL8cI25wvxzled58V51SJM04Urt/uznS900iQor7QO04SgdfT/XlbuA==", "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" + "git-config-path": "^2.0.0", + "ini": "^1.3.5" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8" } }, - "node_modules/rollup": { - "version": "2.79.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", - "bin": { - "rollup": "dist/bin/rollup" + "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": ">=10.0.0" + "node": ">=8" }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/rollup-plugin-terser": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", - "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "node_modules/parse-path": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz", + "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==", "dependencies": { - "@babel/code-frame": "^7.10.4", - "jest-worker": "^26.2.1", - "serialize-javascript": "^4.0.0", - "terser": "^5.0.0" - }, - "peerDependencies": { - "rollup": "^2.0.0" + "protocols": "^2.0.0" } }, - "node_modules/rollup-plugin-visualizer": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.8.3.tgz", - "integrity": "sha512-QGJk4Bqe4AOat5AjipOh8esZH1nck5X2KFpf4VytUdSUuuuSwvIQZjMGgjcxe/zXexltqaXp5Vx1V3LmnQH15Q==", + "node_modules/parse-url": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", + "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", "dependencies": { - "open": "^8.4.0", - "source-map": "^0.7.4", - "yargs": "^17.5.1" - }, - "bin": { - "rollup-plugin-visualizer": "dist/bin/cli.js" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "rollup": "2.x || 3.x" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } + "parse-path": "^7.0.0" } }, - "node_modules/rollup-plugin-visualizer/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "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": ">= 8" + "node": ">= 0.8" } }, - "node_modules/rollup-pluginutils": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", - "dependencies": { - "estree-walker": "^0.6.1" + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" } }, - "node_modules/rollup-pluginutils/node_modules/estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==" + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "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==", "engines": { - "node": ">=0.12.0" + "node": ">=8" } }, - "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==", - "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/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==" + }, + "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==", + "engines": { + "node": ">=8" } }, - "node_modules/rxjs": { - "version": "7.5.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz", - "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==", - "dependencies": { - "tslib": "^2.1.0" + "node_modules/pathe": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", + "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==" + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "engines": { + "node": "*" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", - "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", - "dev": true, - "dependencies": { - "regexp-tree": "~0.1.1" - } + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==" }, - "node_modules/safe-regex-test": { + "node_modules/picocolors": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "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/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/sass": { - "version": "1.56.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.56.1.tgz", - "integrity": "sha512-VpEyKpyBPCxE7qGDtOcdJ6fFbcpOM+Emu7uZLxVrkX8KVU/Dp5UF7WLvzqRuUhB6mqqQt1xffLoG+AndxTZrCQ==", + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" + "find-up": "^4.0.0" }, "engines": { - "node": ">=12.0.0" + "node": ">=8" } }, - "node_modules/scule": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/scule/-/scule-1.0.0.tgz", - "integrity": "sha512-4AsO/FrViE/iDNEPaAQlb77tf0csuq27EsVpy6ett584EcRTp6pTDLoGWVxCD77y5iU5FauOvhsI4o1APwPoSQ==" - }, - "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dependencies": { - "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" + "p-locate": "^4.1.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=8" } }, - "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==", + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dependencies": { - "ms": "2.0.0" + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/send/node_modules/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" + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "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/serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "node_modules/pkg-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", + "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", "dependencies": { - "randombytes": "^2.1.0" + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" } }, - "node_modules/serve-placeholder": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/serve-placeholder/-/serve-placeholder-2.0.1.tgz", - "integrity": "sha512-rUzLlXk4uPFnbEaIz3SW8VISTxMuONas88nYWjAWaM2W9VDbt9tyFOr3lq8RhVOFrT3XISoBw8vni5una8qMnQ==", - "dependencies": { - "defu": "^6.0.0" + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true, + "engines": { + "node": ">=4" } }, - "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==", + "node_modules/postcss": { + "version": "8.4.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", + "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==", + "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": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" }, "engines": { - "node": ">= 0.8.0" + "node": "^10 || ^12 || >=14" } }, - "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==" - }, - "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==", + "node_modules/postcss-calc": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", + "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", "dependencies": { - "shebang-regex": "^3.0.0" + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=8" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" } }, - "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==", + "node_modules/postcss-colormin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.0.0.tgz", + "integrity": "sha512-EuO+bAUmutWoZYgHn2T1dG1pPqHU6L4TjzPlu4t1wZGXQ/fxV16xg2EJmYi0z+6r+MGV1yvpx1BHkUaRrPa2bw==", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": ">=8" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "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==", + "node_modules/postcss-convert-values": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.0.0.tgz", + "integrity": "sha512-U5D8QhVwqT++ecmy8rnTb+RL9n/B806UVaS3m60lqle4YDFcpbS3ae5bTQIh3wOGUSDHSEtMYLs/38dNG7EYFw==", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==" - }, - "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/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "node_modules/postcss-discard-comments": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.0.tgz", + "integrity": "sha512-p2skSGqzPMZkEQvJsgnkBhCn8gI7NzRH2683EEjrIkoMiwRELx68yoUJ3q3DGSGuQ8Ug9Gsn+OuDr46yfO+eFw==", "engines": { - "node": ">=12" + "node": "^14 || ^16 || >=18.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "postcss": "^8.2.15" } }, - "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==", - "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - }, + "node_modules/postcss-discard-duplicates": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.0.tgz", + "integrity": "sha512-bU1SXIizMLtDW4oSsi5C/xHKbhLlhek/0/yCnoMQany9k3nPBq+Ctsv/9oMmyqbR96HYHxZcHyK2HR5P/mqoGA==", "engines": { - "node": ">=12" + "node": "^14 || ^16 || >=18.0" }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/slice-ansi/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==", + "node_modules/postcss-discard-empty": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.0.tgz", + "integrity": "sha512-b+h1S1VT6dNhpcg+LpyiUrdnEZfICF0my7HAKgJixJLW7BnNmpRH34+uw/etf5AhOlIhIAuXApSzzDzMI9K/gQ==", "engines": { - "node": ">=12" + "node": "^14 || ^16 || >=18.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/slice-ansi/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==", + "node_modules/postcss-discard-overridden": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.0.tgz", + "integrity": "sha512-4VELwssYXDFigPYAZ8vL4yX4mUepF/oCBeeIT4OXsJPYOtvJumyz9WflmJWTfDwCUcpDR+z0zvCWBXgTx35SVw==", "engines": { - "node": ">=12" + "node": "^14 || ^16 || >=18.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "postcss": "^8.2.15" } }, - "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/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": ">=0.10.0" + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" } }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "engines": { - "node": ">=0.10.0" + "node_modules/postcss-import-resolver": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-import-resolver/-/postcss-import-resolver-2.0.0.tgz", + "integrity": "sha512-y001XYgGvVwgxyxw9J1a5kqM/vtmIQGzx34g0A0Oy44MFcy/ZboZw1hu/iN3VYFjSTRzbvd7zZJJz0Kh0AGkTw==", + "dependencies": { + "enhanced-resolve": "^4.1.1" } }, - "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==", + "node_modules/postcss-import-resolver/node_modules/enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=6.9.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==" + "node_modules/postcss-import-resolver/node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "engines": { + "node": ">=6" + } }, - "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, + "node_modules/postcss-merge-longhand": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.0.tgz", + "integrity": "sha512-4VSfd1lvGkLTLYcxFuISDtWUfFS4zXe0FpF149AyziftPFQIWxjvFSKhA4MIxMe4XM3yTDgQMbSNgzIVxChbIg==", "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "postcss-value-parser": "^4.2.0", + "stylehacks": "^6.0.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "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==", - "dev": 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==", - "dev": true, + "node_modules/postcss-merge-rules": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.0.1.tgz", + "integrity": "sha512-a4tlmJIQo9SCjcfiCcCMg/ZCEe0XTkl/xK0XHBs955GWg9xDX3NwP9pwZ78QUOWB8/0XCjZeJn98Dae0zg6AAw==", "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^4.0.0", + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/spdx-license-ids": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", - "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", - "dev": true - }, - "node_modules/stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility" - }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==" - }, - "node_modules/standard-as-callback": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", - "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==" - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "node_modules/postcss-minify-font-values": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.0.0.tgz", + "integrity": "sha512-zNRAVtyh5E8ndZEYXA4WS8ZYsAp798HiIQ1V2UF/C/munLp2r1UGHwf1+6JFu7hdEhJFN+W1WJQKBrtjhFgEnA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": ">= 0.8" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/std-env": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.2.tgz", - "integrity": "sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==" - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "node_modules/postcss-minify-gradients": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.0.tgz", + "integrity": "sha512-wO0F6YfVAR+K1xVxF53ueZJza3L+R3E6cp0VwuXJQejnNUH0DjcAFe3JEBeTY1dLwGa0NlDWueCA1VlEfiKgAA==", + "dependencies": { + "colord": "^2.9.1", + "cssnano-utils": "^4.0.0", + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": ">=10.0.0" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "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==", + "node_modules/postcss-minify-params": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.0.0.tgz", + "integrity": "sha512-Fz/wMQDveiS0n5JPcvsMeyNXOIMrwF88n7196puSuQSWSa+/Ofc1gDOSY2xi8+A4PqB5dlYCKk/WfqKqsI+ReQ==", "dependencies": { - "safe-buffer": "~5.2.0" + "browserslist": "^4.21.4", + "cssnano-utils": "^4.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "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==", + "node_modules/postcss-minify-selectors": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.0.tgz", + "integrity": "sha512-ec/q9JNCOC2CRDNnypipGfOhbYPuUkewGwLnbv6omue/PSASbHSU7s6uSQ0tcFRVv731oMIx8k0SP4ZX6be/0g==", "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" + "postcss-selector-parser": "^6.0.5" }, "engines": { - "node": ">=12" + "node": "^14 || ^16 || >=18.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/string-width/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==", + "node_modules/postcss-normalize-charset": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.0.tgz", + "integrity": "sha512-cqundwChbu8yO/gSWkuFDmKrCZ2vJzDAocheT2JTd0sFNA4HMGoKMfbk2B+J0OmO0t5GUkiAkSM5yF2rSLUjgQ==", "engines": { - "node": ">=12" + "node": "^14 || ^16 || >=18.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "node_modules/postcss-normalize-display-values": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.0.tgz", + "integrity": "sha512-Qyt5kMrvy7dJRO3OjF7zkotGfuYALETZE+4lk66sziWSPzlBEt7FrUshV6VLECkI4EN8Z863O6Nci4NXQGNzYw==", "dependencies": { - "ansi-regex": "^6.0.1" + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=12" + "node": "^14 || ^16 || >=18.0" }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", - "dev": true, + "node_modules/postcss-normalize-positions": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.0.tgz", + "integrity": "sha512-mPCzhSV8+30FZyWhxi6UoVRYd3ZBJgTRly4hOkaSifo0H+pjDYcii/aVT4YE6QpOil15a5uiv6ftnY3rm0igPg==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "postcss-value-parser": "^4.2.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", - "dev": true, + "node_modules/postcss-normalize-repeat-style": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.0.tgz", + "integrity": "sha512-50W5JWEBiOOAez2AKBh4kRFm2uhrT3O1Uwdxz7k24aKtbD83vqmcVG7zoIwo6xI2FZ/HDlbrCopXhLeTpQib1A==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "postcss-value-parser": "^4.2.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "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==", + "node_modules/postcss-normalize-string": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.0.tgz", + "integrity": "sha512-KWkIB7TrPOiqb8ZZz6homet2KWKJwIlysF5ICPZrXAylGe2hzX/HSf4NTX2rRPJMAtlRsj/yfkrWGavFuB+c0w==", "dependencies": { - "ansi-regex": "^5.0.1" + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=8" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, + "node_modules/postcss-normalize-timing-functions": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.0.tgz", + "integrity": "sha512-tpIXWciXBp5CiFs8sem90IWlw76FV4oi6QEWfQwyeREVwUy39VSeSqjAT7X0Qw650yAimYW5gkl2Gd871N5SQg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": ">=4" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "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==", + "node_modules/postcss-normalize-unicode": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.0.0.tgz", + "integrity": "sha512-ui5crYkb5ubEUDugDc786L/Me+DXp2dLg3fVJbqyAl0VPkAeALyAijF2zOsnZyaS1HyfPuMH0DwyY18VMFVNkg==", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": ">=6" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, + "node_modules/postcss-normalize-url": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.0.tgz", + "integrity": "sha512-98mvh2QzIPbb02YDIrYvAg4OUzGH7s1ZgHlD3fIdTHLgPLRpv1ZTKJDnSAKr4Rt21ZQFzwhGMXxpXlfrUBKFHw==", "dependencies": { - "min-indent": "^1.0.0" + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=8" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "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==", - "devOptional": true, + "node_modules/postcss-normalize-whitespace": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.0.tgz", + "integrity": "sha512-7cfE1AyLiK0+ZBG6FmLziJzqQCpTQY+8XjMhMAz8WSBSCsCNNUKujgIgjCAmDT3cJ+3zjTXFkoD15ZPsckArVw==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": ">=8" + "node": "^14 || ^16 || >=18.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/strip-literal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.0.0.tgz", - "integrity": "sha512-5o4LsH1lzBzO9UFH63AJ2ad2/S2AVx6NtjOcaz+VTT2h1RiRvbipW72z8M/lxEhcPHDBQwpDrnTF7sXy/7OwCQ==", + "node_modules/postcss-ordered-values": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.0.tgz", + "integrity": "sha512-K36XzUDpvfG/nWkjs6d1hRBydeIxGpKS2+n+ywlKPzx1nMYDYpoGbcjhj5AwVYJK1qV2/SDoDEnHzlPD6s3nMg==", "dependencies": { - "acorn": "^8.8.1" + "cssnano-utils": "^4.0.0", + "postcss-value-parser": "^4.2.0" }, - "funding": { - "url": "https://github.com/sponsors/antfu" + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/stylehacks": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", - "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "node_modules/postcss-reduce-initial": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.0.0.tgz", + "integrity": "sha512-s2UOnidpVuXu6JiiI5U+fV2jamAw5YNA9Fdi/GRK0zLDLCfXmSGqQtzpUPtfN66RtCbb9fFHoyZdQaxOB3WxVA==", "dependencies": { "browserslist": "^4.21.4", - "postcss-selector-parser": "^6.0.4" + "caniuse-api": "^3.0.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, - "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==", + "node_modules/postcss-reduce-transforms": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.0.tgz", + "integrity": "sha512-FQ9f6xM1homnuy1wLe9lP1wujzxnwt1EwiigtWwuyf8FsqqXUDUp2Ulxf9A5yjlUOTdCJO6lonYjg1mgqIIi2w==", "dependencies": { - "has-flag": "^3.0.0" + "postcss-value-parser": "^4.2.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==", - "engines": { - "node": ">= 0.4" + "node": "^14 || ^16 || >=18.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/svg-tags": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", - "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==" - }, - "node_modules/svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "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==", "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - }, - "bin": { - "svgo": "bin/svgo" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": ">=10.13.0" + "node": ">=4" } }, - "node_modules/synckit": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.4.tgz", - "integrity": "sha512-Dn2ZkzMdSX827QbowGbU/4yjWuvNaCoScLLoMo/yKbu+P4GBR6cRGKZH27k6a9bRzdqcyd1DE96pQtQ6uNkmyw==", - "dev": true, + "node_modules/postcss-svgo": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.0.tgz", + "integrity": "sha512-r9zvj/wGAoAIodn84dR/kFqwhINp5YsJkLoujybWG59grR/IHx+uQ2Zo+IcOwM0jskfYX3R0mo+1Kip1VSNcvw==", "dependencies": { - "@pkgr/utils": "^2.3.1", - "tslib": "^2.4.0" + "postcss-value-parser": "^4.2.0", + "svgo": "^3.0.2" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": "^14 || ^16 || >= 18" }, - "funding": { - "url": "https://opencollective.com/unts" + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "node_modules/postcss-unique-selectors": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.0.tgz", + "integrity": "sha512-EPQzpZNxOxP7777t73RQpZE5e9TrnCrkvp7AH7a0l89JmZiPnS82y216JowHXwpBCQitfyxrof9TK3rYbi7/Yw==", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, "engines": { - "node": ">=6" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/tar": { - "version": "6.1.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", - "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", + "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==", "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^4.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" + "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/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.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==", + "bin": { + "mime": "cli.js" }, "engines": { - "node": ">=6" + "node": ">=4.0.0" } }, - "node_modules/tar-stream/node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "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==", "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "node_modules/tar-stream/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "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==" + }, + "node_modules/postcss/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/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" + "url": "https://github.com/sponsors/ai" } ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/terser": { - "version": "5.15.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.1.tgz", - "integrity": "sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==", - "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, "bin": { - "terser": "bin/terser" + "nanoid": "bin/nanoid.cjs" }, "engines": { - "node": ">=10" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "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==" - }, - "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==", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "devOptional": true, "engines": { - "node": ">=8" + "node": ">= 0.8.0" } }, - "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==", - "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" + "node_modules/prettier": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz", + "integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==", + "dev": true, + "peer": true, + "bin": { + "prettier": "bin/prettier.cjs" }, "engines": { - "node": "*" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "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==", - "devOptional": true - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" - }, - "node_modules/tiny-glob": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", - "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", "dev": true, "dependencies": { - "globalyzer": "0.1.0", - "globrex": "^0.1.2" + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/tiny-invariant": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", - "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" - }, - "node_modules/tinybench": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.4.0.tgz", - "integrity": "sha512-iyziEiyFxX4kyxSp+MtY1oCH/lvjH3PxFN8PGCDeqcZWAJ/i+9y+nL85w99PxVzrIvew/GSkSbDYtiGVa85Afg==" + "node_modules/pretty-bytes": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.1.1.tgz", + "integrity": "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==", + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/tinypool": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.4.0.tgz", - "integrity": "sha512-2ksntHOKf893wSAH4z/+JbPpi92esw8Gn9N2deXX+B0EO92hexAVI9GIZZPx7P5aYo5KULfeOSt3kMOmSOy6uA==", + "node_modules/pretty-format": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", + "dependencies": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, "engines": { - "node": ">=14.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/tinyspy": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-1.1.1.tgz", - "integrity": "sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==", + "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==", "engines": { - "node": ">=14.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "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==" + }, + "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==", "dependencies": { - "os-tmpdir": "~1.0.2" + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" }, "engines": { - "node": ">=0.6.0" + "node": ">= 6" } }, - "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==", + "node_modules/protocols": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", + "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==" + }, + "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==" + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==" + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "devOptional": true, "engines": { - "node": ">=4" + "node": ">=6" } }, - "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==", + "node_modules/qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", "dependencies": { - "is-number": "^7.0.0" + "side-channel": "^1.0.4" }, "engines": { - "node": ">=8.0" + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/toidentifier": { + "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==", + "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/radix3": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.0.1.tgz", + "integrity": "sha512-y+AcwZ3HcUIGc9zGsNVf5+BY/LxL+z+4h4J3/pp8jxSmy1STaCocPS3qrj4tA5ehUSzqtqK+0Aygvz/r/8vy4g==" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "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==", "engines": { - "node": ">=0.6" + "node": ">= 0.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/rc9": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.1.tgz", + "integrity": "sha512-lNeOl38Ws0eNxpO3+wD1I9rkHGQyj1NU1jlzv4go2CtEnEQEUfqnIvZG7W+bC/aXdJ27n5x/yUjb6RoT9tko+Q==", + "dependencies": { + "defu": "^6.1.2", + "destr": "^2.0.0", + "flat": "^5.0.2" + } }, - "node_modules/tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", - "dev": true, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/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": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" + "pify": "^2.3.0" } }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, "dependencies": { - "minimist": "^1.2.0" + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" }, - "bin": { - "json5": "lib/cli.js" + "engines": { + "node": ">=8" } }, - "node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, "dependencies": { - "tslib": "^1.8.1" + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" }, "engines": { - "node": ">= 6" + "node": ">=8" }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "devOptional": true, + "node_modules/read-pkg-up/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": { - "prelude-ls": "^1.2.1" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=8" } }, - "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==", + "node_modules/read-pkg-up/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": ">=4" + "node": ">=8" } }, - "node_modules/type-fest": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.2.0.tgz", - "integrity": "sha512-Il3wdLRzWvbAEtocgxGQA9YOoRVeVUGOMBtel5LdEpNeEAol6GJTLw8GbX6Z8EIMfvfhoOXs2bwOijtAZdK5og==", + "node_modules/read-pkg-up/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": ">=14.16" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/typescript": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", - "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", - "devOptional": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "node_modules/read-pkg-up/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": ">=4.2.0" + "node": ">=8" } }, - "node_modules/ufo": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.1.1.tgz", - "integrity": "sha512-MvlCc4GHrmZdAllBc0iUDowff36Q9Ndw/UzqmEKyrfSzokTd9ZCy1i+IIk5hrYKkjoYVQyNbrw7/F8XJ2rEwTg==" - }, - "node_modules/ultrahtml": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.0.1.tgz", - "integrity": "sha512-VDt8gmBR5DPrsfdLS4GQqncojcsLTKMW6iHKVN9l6TohU5bdn/OPv8AmV/0/PBR7Z3qBmMpJHqxRdQFaFA8B9g==" - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true, + "engines": { + "node": ">=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==", "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 6" } }, - "node_modules/unctx": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/unctx/-/unctx-2.1.2.tgz", - "integrity": "sha512-KK18aLRKe3OlbPyHbXAkIWSU3xK8GInomXfA7fzDMGFXQ1crX1UWrCzKesVXeUyHIayHUrnTvf87IPCKMyeKTg==", + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", "dependencies": { - "acorn": "^8.8.2", - "estree-walker": "^3.0.3", - "magic-string": "^0.27.0", - "unplugin": "^1.0.1" + "minimatch": "^5.1.0" } }, - "node_modules/unctx/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "node_modules/readdir-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==", "dependencies": { - "@types/estree": "^1.0.0" + "balanced-match": "^1.0.0" } }, - "node_modules/unctx/node_modules/magic-string": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", - "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=12" + "node": ">=10" } }, - "node_modules/undici": { - "version": "5.20.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.20.0.tgz", - "integrity": "sha512-J3j60dYzuo6Eevbawwp1sdg16k5Tf768bxYK4TUJRH7cBM4kFCbf3mOnM/0E3vQYXvpxITbbWmBafaDbxLDz3g==", + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dependencies": { - "busboy": "^1.6.0" + "picomatch": "^2.2.1" }, "engines": { - "node": ">=12.18" + "node": ">=8.10.0" } }, - "node_modules/unenv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unenv/-/unenv-1.0.0.tgz", - "integrity": "sha512-vlyi2Rzj4CNlA1JsEXufX+ItkGr3Z5DfLzKniYEneMlBVtuxS+57f1LwTPj2eiBPSPaGHMUVzEnjSCGE7l8JQg==", - "dependencies": { - "defu": "^6.1.1", - "mime": "^3.0.0", - "node-fetch-native": "^1.0.1", - "pathe": "^1.0.0" + "node_modules/redis-errors": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", + "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", + "engines": { + "node": ">=4" } }, - "node_modules/unhead": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unhead/-/unhead-1.0.4.tgz", - "integrity": "sha512-d6qQR9fOjbi287DwEZyqECdHny7/z/1hpaARyhSj/zT2vScIsafWSlSJEpLiJQ/LrjhK7LQeSpgZi/cUYllzBA==", + "node_modules/redis-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", + "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", "dependencies": { - "@unhead/dom": "1.0.4", - "@unhead/schema": "1.0.4", - "hookable": "^5.4.2" + "redis-errors": "^1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/harlan-zw" + "engines": { + "node": ">=4" } }, - "node_modules/unimport": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unimport/-/unimport-1.0.1.tgz", - "integrity": "sha512-SEPKl3uyqUvi6c0MnyCmUF9H07CuC9j9p2p33F03LmegU0sxjpnjL0fLKAhh7BTfcKaJKj+1iOiAFtg7P3m5mQ==", - "dependencies": { - "@rollup/pluginutils": "^5.0.2", - "escape-string-regexp": "^5.0.0", - "fast-glob": "^3.2.12", - "local-pkg": "^0.4.2", - "magic-string": "^0.26.7", - "mlly": "^1.0.0", - "pathe": "^1.0.0", - "pkg-types": "^1.0.1", - "scule": "^1.0.0", - "strip-literal": "^1.0.0", - "unplugin": "^1.0.0" + "node_modules/regexp-tree": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", + "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", + "dev": true, + "bin": { + "regexp-tree": "bin/regexp-tree" } }, - "node_modules/unimport/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==", + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" }, "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0" + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/unimport/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==", + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, "engines": { - "node": ">=12" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/unimport/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==" - }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "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": ">= 10.0.0" + "node": ">=0.10.0" } }, - "node_modules/unplugin": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.1.0.tgz", - "integrity": "sha512-I8obQ8Rs/hnkxokRV6g8JKOQFgYNnTd9DL58vcSt5IJ9AkK8wbrtsnzD5hi4BJlvcY536JzfEXj9L6h7j559/A==", + "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==" + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "dependencies": { - "acorn": "^8.8.2", - "chokidar": "^3.5.3", - "webpack-sources": "^3.2.3", - "webpack-virtual-modules": "^0.5.0" + "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/unstorage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.0.1.tgz", - "integrity": "sha512-J1c4b8K2KeihHrQtdgl/ybIapArUbPaPb+TyJy/nGSauDwDYqciZsEKdkee568P3c8SSH4TIgnGRHDWMPGw+Lg==", - "dependencies": { - "anymatch": "^3.1.2", - "chokidar": "^3.5.3", - "destr": "^1.2.1", - "h3": "^1.0.1", - "ioredis": "^5.2.4", - "listhen": "^1.0.0", - "mkdir": "^0.0.2", - "mri": "^1.2.0", - "ofetch": "^1.0.0", - "ufo": "^1.0.0", - "ws": "^8.11.0" + "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==", + "devOptional": true, + "engines": { + "node": ">=4" } }, - "node_modules/untyped": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/untyped/-/untyped-1.2.2.tgz", - "integrity": "sha512-EANYd5L6AdpgfldlgMcmvOOnj092nWhy0ybhc7uhEH12ipytDYz89EOegBQKj8qWL3u1wgYnmFjADhsuCJs5Aw==", - "dependencies": { - "@babel/core": "^7.20.12", - "@babel/standalone": "^7.20.12", - "@babel/types": "^7.20.7", - "scule": "^1.0.0" + "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/upath": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", - "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "engines": { - "node": ">=4", - "yarn": "*" + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "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==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "glob": "^7.1.3" }, "bin": { - "browserslist-lint": "cli.js" + "rimraf": "bin.js" }, - "peerDependencies": { - "browserslist": ">= 4.21.0" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "devOptional": true, + "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==", "dependencies": { - "punycode": "^2.1.0" + "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/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/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==", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" + "node_modules/rollup": { + "version": "3.26.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.3.tgz", + "integrity": "sha512-7Tin0C8l86TkpcMtXvQu6saWH93nhG3dGQ1/+l5V2TDMceTxO7kDiK6GzbfLWNNxqJXm591PcEZUozZm51ogwQ==", + "bin": { + "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=10.12.0" - } - }, - "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==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/vite": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.7.tgz", - "integrity": "sha512-29pdXjk49xAP0QBr0xXqu2s5jiQIXNvE/xwd0vUizYT2Hzqe4BksNNoWllFVXJf4eLZ+UlVQmXfB4lWrc+t18g==", + "node_modules/rollup-plugin-visualizer": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.9.2.tgz", + "integrity": "sha512-waHktD5mlWrYFrhOLbti4YgQCn1uR24nYsNuXxg7LkPH8KdTXVWR9DNY1WU0QqokyMixVXJS4J04HNrVTMP01A==", "dependencies": { - "esbuild": "^0.15.9", - "postcss": "^8.4.18", - "resolve": "^1.22.1", - "rollup": "^2.79.1" + "open": "^8.4.0", + "picomatch": "^2.3.1", + "source-map": "^0.7.4", + "yargs": "^17.5.1" }, "bin": { - "vite": "bin/vite.js" + "rollup-plugin-visualizer": "dist/bin/cli.js" }, "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "node": ">=14" }, "peerDependencies": { - "@types/node": ">= 14", - "less": "*", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" + "rollup": "2.x || 3.x" }, "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { + "rollup": { "optional": true } } }, - "node_modules/vite-node": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.25.3.tgz", - "integrity": "sha512-0TyDFASTLJUOPRE5e5isyXXgM/fbTD6D37NKduk718l+Ih9FSwqaaHT5f0pIkJMXzyYT6zo4b4FA6pnGdoky3A==", + "node_modules/rollup-plugin-visualizer/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==", "dependencies": { - "debug": "^4.3.4", - "mlly": "^1.0.0", - "pathe": "^0.2.0", - "source-map": "^0.6.1", - "source-map-support": "^0.5.21", - "vite": "^3.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=v14.16.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" + "node": ">=12" } }, - "node_modules/vite-node/node_modules/pathe": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-0.2.0.tgz", - "integrity": "sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==" + "node_modules/rollup-plugin-visualizer/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/vite-plugin-checker": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/vite-plugin-checker/-/vite-plugin-checker-0.5.1.tgz", - "integrity": "sha512-NFiO1PyK9yGuaeSnJ7Whw9fnxLc1AlELnZoyFURnauBYhbIkx9n+PmIXxSFUuC9iFyACtbJQUAEuQi6yHs2Adg==", + "node_modules/rollup-plugin-visualizer/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dependencies": { - "@babel/code-frame": "^7.12.13", - "ansi-escapes": "^4.3.0", - "chalk": "^4.1.1", - "chokidar": "^3.5.1", - "commander": "^8.0.0", - "fast-glob": "^3.2.7", - "lodash.debounce": "^4.0.8", - "lodash.pick": "^4.4.0", - "npm-run-path": "^4.0.1", - "strip-ansi": "^6.0.0", - "tiny-invariant": "^1.1.0", - "vscode-languageclient": "^7.0.0", - "vscode-languageserver": "^7.0.0", - "vscode-languageserver-textdocument": "^1.0.1", - "vscode-uri": "^3.0.2" + "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": ">=14.16" - }, - "peerDependencies": { - "eslint": ">=7", - "typescript": "*", - "vite": "^2.0.0 || ^3.0.0-0", - "vls": "*", - "vti": "*" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - }, - "typescript": { - "optional": true - }, - "vls": { - "optional": true - }, - "vti": { - "optional": true - } + "node": ">=12" } }, - "node_modules/vite-plugin-checker/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==", - "dependencies": { - "type-fest": "^0.21.3" - }, + "node_modules/rollup-plugin-visualizer/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==", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/vite-plugin-checker/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/run-applescript": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "execa": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/vite-plugin-checker/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/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==", + "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": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "queue-microtask": "^1.2.2" } }, - "node_modules/vite-plugin-checker/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/safe-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "dev": true, "dependencies": { - "color-name": "~1.1.4" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" }, "engines": { - "node": ">=7.0.0" + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/vite-plugin-checker/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/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==" }, - "node_modules/vite-plugin-checker/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "engines": { - "node": ">= 12" + "node_modules/safe-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", + "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", + "dev": true, + "dependencies": { + "regexp-tree": "~0.1.1" } }, - "node_modules/vite-plugin-checker/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/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/vite-plugin-checker/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/sass": { + "version": "1.64.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.64.1.tgz", + "integrity": "sha512-16rRACSOFEE8VN7SCgBu1MpYCyN7urj9At898tyzdXFhC+a+yOX5dXwAR7L8/IdPJ1NB8OYoXmD55DM30B2kEQ==", "dependencies": { - "has-flag": "^4.0.0" + "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": ">=8" + "node": ">=14.0.0" } }, - "node_modules/vite-plugin-checker/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==", - "engines": { - "node": ">=10" + "node_modules/scule": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/scule/-/scule-1.0.0.tgz", + "integrity": "sha512-4AsO/FrViE/iDNEPaAQlb77tf0csuq27EsVpy6ett584EcRTp6pTDLoGWVxCD77y5iU5FauOvhsI4o1APwPoSQ==" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/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/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/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==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-placeholder": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/serve-placeholder/-/serve-placeholder-2.0.1.tgz", + "integrity": "sha512-rUzLlXk4uPFnbEaIz3SW8VISTxMuONas88nYWjAWaM2W9VDbt9tyFOr3lq8RhVOFrT3XISoBw8vni5una8qMnQ==", + "dependencies": { + "defu": "^6.0.0" + } + }, + "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/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==" + }, + "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==", + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==" + }, + "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/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "node_modules/site-config-stack": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/site-config-stack/-/site-config-stack-1.0.10.tgz", + "integrity": "sha512-sEKECSkg9XYrzs6ykKWbelxj/P/K8kUgKtWZdETTfLlnKl7e/0JsTS0UZf2Gu4aNEXWUwHrOxtZcvIa3ASYhHA==", + "dev": true, + "dependencies": { + "@nuxt/kit": "^3.6.5", + "defu": "^6.1.2", + "pkg-types": "^1.0.3", + "ufo": "^1.2.0" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + } + }, + "node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/smob": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/smob/-/smob-1.4.0.tgz", + "integrity": "sha512-MqR3fVulhjWuRNSMydnTlweu38UhQ0HXM4buStD/S3mc/BzX3CuM9OmhyQpmtYCvoYdl5ris6TI0ZqH355Ymqg==" + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "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==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.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==", + "dev": 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==", + "dev": 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==", + "dev": 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==", + "dev": true + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==" + }, + "node_modules/standard-as-callback": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", + "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==" + }, + "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/std-env": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.3.tgz", + "integrity": "sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==" + }, + "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_decoder/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/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.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "devOptional": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-literal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.0.1.tgz", + "integrity": "sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==", + "dependencies": { + "acorn": "^8.8.2" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/stylehacks": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.0.0.tgz", + "integrity": "sha512-+UT589qhHPwz6mTlCLSt/vMNTJx8dopeJlZAlBMJPWA3ORqu6wmQY7FBXf+qD+FsqoBJODyqNxOUP3jdntFRdw==", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "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==", + "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==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==" + }, + "node_modules/svgo": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.0.2.tgz", + "integrity": "sha512-Z706C1U2pb1+JGP48fbazf3KxHrWOsLme6Rv7imFBn5EnuanDW1GPaA/P1/dvObE670JDePC3mnj0k0B7P0jjQ==", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.2.1", + "csso": "^5.0.5", + "picocolors": "^1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/synckit": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", + "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", + "dev": true, + "dependencies": { + "@pkgr/utils": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "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==", + "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-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "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==" + }, + "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==", + "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==" + }, + "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==", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=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==", + "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/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==", + "devOptional": true + }, + "node_modules/tiny-invariant": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", + "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" + }, + "node_modules/tinybench": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.0.tgz", + "integrity": "sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==" + }, + "node_modules/tinypool": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.6.0.tgz", + "integrity": "sha512-FdswUUo5SxRizcBc6b1GSuLpLjisa8N8qMyYoP3rl+bym+QauhtJP5bvZY1ytt8krKGmMLYIRl36HBZfeAoqhQ==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.1.1.tgz", + "integrity": "sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/titleize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "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==", + "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/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tslib": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==", + "dev": true + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/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/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "devOptional": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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==", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.1.6", + "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" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.2.0.tgz", + "integrity": "sha512-RsPyTbqORDNDxqAdQPQBpgqhWle1VcTSou/FraClYlHf6TZnQcGslpLcAphNR+sQW4q5lLWLbOsRlh9j24baQg==" + }, + "node_modules/ultrahtml": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.3.0.tgz", + "integrity": "sha512-xmXvE8tC8t4PVqy0/g1fe7H9USY/Brr425q4dD/0QbQMQit7siCtb06+SCqE4GfU24nwsZz8Th1g7L7mm1lL5g==" + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/uncrypto": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz", + "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==" + }, + "node_modules/unctx": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unctx/-/unctx-2.3.1.tgz", + "integrity": "sha512-PhKke8ZYauiqh3FEMVNm7ljvzQiph0Mt3GBRve03IJm7ukfaON2OBK795tLwhbyfzknuRRkW0+Ze+CQUmzOZ+A==", + "dependencies": { + "acorn": "^8.8.2", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.0", + "unplugin": "^1.3.1" + } + }, + "node_modules/unctx/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/undici": { + "version": "5.28.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.2.tgz", + "integrity": "sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/unenv": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/unenv/-/unenv-1.5.2.tgz", + "integrity": "sha512-fpQW0nx3hGx0q0wq/35+ng9Dm4m1/2V00UmU5Jxdr1woyrMbT4RydQn5eh/hZyM81HKAPzaf50TKX0XfYpBaqg==", + "dependencies": { + "consola": "^3.2.3", + "defu": "^6.1.2", + "mime": "^3.0.0", + "node-fetch-native": "^1.2.0", + "pathe": "^1.1.1" + } + }, + "node_modules/unhead": { + "version": "1.1.32", + "resolved": "https://registry.npmjs.org/unhead/-/unhead-1.1.32.tgz", + "integrity": "sha512-WO1NTmljMZZzZjzmkcgZpYKpbEGGB3HC+2DIJxAZd0++WCPT9jD6o0MIgpA71UvueOCqLhIlyfGsa9Hgn0Gnog==", + "dependencies": { + "@unhead/dom": "1.1.32", + "@unhead/schema": "1.1.32", + "@unhead/shared": "1.1.32", + "hookable": "^5.5.3" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + } + }, + "node_modules/unimport": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/unimport/-/unimport-3.1.0.tgz", + "integrity": "sha512-ybK3NVWh30MdiqSyqakrrQOeiXyu5507tDA0tUf7VJHrsq4DM6S43gR7oAsZaFojM32hzX982Lqw02D3yf2aiA==", + "dependencies": { + "@rollup/pluginutils": "^5.0.2", + "escape-string-regexp": "^5.0.0", + "fast-glob": "^3.3.0", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.1", + "mlly": "^1.4.0", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "scule": "^1.0.0", + "strip-literal": "^1.0.1", + "unplugin": "^1.4.0" + } + }, + "node_modules/unimport/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==", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/unimport/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==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unimport/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==" + }, + "node_modules/unimport/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/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unplugin": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.4.0.tgz", + "integrity": "sha512-5x4eIEL6WgbzqGtF9UV8VEC/ehKptPXDS6L2b0mv4FRMkJxRtjaJfOWDd6a8+kYbqsjklix7yWP0N3SUepjXcg==", + "dependencies": { + "acorn": "^8.9.0", + "chokidar": "^3.5.3", + "webpack-sources": "^3.2.3", + "webpack-virtual-modules": "^0.5.0" + } + }, + "node_modules/unplugin-vue-router": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/unplugin-vue-router/-/unplugin-vue-router-0.6.4.tgz", + "integrity": "sha512-9THVhhtbVFxbsIibjK59oPwMI1UCxRWRPX7azSkTUABsxovlOXJys5SJx0kd/0oKIqNJuYgkRfAgPuO77SqCOg==", + "dependencies": { + "@babel/types": "^7.21.5", + "@rollup/pluginutils": "^5.0.2", + "@vue-macros/common": "^1.3.1", + "ast-walker-scope": "^0.4.1", + "chokidar": "^3.5.3", + "fast-glob": "^3.2.12", + "json5": "^2.2.3", + "local-pkg": "^0.4.3", + "mlly": "^1.2.0", + "pathe": "^1.1.0", + "scule": "^1.0.0", + "unplugin": "^1.3.1", + "yaml": "^2.2.2" + }, + "peerDependencies": { + "vue-router": "^4.1.0" + }, + "peerDependenciesMeta": { + "vue-router": { + "optional": true + } + } + }, + "node_modules/unplugin-vue-router/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==", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/unplugin-vue-router/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==" + }, + "node_modules/unplugin-vue-router/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/unstorage": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.8.0.tgz", + "integrity": "sha512-Wl6a0fYIIPx8yWIHAVNzsNRcIpagVnBV05UXeIFCNqPZ5tu0w0MPE+eTjpRe/yxCD60K7qX55K5Px/PeKvNntw==", + "dependencies": { + "anymatch": "^3.1.3", + "chokidar": "^3.5.3", + "destr": "^2.0.0", + "h3": "^1.7.1", + "ioredis": "^5.3.2", + "listhen": "^1.0.4", + "lru-cache": "^10.0.0", + "mri": "^1.2.0", + "node-fetch-native": "^1.2.0", + "ofetch": "^1.1.1", + "ufo": "^1.1.2" + }, + "peerDependencies": { + "@azure/app-configuration": "^1.4.1", + "@azure/cosmos": "^3.17.3", + "@azure/data-tables": "^13.2.2", + "@azure/identity": "^3.2.3", + "@azure/keyvault-secrets": "^4.7.0", + "@azure/storage-blob": "^12.14.0", + "@planetscale/database": "^1.7.0", + "@upstash/redis": "^1.21.0", + "@vercel/kv": "^0.2.2" + }, + "peerDependenciesMeta": { + "@azure/app-configuration": { + "optional": true + }, + "@azure/cosmos": { + "optional": true + }, + "@azure/data-tables": { + "optional": true + }, + "@azure/identity": { + "optional": true + }, + "@azure/keyvault-secrets": { + "optional": true + }, + "@azure/storage-blob": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/kv": { + "optional": true + } + } + }, + "node_modules/unstorage/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==", + "engines": { + "node": "14 || >=16.14" + } + }, + "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/untyped": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/untyped/-/untyped-1.3.2.tgz", + "integrity": "sha512-z219Z65rOGD6jXIvIhpZFfwWdqQckB8sdZec2NO+TkcH1Bph7gL0hwLzRJs1KsOo4Jz4mF9guBXhsEnyEBGVfw==", + "dependencies": { + "@babel/core": "^7.21.3", + "@babel/standalone": "^7.21.3", + "@babel/types": "^7.21.3", + "defu": "^6.1.2", + "jiti": "^1.18.2", + "mri": "^1.2.0", + "scule": "^1.0.0" + }, + "bin": { + "untyped": "dist/cli.mjs" + } + }, + "node_modules/upath": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", + "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "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==", + "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==", + "devOptional": true, + "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/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==", + "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/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==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vite": { + "version": "4.3.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz", + "integrity": "sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==", + "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/vite-node": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.33.0.tgz", + "integrity": "sha512-19FpHYbwWWxDr73ruNahC+vtEdza52kA90Qb3La98yZ0xULqV8A5JLNPUff0f5zID4984tW7l3DH2przTJUZSw==", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "mlly": "^1.4.0", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^3.0.0 || ^4.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": ">=v14.18.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite-plugin-checker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/vite-plugin-checker/-/vite-plugin-checker-0.6.1.tgz", + "integrity": "sha512-4fAiu3W/IwRJuJkkUZlWbLunSzsvijDf0eDN6g/MGh6BUK4SMclOTGbLJCPvdAcMOQvVmm8JyJeYLYd4//8CkA==", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "ansi-escapes": "^4.3.0", + "chalk": "^4.1.1", + "chokidar": "^3.5.1", + "commander": "^8.0.0", + "fast-glob": "^3.2.7", + "fs-extra": "^11.1.0", + "lodash.debounce": "^4.0.8", + "lodash.pick": "^4.4.0", + "npm-run-path": "^4.0.1", + "semver": "^7.5.0", + "strip-ansi": "^6.0.0", + "tiny-invariant": "^1.1.0", + "vscode-languageclient": "^7.0.0", + "vscode-languageserver": "^7.0.0", + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-uri": "^3.0.2" + }, + "engines": { + "node": ">=14.16" + }, + "peerDependencies": { + "eslint": ">=7", + "meow": "^9.0.0", + "optionator": "^0.9.1", + "stylelint": ">=13", + "typescript": "*", + "vite": ">=2.0.0", + "vls": "*", + "vti": "*", + "vue-tsc": ">=1.3.9" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + }, + "meow": { + "optional": true + }, + "optionator": { + "optional": true + }, + "stylelint": { + "optional": true + }, + "typescript": { + "optional": true + }, + "vls": { + "optional": true + }, + "vti": { + "optional": true + }, + "vue-tsc": { + "optional": true + } + } + }, + "node_modules/vite-plugin-checker/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/vite-plugin-checker/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/vite-plugin-checker/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/vite-plugin-checker/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/vite-plugin-checker/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/vite-plugin-checker/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/vite-plugin-checker/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=10" + } + }, + "node_modules/vite-plugin-checker/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vite-plugin-checker/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/vite-plugin-checker/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/vite-plugin-vuetify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vite-plugin-vuetify/-/vite-plugin-vuetify-1.0.0.tgz", - "integrity": "sha512-30+W6H//wjOegKCha4wQ3IS+JyXDE6IayL5cK5S4IrM7WIceV/WitnxljbPZHER+Jyl3BGIuYV6nofjMOfRO1g==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/vite-plugin-vuetify/-/vite-plugin-vuetify-1.0.2.tgz", + "integrity": "sha512-MubIcKD33O8wtgQXlbEXE7ccTEpHZ8nPpe77y9Wy3my2MWw/PgehP9VqTp92BLqr0R1dSL970Lynvisx3UxBFw==", "dependencies": { - "@vuetify/loader-shared": "^1.7.0", + "@vuetify/loader-shared": "^1.7.1", "debug": "^4.3.3", "upath": "^2.0.1" }, @@ -11039,48 +12324,414 @@ "node": ">=12" }, "peerDependencies": { - "vite": "^2.7.0 || ^3.0.0", + "vite": "^2.7.0 || ^3.0.0 || ^4.0.0", "vuetify": "^3.0.0-beta.4" } }, + "node_modules/vite/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" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/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" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/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" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/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" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/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" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/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" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/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" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/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" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/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" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/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" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/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" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/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" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/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" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/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" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/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" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/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": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/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" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/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" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/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" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/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" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/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" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/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" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "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" + } + }, "node_modules/vitest": { - "version": "0.29.8", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.29.8.tgz", - "integrity": "sha512-JIAVi2GK5cvA6awGpH0HvH/gEG9PZ0a/WoxdiV3PmqK+3CjQMf8c+J/Vhv4mdZ2nRyXFw66sAg6qz7VNkaHfDQ==", + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.33.0.tgz", + "integrity": "sha512-1CxaugJ50xskkQ0e969R/hW47za4YXDUfWJDxip1hwbnhUjYolpfUn2AMOulqG/Dtd9WYAtkHmM/m3yKVrEejQ==", "dependencies": { - "@types/chai": "^4.3.4", + "@types/chai": "^4.3.5", "@types/chai-subset": "^1.3.3", "@types/node": "*", - "@vitest/expect": "0.29.8", - "@vitest/runner": "0.29.8", - "@vitest/spy": "0.29.8", - "@vitest/utils": "0.29.8", - "acorn": "^8.8.1", + "@vitest/expect": "0.33.0", + "@vitest/runner": "0.33.0", + "@vitest/snapshot": "0.33.0", + "@vitest/spy": "0.33.0", + "@vitest/utils": "0.33.0", + "acorn": "^8.9.0", "acorn-walk": "^8.2.0", "cac": "^6.7.14", "chai": "^4.3.7", "debug": "^4.3.4", - "local-pkg": "^0.4.2", - "pathe": "^1.1.0", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.1", + "pathe": "^1.1.1", "picocolors": "^1.0.0", - "source-map": "^0.6.1", - "std-env": "^3.3.1", - "strip-literal": "^1.0.0", - "tinybench": "^2.3.1", - "tinypool": "^0.4.0", - "tinyspy": "^1.0.2", + "std-env": "^3.3.3", + "strip-literal": "^1.0.1", + "tinybench": "^2.5.0", + "tinypool": "^0.6.0", "vite": "^3.0.0 || ^4.0.0", - "vite-node": "0.29.8", + "vite-node": "0.33.0", "why-is-node-running": "^2.2.2" }, "bin": { "vitest": "vitest.mjs" }, "engines": { - "node": ">=v14.16.0" + "node": ">=v14.18.0" }, "funding": { - "url": "https://github.com/sponsors/antfu" + "url": "https://opencollective.com/vitest" }, "peerDependencies": { "@edge-runtime/vm": "*", @@ -11119,26 +12770,15 @@ } } }, - "node_modules/vitest/node_modules/vite-node": { - "version": "0.29.8", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.29.8.tgz", - "integrity": "sha512-b6OtCXfk65L6SElVM20q5G546yu10/kNrhg08afEoWlFRJXFq9/6glsvSVY+aI6YeC1tu2TtAqI2jHEQmOmsFw==", + "node_modules/vitest/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": { - "cac": "^6.7.14", - "debug": "^4.3.4", - "mlly": "^1.1.0", - "pathe": "^1.1.0", - "picocolors": "^1.0.0", - "vite": "^3.0.0 || ^4.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" + "@jridgewell/sourcemap-codec": "^1.4.15" }, "engines": { - "node": ">=v14.16.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" + "node": ">=12" } }, "node_modules/vscode-jsonrpc": { @@ -11162,10 +12802,21 @@ "vscode": "^1.52.0" } }, + "node_modules/vscode-languageclient/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/vscode-languageclient/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -11176,6 +12827,11 @@ "node": ">=10" } }, + "node_modules/vscode-languageclient/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/vscode-languageserver": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-7.0.0.tgz", @@ -11197,9 +12853,9 @@ } }, "node_modules/vscode-languageserver-textdocument": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.7.tgz", - "integrity": "sha512-bFJH7UQxlXT8kKeyiyu41r22jCZXG8kuuVVA33OEJn1diWOZK5n8zBSPZFHVBOu8kXZ6h0LIRhf5UnCo61J4Hg==" + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz", + "integrity": "sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==" }, "node_modules/vscode-languageserver-types": { "version": "3.16.0", @@ -11207,28 +12863,28 @@ "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==" }, "node_modules/vscode-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.6.tgz", - "integrity": "sha512-fmL7V1eiDBFRRnu+gfRWTzyPpNIHJTc4mWnFkwBUmO9U3KPgJAmTx7oxi2bl/Rh6HLdU7+4C9wlj0k2E4AdKFQ==" + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.7.tgz", + "integrity": "sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==" }, "node_modules/vue": { - "version": "3.2.45", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.45.tgz", - "integrity": "sha512-9Nx/Mg2b2xWlXykmCwiTUCWHbWIj53bnkizBxKai1g61f2Xit700A1ljowpTIM11e3uipOeiPcSqnmBg6gyiaA==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.4.tgz", + "integrity": "sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==", "dependencies": { - "@vue/compiler-dom": "3.2.45", - "@vue/compiler-sfc": "3.2.45", - "@vue/runtime-dom": "3.2.45", - "@vue/server-renderer": "3.2.45", - "@vue/shared": "3.2.45" + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-sfc": "3.3.4", + "@vue/runtime-dom": "3.3.4", + "@vue/server-renderer": "3.3.4", + "@vue/shared": "3.3.4" } }, "node_modules/vue-bundle-renderer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vue-bundle-renderer/-/vue-bundle-renderer-1.0.0.tgz", - "integrity": "sha512-43vCqTgaMXfHhtR8/VcxxWD1DgtzyvNc4wNyG5NKCIH19O1z5G9ZCRXTGEA2wifVec5PU82CkRLD2sTK9NkTdA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/vue-bundle-renderer/-/vue-bundle-renderer-1.0.3.tgz", + "integrity": "sha512-EfjX+5TTUl70bki9hPuVp+54JiZOvFIfoWBcfXsSwLzKEiDYyHNi5iX8srnqLIv3YRnvxgbntdcG1WPq0MvffQ==", "dependencies": { - "ufo": "^1.0.0" + "ufo": "^1.1.1" } }, "node_modules/vue-devtools-stub": { @@ -11237,9 +12893,9 @@ "integrity": "sha512-RutnB7X8c5hjq39NceArgXg28WZtZpGc3+J16ljMiYnFhKvd8hITxSWQSQ5bvldxMDU6gG5mkxl1MTQLXckVSQ==" }, "node_modules/vue-eslint-parser": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.1.0.tgz", - "integrity": "sha512-NGn/iQy8/Wb7RrRa4aRkokyCZfOUWk19OP5HP6JEozQFX5AoS/t+Z0ZN7FY4LlmWc4FNI922V7cvX28zctN8dQ==", + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.3.1.tgz", + "integrity": "sha512-Clr85iD2XFZ3lJ52/ppmUDG/spxQu6+MAeHXjjyI4I1NUYZ9xmenQp4N0oaHJhrA8OOxltCVxMRfANGa70vU0g==", "dev": true, "dependencies": { "debug": "^4.3.4", @@ -11261,9 +12917,9 @@ } }, "node_modules/vue-eslint-parser/node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.1.tgz", + "integrity": "sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", @@ -11271,15 +12927,21 @@ }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/vue-eslint-parser/node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/vue-eslint-parser/node_modules/estraverse": { @@ -11291,10 +12953,22 @@ "node": ">=4.0" } }, + "node_modules/vue-eslint-parser/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/vue-eslint-parser/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -11306,6 +12980,12 @@ "node": ">=10" } }, + "node_modules/vue-eslint-parser/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/vue-i18n": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.2.2.tgz", @@ -11323,6 +13003,43 @@ "vue": "^3.0.0" } }, + "node_modules/vue-i18n/node_modules/@intlify/core-base": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.2.2.tgz", + "integrity": "sha512-JjUpQtNfn+joMbrXvpR4hTF8iJQ2sEFzzK3KIESOx+f+uwIjgw20igOyaIdhfsVVBCds8ZM64MoeNSx+PHQMkA==", + "dependencies": { + "@intlify/devtools-if": "9.2.2", + "@intlify/message-compiler": "9.2.2", + "@intlify/shared": "9.2.2", + "@intlify/vue-devtools": "9.2.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/vue-i18n/node_modules/@intlify/devtools-if": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@intlify/devtools-if/-/devtools-if-9.2.2.tgz", + "integrity": "sha512-4ttr/FNO29w+kBbU7HZ/U0Lzuh2cRDhP8UlWOtV9ERcjHzuyXVZmjyleESK6eVP60tGC9QtQW9yZE+JeRhDHkg==", + "dependencies": { + "@intlify/shared": "9.2.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/vue-i18n/node_modules/@intlify/message-compiler": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.2.2.tgz", + "integrity": "sha512-IUrQW7byAKN2fMBe8z6sK6riG1pue95e5jfokn8hA5Q3Bqy4MBJ5lJAofUsawQJYHeoPJ7svMDyBaVJ4d0GTtA==", + "dependencies": { + "@intlify/shared": "9.2.2", + "source-map": "0.6.1" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/vue-i18n/node_modules/@intlify/shared": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.2.2.tgz", @@ -11341,11 +13058,11 @@ } }, "node_modules/vue-router": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.1.6.tgz", - "integrity": "sha512-DYWYwsG6xNPmLq/FmZn8Ip+qrhFEzA14EI12MsMgVxvHFDYvlr4NXpVF5hrRH1wVcDP8fGi5F4rxuJSl8/r+EQ==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.2.4.tgz", + "integrity": "sha512-9PISkmaCO02OzPVOMq2w82ilty6+xJmQrarYZDkjZBfl4RvYAlt4PKnEX21oW4KTtWfa9OuO/b3qk1Od3AEdCQ==", "dependencies": { - "@vue/devtools-api": "^6.4.5" + "@vue/devtools-api": "^6.5.0" }, "funding": { "url": "https://github.com/sponsors/posva" @@ -11358,20 +13075,21 @@ "version": "2.7.14", "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz", "integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==", - "dev": true, + "devOptional": true, "dependencies": { "de-indent": "^1.0.2", "he": "^1.2.0" } }, "node_modules/vue-tsc": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.0.13.tgz", - "integrity": "sha512-DORISA3Fu9595xbg5HQqUj4XZVvkyRkcZFJCkCt1CeN7tIMgVRQ8ow07AKcbuHoEkqg7OI4qLu1wyC/VH3o5Ug==", - "dev": true, + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.8.6.tgz", + "integrity": "sha512-8ffD4NGfwyATjw/s40Lw2EgB7L2/PAqnGlJBaVQLgblr3SU4EYdhJ67TNXXuDD8NMbDAFSM24V8i3ZIJgTs32Q==", + "devOptional": true, "dependencies": { - "@volar/vue-language-core": "1.0.13", - "@volar/vue-typescript": "1.0.13" + "@vue/language-core": "1.8.6", + "@vue/typescript": "1.8.6", + "semver": "^7.3.8" }, "bin": { "vue-tsc": "bin/vue-tsc.js" @@ -11380,10 +13098,43 @@ "typescript": "*" } }, + "node_modules/vue-tsc/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/vue-tsc/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, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vue-tsc/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/vuetify": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-3.0.1.tgz", - "integrity": "sha512-Vl4wYB4mCm6GFK6Q9KZDK+HM3YKI7md7BoUPwbgqZj4bkofjQ/8NVSRQQpTcwk0YoQrgw6qj0QaOtP5zitkS1Q==", + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-3.3.9.tgz", + "integrity": "sha512-Oh7iLYvhd99MyVqH8nrK5rai7t2R9ivuiZAZKE0sfP4x0MSYthXRPBqXi4Vy98R7MggNFaoMBDJ/hPscuRxnQA==", "engines": { "node": "^12.20 || >=14.13" }, @@ -11392,12 +13143,16 @@ "url": "https://github.com/sponsors/johnleider" }, "peerDependencies": { + "typescript": ">=4.7", "vite-plugin-vuetify": "^1.0.0-alpha.12", "vue": "^3.2.0", "vue-i18n": "^9.0.0", "webpack-plugin-vuetify": "^2.0.0-alpha.11" }, "peerDependenciesMeta": { + "typescript": { + "optional": true + }, "vite-plugin-vuetify": { "optional": true }, @@ -11409,14 +13164,6 @@ } } }, - "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/web-streams-polyfill": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", @@ -11482,6 +13229,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/why-is-node-running": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", @@ -11505,110 +13271,57 @@ "string-width": "^1.0.2 || 2 || 3 || 4" } }, - "node_modules/wide-align/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==" - }, - "node_modules/wide-align/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/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==", - "devOptional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/wrap-ansi": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.0.1.tgz", - "integrity": "sha512-QFF+ufAqhoYHvoHdajT/Po7KoXVBPXS2bgjIam5isfWJPfIOnQZ50JtUiVvCv/sjgacf3yRrt2ZKUZ/V4itN4g==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/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==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/wrap-ansi/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==", + "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": ">=12" + "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "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==", "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/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==" + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, - "node_modules/ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "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/xml-name-validator": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", @@ -11618,6 +13331,26 @@ "node": ">=12" } }, + "node_modules/xss": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.14.tgz", + "integrity": "sha512-og7TEJhXvn1a7kzZGQ7ETjdQVS2UfZyTlsEdDOqvQF7GoxNfY+0YLCzBy1kPdsDDx4QuNAonQPddpsn6Xl/7sw==", + "dependencies": { + "commander": "^2.20.3", + "cssfilter": "0.0.10" + }, + "bin": { + "xss": "bin/xss" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/xss/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/xxhashjs": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz", @@ -11635,14 +13368,15 @@ } }, "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "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, "engines": { "node": ">= 6" } @@ -11668,46 +13402,28 @@ } }, "node_modules/yargs": { - "version": "17.6.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", - "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dependencies": { - "cliui": "^8.0.1", + "cliui": "^7.0.2", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "string-width": "^4.2.3", + "string-width": "^4.2.0", "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==", + "yargs-parser": "^20.2.2" + }, "engines": { - "node": ">=12" + "node": ">=10" } }, - "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==" - }, - "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==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, + "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==", "engines": { - "node": ">=8" + "node": ">=10" } }, "node_modules/yocto-queue": { @@ -11721,6 +13437,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/zhead": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/zhead/-/zhead-2.0.10.tgz", + "integrity": "sha512-irug8fXNKjqazkA27cFQs7C6/ZD3qNiEzLC56kDyzQART/Z9GMGfg8h2i6fb9c8ZWnIx/QgOgFJxK3A/CYHG0g==", + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + } + }, "node_modules/zip-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", @@ -11736,332 +13460,318 @@ } }, "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "devOptional": true + }, "@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==", "requires": { - "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" } }, "@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==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "requires": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" } }, "@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==" + "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==" }, "@babel/core": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.0.tgz", - "integrity": "sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", + "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", "requires": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.0", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.21.0", - "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.0", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.9", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.8", + "@babel/types": "^7.22.5", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.2", - "semver": "^6.3.0" + "semver": "^6.3.1" } }, "@babel/eslint-parser": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.19.1.tgz", - "integrity": "sha512-AqNf2QWt1rtu2/1rLswy6CDP7H9Oh3mMhk177Y67Rg8d7RD9WfOLLv8CGn6tisFvS2htm86yIe1yLF6I1UDaGQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.23.3.tgz", + "integrity": "sha512-9bTuNlyx7oSstodm1cR1bECj4fkiknsDa1YniISkJemMY3DGhJNYBECbe6QD/q54mp2J8VO66jW3/7uP//iFCw==", "dev": true, "requires": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.0" + "semver": "^6.3.1" } }, "@babel/generator": { - "version": "7.21.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.1.tgz", - "integrity": "sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.5.tgz", + "integrity": "sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA==", "requires": { - "@babel/types": "^7.21.0", + "@babel/types": "^7.23.5", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } } }, "@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==", "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@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==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz", + "integrity": "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==", "requires": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.9", "lru-cache": "^5.1.1", - "semver": "^6.3.0" - }, - "dependencies": { - "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==", - "requires": { - "yallist": "^3.0.2" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - } + "semver": "^6.3.1" } }, "@babel/helper-create-class-features-plugin": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.2.tgz", - "integrity": "sha512-k22GoYRAHPYr9I+Gvy2ZQlAe5mGy8BqWst2wRt8cwIufWTxrsVshhIBvYNqC80N0GSFWTsqRVexOtfzlgOEDvA==", + "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==", "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.19.1", - "@babel/helper-split-export-declaration": "^7.18.6" + "@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.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" } }, "@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==" + "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==" }, "@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==", + "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==", "requires": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" } }, "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", - "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", + "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==", "requires": { - "@babel/types": "^7.18.9" + "@babel/types": "^7.22.5" } }, "@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==", + "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==", "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@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==", - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" + "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==", + "requires": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" } }, "@babel/helper-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==", "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@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==" + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==" }, "@babel/helper-replace-supers": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz", - "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", + "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.19.1", - "@babel/types": "^7.19.0" + "@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/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==", + "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==", + "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==", "requires": { - "@babel/types": "^7.20.2" + "@babel/types": "^7.22.5" } }, "@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.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==", "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@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==" + "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==" }, "@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.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==" }, "@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==" }, "@babel/helpers": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", - "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", + "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", "requires": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.6", + "@babel/types": "^7.22.5" } }, "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.2.tgz", - "integrity": "sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==" + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.5.tgz", + "integrity": "sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==" }, "@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==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@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==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", "requires": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-typescript": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.2.tgz", - "integrity": "sha512-jvS+ngBfrnTUBfOQq8NfGnSbF9BrqlR6hjJ2yVxMkmO5nL/cdifNbI30EfjRlN4g5wYWNnMPyj5Sa6R1pbLeag==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.9.tgz", + "integrity": "sha512-BnVR1CpKiuD0iobHPaM1iLvcwPYN2uVFAqoLVSpEDKWuOikoCv5HbKLxclhKYUXlWkX86DoZGtqI4XhbOsyrMg==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.20.2", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-typescript": "^7.20.0" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.9", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-typescript": "^7.22.5" } }, "@babel/standalone": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.21.2.tgz", - "integrity": "sha512-ySP/TJcyqMJVg1M/lmnPVi6L+F+IJpQ4+0lqtf723LERbk1N8/0JgLgm346cRAzfHaoXkLq/M/mJBd2uo25RBA==" + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.22.9.tgz", + "integrity": "sha512-RRUFpN2WiHaczMqIhmy7VoruvSw+c3NSq6BczondQ6elJXtKzr9cAWWsWWZvtZ/rYFQpoQlch5VxQe4aWTt8LA==" }, "@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" } }, "@babel/traverse": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.2.tgz", - "integrity": "sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw==", - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.1", - "@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.2", - "@babel/types": "^7.21.2", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.5.tgz", + "integrity": "sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w==", + "requires": { + "@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" } }, "@babel/types": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.2.tgz", - "integrity": "sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.5.tgz", + "integrity": "sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w==", "requires": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" } }, @@ -12071,23 +13781,178 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" }, "@cloudflare/kv-asset-handler": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.2.0.tgz", - "integrity": "sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.3.0.tgz", + "integrity": "sha512-9CB/MKf/wdvbfkUdfrj+OkEwZ5b7rws0eogJ4293h+7b6KX5toPwym+VQKmILafNB9YiehqY0DlNrDcDhdWHSQ==", "requires": { "mime": "^3.0.0" } }, + "@esbuild/android-arm": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.16.tgz", + "integrity": "sha512-gCHjjQmA8L0soklKbLKA6pgsLk1byULuHe94lkZDzcO3/Ta+bbeewJioEn1Fr7kgy9NWNFy/C+MrBwC6I/WCug==", + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.16.tgz", + "integrity": "sha512-wsCqSPqLz+6Ov+OM4EthU43DyYVVyfn15S4j1bJzylDpc1r1jZFFfJQNfDuT8SlgwuqpmpJXK4uPlHGw6ve7eA==", + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.16.tgz", + "integrity": "sha512-ldsTXolyA3eTQ1//4DS+E15xl0H/3DTRJaRL0/0PgkqDsI0fV/FlOtD+h0u/AUJr+eOTlZv4aC9gvfppo3C4sw==", + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.16.tgz", + "integrity": "sha512-aBxruWCII+OtluORR/KvisEw0ALuw/qDQWvkoosA+c/ngC/Kwk0lLaZ+B++LLS481/VdydB2u6tYpWxUfnLAIw==", + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.16.tgz", + "integrity": "sha512-6w4Dbue280+rp3LnkgmriS1icOUZDyPuZo/9VsuMUTns7SYEiOaJ7Ca1cbhu9KVObAWfmdjUl4gwy9TIgiO5eA==", + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.16.tgz", + "integrity": "sha512-x35fCebhe9s979DGKbVAwXUOcTmCIE32AIqB9CB1GralMIvxdnMLAw5CnID17ipEw9/3MvDsusj/cspYt2ZLNQ==", + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.16.tgz", + "integrity": "sha512-YM98f+PeNXF3GbxIJlUsj+McUWG1irguBHkszCIwfr3BXtXZsXo0vqybjUDFfu9a8Wr7uUD/YSmHib+EeGAFlg==", + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.16.tgz", + "integrity": "sha512-b5ABb+5Ha2C9JkeZXV+b+OruR1tJ33ePmv9ZwMeETSEKlmu/WJ45XTTG+l6a2KDsQtJJ66qo/hbSGBtk0XVLHw==", + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.16.tgz", + "integrity": "sha512-XIqhNUxJiuy+zsR77+H5Z2f7s4YRlriSJKtvx99nJuG5ATuJPjmZ9n0ANgnGlPCpXGSReFpgcJ7O3SMtzIFeiQ==", + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.16.tgz", + "integrity": "sha512-no+pfEpwnRvIyH+txbBAWtjxPU9grslmTBfsmDndj7bnBmr55rOo/PfQmRfz7Qg9isswt1FP5hBbWb23fRWnow==", + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.16.tgz", + "integrity": "sha512-Zbnczs9ZXjmo0oZSS0zbNlJbcwKXa/fcNhYQjahDs4Xg18UumpXG/lwM2lcSvHS3mTrRyCYZvJbmzYc4laRI1g==", + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.16.tgz", + "integrity": "sha512-YMF7hih1HVR/hQVa/ot4UVffc5ZlrzEb3k2ip0nZr1w6fnYypll9td2qcoMLvd3o8j3y6EbJM3MyIcXIVzXvQQ==", + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.16.tgz", + "integrity": "sha512-Wkz++LZ29lDwUyTSEnzDaaP5OveOgTU69q9IyIw9WqLRxM4BjTBjz9un4G6TOvehWpf/J3gYVFN96TjGHrbcNQ==", + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.16.tgz", + "integrity": "sha512-LFMKZ30tk78/mUv1ygvIP+568bwf4oN6reG/uczXnz6SvFn4e2QUFpUpZY9iSJT6Qpgstrhef/nMykIXZtZWGQ==", + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.16.tgz", + "integrity": "sha512-3ZC0BgyYHYKfZo3AV2/66TD/I9tlSBaW7eWTEIkrQQKfJIifKMMttXl9FrAg+UT0SGYsCRLI35Gwdmm96vlOjg==", + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.16.tgz", + "integrity": "sha512-xu86B3647DihHJHv/wx3NCz2Dg1gjQ8bbf9cVYZzWKY+gsvxYmn/lnVlqDRazObc3UMwoHpUhNYaZset4X8IPA==", + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.16.tgz", + "integrity": "sha512-uVAgpimx9Ffw3xowtg/7qQPwHFx94yCje+DoBx+LNm2ePDpQXHrzE+Sb0Si2VBObYz+LcRps15cq+95YM7gkUw==", + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.16.tgz", + "integrity": "sha512-6OjCQM9wf7z8/MBi6BOWaTL2AS/SZudsZtBziXMtNI8r/U41AxS9x7jn0ATOwVy08OotwkPqGRMkpPR2wcTJXA==", + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.16.tgz", + "integrity": "sha512-ZoNkruFYJp9d1LbUYCh8awgQDvB9uOMZqlQ+gGEZR7v6C+N6u7vPr86c+Chih8niBR81Q/bHOSKGBK3brJyvkQ==", + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.16.tgz", + "integrity": "sha512-+j4anzQ9hrs+iqO+/wa8UE6TVkKua1pXUb0XWFOx0FiAj6R9INJ+WE//1/Xo6FG1vB5EpH3ko+XcgwiDXTxcdw==", + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.16.tgz", + "integrity": "sha512-5PFPmq3sSKTp9cT9dzvI67WNfRZGvEVctcZa1KGjDDu4n3H8k59Inbk0du1fz0KrAbKKNpJbdFXQMDUz7BG4rQ==", + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.16.tgz", + "integrity": "sha512-sCIVrrtcWN5Ua7jYXNG1xD199IalrbfV2+0k/2Zf2OyV2FtnQnMgdzgpRAbi4AWlKJj1jkX+M+fEGPQj6BQB4w==", + "optional": true + }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "devOptional": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "devOptional": true + } + } + }, + "@eslint-community/regexpp": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.0.tgz", + "integrity": "sha512-uiPeRISaglZnaZk8vwrjQZ1CxogZeY/4IYft6gBOTqu1WhVXWmCmZMWxUv2Q/pxSvPdp1JPaO62kLOcOkMqWrw==", + "devOptional": true + }, "@eslint/eslintrc": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", - "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", + "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", "devOptional": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.15.0", + "espree": "^9.6.0", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -12096,9 +13961,9 @@ }, "dependencies": { "globals": { - "version": "13.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz", - "integrity": "sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==", + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "devOptional": true, "requires": { "type-fest": "^0.20.2" @@ -12112,10 +13977,21 @@ } } }, + "@eslint/js": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", + "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", + "devOptional": true + }, + "@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==" + }, "@humanwhocodes/config-array": { - "version": "0.11.7", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", - "integrity": "sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==", + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", "devOptional": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", @@ -12142,103 +14018,152 @@ "dev": true }, "@iconify/vue": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@iconify/vue/-/vue-4.0.1.tgz", - "integrity": "sha512-k4VwcSQpGqJpoyqENRRviFuXlVcquLvQ6BKLNJ6o2amZo7u+3HyALSO79Xyz7Sg68szQGstOk6weaKUF0DJbog==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@iconify/vue/-/vue-4.1.1.tgz", + "integrity": "sha512-RL85Bm/DAe8y6rT6pux7D2FJSiUEM/TPfyK7GrbAOfTSwrhvwJW+S5yijdGcmtXouA8MtuH9C7l4hiSE4mLMjg==", "dev": true, "requires": { "@iconify/types": "^2.0.0" } }, "@intlify/bundle-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@intlify/bundle-utils/-/bundle-utils-4.0.0.tgz", - "integrity": "sha512-klXrYT9VXyKEXsD6UY3pShg0O5MPC07n0TZ5RrSs5ry6T1eZVolIFGJi9c3qcDrh1qjJxgikRnPBmD7qGDqbjw==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@intlify/bundle-utils/-/bundle-utils-7.0.2.tgz", + "integrity": "sha512-8wbx9xhbawBFTE5LPTECiK26RRqrNS31jyWSur72ZXZZ4it5jiZTcG6eUJlNirr4+jXYio2DGY299JsGVT4cpw==", "dev": true, "requires": { - "@intlify/message-compiler": "next", - "@intlify/shared": "next", + "@intlify/message-compiler": "9.3.0-beta.24", + "@intlify/shared": "9.3.0-beta.24", + "acorn": "^8.8.2", + "escodegen": "^2.0.0", + "estree-walker": "^2.0.2", "jsonc-eslint-parser": "^1.0.1", - "source-map": "0.6.1", + "magic-string": "^0.30.0", + "mlly": "^1.2.0", + "source-map-js": "^1.0.1", "yaml-eslint-parser": "^0.3.2" + }, + "dependencies": { + "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 + }, + "magic-string": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", + "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", + "dev": true, + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + } } }, "@intlify/core-base": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.2.2.tgz", - "integrity": "sha512-JjUpQtNfn+joMbrXvpR4hTF8iJQ2sEFzzK3KIESOx+f+uwIjgw20igOyaIdhfsVVBCds8ZM64MoeNSx+PHQMkA==", + "version": "9.3.0-beta.22", + "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.3.0-beta.22.tgz", + "integrity": "sha512-Mf+jyneuQxNW7pqLErIzorYrLjWGEGoPDVFrKVQNahdUDnXL/QA0CpvcAltX+Xdmgep+cVMrGD6x99hIF1BfQA==", "requires": { - "@intlify/devtools-if": "9.2.2", - "@intlify/message-compiler": "9.2.2", - "@intlify/shared": "9.2.2", - "@intlify/vue-devtools": "9.2.2" + "@intlify/devtools-if": "9.3.0-beta.22", + "@intlify/message-compiler": "9.3.0-beta.22", + "@intlify/shared": "9.3.0-beta.22", + "@intlify/vue-devtools": "9.3.0-beta.22" }, "dependencies": { "@intlify/message-compiler": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.2.2.tgz", - "integrity": "sha512-IUrQW7byAKN2fMBe8z6sK6riG1pue95e5jfokn8hA5Q3Bqy4MBJ5lJAofUsawQJYHeoPJ7svMDyBaVJ4d0GTtA==", + "version": "9.3.0-beta.22", + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.3.0-beta.22.tgz", + "integrity": "sha512-6X5h2v+RRixdB8qC4QZJpao4/sAP7l1nULK17/m0HuZZcTwWhjXvfSft88UCPHCTSj8rQp8Syr7ksKVhgIteKw==", "requires": { - "@intlify/shared": "9.2.2", - "source-map": "0.6.1" + "@intlify/shared": "9.3.0-beta.22", + "source-map-js": "^1.0.2" } }, "@intlify/shared": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.2.2.tgz", - "integrity": "sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==" + "version": "9.3.0-beta.22", + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.3.0-beta.22.tgz", + "integrity": "sha512-GS+OHgYcHaq7a+zC1dlVvEHUYHVPKPC/tV3OmFyKJ2Lm7qAFmX29MQn9WOG4WtUme86tPp5LRFz6mYL5VQUJqQ==" + }, + "@intlify/vue-devtools": { + "version": "9.3.0-beta.22", + "resolved": "https://registry.npmjs.org/@intlify/vue-devtools/-/vue-devtools-9.3.0-beta.22.tgz", + "integrity": "sha512-Qd0kKXsWe1DagjdebFgpbSYe2eWi1rs6fROg8pTbCSqyvOMqsscxMu+Tl+MiXYrZxkfXisR0BefONO7Zpi8UbQ==", + "requires": { + "@intlify/core-base": "9.3.0-beta.22", + "@intlify/shared": "9.3.0-beta.22" + } } } }, "@intlify/devtools-if": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/@intlify/devtools-if/-/devtools-if-9.2.2.tgz", - "integrity": "sha512-4ttr/FNO29w+kBbU7HZ/U0Lzuh2cRDhP8UlWOtV9ERcjHzuyXVZmjyleESK6eVP60tGC9QtQW9yZE+JeRhDHkg==", + "version": "9.3.0-beta.22", + "resolved": "https://registry.npmjs.org/@intlify/devtools-if/-/devtools-if-9.3.0-beta.22.tgz", + "integrity": "sha512-9HPcF1wFaH/D++SqUCNQMWBtg+2v2+BLRxuwzgR9d9UGv7iRLZFPtxt51S4epCQdyg3z6GruTRzTJhThUgzTAA==", "requires": { - "@intlify/shared": "9.2.2" + "@intlify/shared": "9.3.0-beta.22" }, "dependencies": { "@intlify/shared": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.2.2.tgz", - "integrity": "sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==" + "version": "9.3.0-beta.22", + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.3.0-beta.22.tgz", + "integrity": "sha512-GS+OHgYcHaq7a+zC1dlVvEHUYHVPKPC/tV3OmFyKJ2Lm7qAFmX29MQn9WOG4WtUme86tPp5LRFz6mYL5VQUJqQ==" } } }, "@intlify/message-compiler": { - "version": "9.3.0-beta.16", - "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.3.0-beta.16.tgz", - "integrity": "sha512-CGQI3xRcs1ET75eDQ0DUy3MRYOqTauRIIgaMoISKiF83gqRWg93FqN8lGMKcpBqaF4tI0JhsfosCaGiBL9+dnw==", + "version": "9.3.0-beta.24", + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.3.0-beta.24.tgz", + "integrity": "sha512-prhHATkgp0mpPqoVgiAtLmUc1JMvs8fMH6w53AVEBn+VF87dLhzanfmWY5FoZWORG51ag54gBDBOoM/VFv3m3A==", "dev": true, "requires": { - "@intlify/shared": "9.3.0-beta.16", - "source-map": "0.6.1" + "@intlify/shared": "9.3.0-beta.24", + "source-map-js": "^1.0.2" } }, "@intlify/shared": { - "version": "9.3.0-beta.16", - "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.3.0-beta.16.tgz", - "integrity": "sha512-kXbm4svALe3lX+EjdJxfnabOphqS4yQ1Ge/iIlR8tvUiYRCoNz3hig1M4336iY++Dfx5ytEQJPNjIcknNIuvig==", - "dev": true + "version": "9.3.0-beta.24", + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.3.0-beta.24.tgz", + "integrity": "sha512-AKxJ8s7eKIQWkNaf4wyyoLRwf4puCuQgjSChlDJm5JBEt6T8HGgnYTJLRXu6LD/JACn3Qwu6hM/XRX1c9yvjmQ==" }, "@intlify/unplugin-vue-i18n": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/@intlify/unplugin-vue-i18n/-/unplugin-vue-i18n-0.8.2.tgz", - "integrity": "sha512-cRnzPqSEZQOmTD+p4pwc3RTS9HxreLqfID0keoqZDZweCy/CGRMLLTNd15S4TUf1vSBhPF03DItEFDr1F+8MDA==", + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@intlify/unplugin-vue-i18n/-/unplugin-vue-i18n-0.12.2.tgz", + "integrity": "sha512-IIgzLRSPUKZM1FBdUAZ9NwVPiLUr4ea5g/HLWe2lB7gNtPDz4FOfUNUllIT504hT+3pDoJmjaYJ6pyqT7F4Wuw==", "dev": true, "requires": { - "@intlify/bundle-utils": "^4.0.0", - "@intlify/shared": "next", - "@rollup/pluginutils": "^4.2.0", - "@vue/compiler-sfc": "^3.2.45", - "debug": "^4.3.1", - "fast-glob": "^3.2.5", + "@intlify/bundle-utils": "^7.0.2", + "@intlify/shared": "9.3.0-beta.24", + "@rollup/pluginutils": "^5.0.2", + "@vue/compiler-sfc": "^3.2.47", + "debug": "^4.3.3", + "fast-glob": "^3.2.12", "js-yaml": "^4.1.0", - "json5": "^2.2.0", + "json5": "^2.2.3", "pathe": "^1.0.0", "picocolors": "^1.0.0", - "source-map": "0.6.1", - "unplugin": "^1.0.0" + "source-map-js": "^1.0.2", + "unplugin": "^1.1.0" + }, + "dependencies": { + "@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" + } + }, + "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 + } } }, "@intlify/vue-devtools": { @@ -12250,6 +14175,34 @@ "@intlify/shared": "9.2.2" }, "dependencies": { + "@intlify/core-base": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.2.2.tgz", + "integrity": "sha512-JjUpQtNfn+joMbrXvpR4hTF8iJQ2sEFzzK3KIESOx+f+uwIjgw20igOyaIdhfsVVBCds8ZM64MoeNSx+PHQMkA==", + "requires": { + "@intlify/devtools-if": "9.2.2", + "@intlify/message-compiler": "9.2.2", + "@intlify/shared": "9.2.2", + "@intlify/vue-devtools": "9.2.2" + } + }, + "@intlify/devtools-if": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@intlify/devtools-if/-/devtools-if-9.2.2.tgz", + "integrity": "sha512-4ttr/FNO29w+kBbU7HZ/U0Lzuh2cRDhP8UlWOtV9ERcjHzuyXVZmjyleESK6eVP60tGC9QtQW9yZE+JeRhDHkg==", + "requires": { + "@intlify/shared": "9.2.2" + } + }, + "@intlify/message-compiler": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.2.2.tgz", + "integrity": "sha512-IUrQW7byAKN2fMBe8z6sK6riG1pue95e5jfokn8hA5Q3Bqy4MBJ5lJAofUsawQJYHeoPJ7svMDyBaVJ4d0GTtA==", + "requires": { + "@intlify/shared": "9.2.2", + "source-map": "0.6.1" + } + }, "@intlify/shared": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.2.2.tgz", @@ -12267,13 +14220,22 @@ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==" }, + "@jest/schemas": { + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", + "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", + "requires": { + "@sinclair/typebox": "^0.27.8" + } + }, "@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==", "requires": { - "@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" } }, "@jridgewell/resolve-uri": { @@ -12287,44 +14249,39 @@ "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" }, "@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "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==", "requires": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } } }, "@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==" + "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.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", "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==" + } } }, "@mapbox/node-pre-gyp": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", - "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", "requires": { "detect-libc": "^2.0.0", "https-proxy-agent": "^5.0.0", @@ -12337,34 +14294,56 @@ "tar": "^6.1.11" }, "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", "requires": { "whatwg-url": "^5.0.0" } }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "requires": { "lru-cache": "^6.0.0" } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, "@mdi/font": { - "version": "7.0.96", - "resolved": "https://registry.npmjs.org/@mdi/font/-/font-7.0.96.tgz", - "integrity": "sha512-rzlxTfR64hqY8yiBzDjmANfcd8rv+T5C0Yedv/TWk2QyAQYdc66e0kaN1ipmnYU3RukHRTRcBARHzzm+tIhL7w==", + "version": "7.2.96", + "resolved": "https://registry.npmjs.org/@mdi/font/-/font-7.2.96.tgz", + "integrity": "sha512-e//lmkmpFUMZKhmCY9zdjRe4zNXfbOIJnn6xveHbaV2kSw5aJ5dLXUxcRt1Gxfi7ZYpFLUWlkG2MGSFAiqAu7w==", "dev": true }, + "@mizchi/sucrase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@mizchi/sucrase/-/sucrase-4.1.0.tgz", + "integrity": "sha512-AaN8HSGdXmNqEqIb0IQPIQL+MI/8Xr1QTOcVnA6k0u2afqfYhlre05hSxRybOFpq34oF8EqMTrYovYZxEV1FLw==", + "dev": true, + "requires": { + "lines-and-columns": "^1.1.6" + } + }, "@netlify/functions": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@netlify/functions/-/functions-1.3.0.tgz", - "integrity": "sha512-hN/Fgpz8XIOBfsBPLYUMxVKBlCopgeqGB0popayicnmkFLnvKByTTMYgF01wcF9DBtBQdV0H2h1kPFpMl34I8w==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@netlify/functions/-/functions-1.6.0.tgz", + "integrity": "sha512-6G92AlcpFrQG72XU8YH8pg94eDnq7+Q0YJhb8x4qNpdGsvuzvrfHWBmqFGp/Yshmv4wex9lpsTRZOocdrA2erQ==", "requires": { "is-promise": "^4.0.0" } @@ -12397,152 +14376,248 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@nuxt/devalue": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@nuxt/devalue/-/devalue-2.0.2.tgz", + "integrity": "sha512-GBzP8zOc7CGWyFQS6dv1lQz8VVpz5C2yRszbXufwG/9zhStTIH50EtD87NmWbTMwXDvZLNg8GIpb1UFdH93JCA==" + }, + "@nuxt/devtools-kit": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@nuxt/devtools-kit/-/devtools-kit-0.7.4.tgz", + "integrity": "sha512-+CKSSqalyW3elK364FamcHtXm6F03Iarfs9ftBiWmj3CdCTuv9aGpJFi0FKzXKzq/xlCtbWvIrqcaf2Iy//6NQ==", + "dev": true, + "requires": { + "@nuxt/kit": "^3.6.5", + "@nuxt/schema": "^3.6.5", + "execa": "^7.2.0" + }, + "dependencies": { + "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, + "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" + } + }, + "human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true + }, + "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 + }, + "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 + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "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 + } } }, - "@nuxt/devalue": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@nuxt/devalue/-/devalue-2.0.0.tgz", - "integrity": "sha512-YBI/6o2EBz02tdEJRBK8xkt3zvOFOWlLBf7WKYGBsSYSRtjjgrqPe2skp6VLLmKx5WbHHDNcW+6oACaurxGzeA==" - }, "@nuxt/kit": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-3.0.0.tgz", - "integrity": "sha512-7ZsOLt5s9a0ZleAIzmoD70JwkZf5ti6bDdxl6f8ew7Huxz+ni/oRfTPTX9TrORXsgW5CvDt6Q9M7IJNPkAN/Iw==", + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-3.6.5.tgz", + "integrity": "sha512-uBI5I2Zx6sk+vRHU+nBmifwxg/nyXCGZ1g5hUKrUfgv1ZfiKB8JkN5T9iRoduDOaqbwM6XSnEl1ja73iloDcrw==", "requires": { - "@nuxt/schema": "3.0.0", - "c12": "^1.0.1", - "consola": "^2.15.3", - "defu": "^6.1.1", - "globby": "^13.1.2", + "@nuxt/schema": "3.6.5", + "c12": "^1.4.2", + "consola": "^3.2.3", + "defu": "^6.1.2", + "globby": "^13.2.2", "hash-sum": "^2.0.0", - "ignore": "^5.2.0", - "jiti": "^1.16.0", + "ignore": "^5.2.4", + "jiti": "^1.19.1", "knitwork": "^1.0.0", - "lodash.template": "^4.5.0", - "mlly": "^1.0.0", - "pathe": "^1.0.0", - "pkg-types": "^1.0.1", + "mlly": "^1.4.0", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", "scule": "^1.0.0", - "semver": "^7.3.8", - "unctx": "^2.1.0", - "unimport": "^1.0.1", - "untyped": "^1.0.0" + "semver": "^7.5.3", + "unctx": "^2.3.1", + "unimport": "^3.0.14", + "untyped": "^1.3.2" }, "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "requires": { "lru-cache": "^6.0.0" } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, "@nuxt/schema": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@nuxt/schema/-/schema-3.0.0.tgz", - "integrity": "sha512-5fwsidhs5NjFzR8sIzHMXO0WFGkI3tCH3ViANn2W4N5qCwoYZ0n1sZBkQ9Esn1VoEed6RsIlTpWrPZPVtqNkGQ==", + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/@nuxt/schema/-/schema-3.6.5.tgz", + "integrity": "sha512-UPUnMB0W5TZ/Pi1fiF71EqIsPlj8LGZqzhSf8wOeh538KHwxbA9r7cuvEUU92eXRksOZaylbea3fJxZWhOITVw==", "requires": { - "c12": "^1.0.1", - "create-require": "^1.1.1", - "defu": "^6.1.1", - "jiti": "^1.16.0", - "pathe": "^1.0.0", - "pkg-types": "^1.0.1", + "defu": "^6.1.2", + "hookable": "^5.5.3", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", "postcss-import-resolver": "^2.0.0", - "scule": "^1.0.0", - "std-env": "^3.3.1", - "ufo": "^1.0.0", - "unimport": "^1.0.1", - "untyped": "^1.0.0" + "std-env": "^3.3.3", + "ufo": "^1.1.2", + "unimport": "^3.0.14", + "untyped": "^1.3.2" } }, "@nuxt/telemetry": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@nuxt/telemetry/-/telemetry-2.1.8.tgz", - "integrity": "sha512-WCHRrcPKRosuHQi8CD5WfjiXGAyjOWVJpK77xS6wlg8zwziBPCqmVIQdr4QpFTGFO1Nrh4z26l1VnivKy22KFQ==", - "requires": { - "@nuxt/kit": "^3.0.0-rc.14", - "chalk": "^5.1.2", - "ci-info": "^3.6.1", - "consola": "^2.15.3", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@nuxt/telemetry/-/telemetry-2.3.2.tgz", + "integrity": "sha512-S2sF4hLQWS48lWPpRT8xqVUFuwFGTgeKvojp8vL/iP79fWxudua2DWXR15T8C2zpauYwNgEpEWJmy6vxY2ZQeg==", + "requires": { + "@nuxt/kit": "^3.6.5", + "chalk": "^5.3.0", + "ci-info": "^3.8.0", + "consola": "^3.2.3", "create-require": "^1.1.1", - "defu": "^6.1.1", - "destr": "^1.2.1", - "dotenv": "^16.0.3", - "fs-extra": "^10.1.0", + "defu": "^6.1.2", + "destr": "^2.0.0", + "dotenv": "^16.3.1", + "fs-extra": "^11.1.1", "git-url-parse": "^13.1.0", - "inquirer": "^9.1.4", "is-docker": "^3.0.0", - "jiti": "^1.16.0", + "jiti": "^1.19.1", "mri": "^1.2.0", - "nanoid": "^4.0.0", - "node-fetch": "^3.3.0", - "ohmyfetch": "^0.4.21", + "nanoid": "^4.0.2", + "node-fetch": "^3.3.1", + "ofetch": "^1.1.1", "parse-git-config": "^3.0.0", - "rc9": "^2.0.0", - "std-env": "^3.3.1" + "rc9": "^2.1.1", + "std-env": "^3.3.3" }, "dependencies": { "chalk": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.1.2.tgz", - "integrity": "sha512-E5CkT4jWURs1Vy5qGJye+XwCkNj7Od3Af7CP6SujMetSMkLs8Do2RWJK5yx1wamHV/op8Rz+9rltjaTQWDnEFQ==" + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==" } } }, "@nuxt/ui-templates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@nuxt/ui-templates/-/ui-templates-1.0.0.tgz", - "integrity": "sha512-jfpVHxi1AHfNO3D6iD1RJE6fx/7cAzekvG90poIzVawp/L+I4DNdy8pCgqBScJW4bfWOpHeLYbtQQlL/hPmkjw==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@nuxt/ui-templates/-/ui-templates-1.2.0.tgz", + "integrity": "sha512-MSZza7dxccNb/p7nuzGF8/m4POaFpHzVhNdR7f4xahOpH7Ja02lFeYR+rHtoHIJC0yym4qriqv0mQ+Qf/R61bQ==" }, "@nuxt/vite-builder": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@nuxt/vite-builder/-/vite-builder-3.0.0.tgz", - "integrity": "sha512-eMnpPpjHU8rGZcsJUksCuSX+6dpId03q8LOSStsm6rXzrNJtZIcwt0nBRTUaigckXIozX8ZNl5u2OPGUfUbMrw==", - "requires": { - "@nuxt/kit": "3.0.0", - "@rollup/plugin-replace": "^5.0.1", - "@vitejs/plugin-vue": "^3.2.0", - "@vitejs/plugin-vue-jsx": "^2.1.1", - "autoprefixer": "^10.4.13", - "chokidar": "^3.5.3", - "cssnano": "^5.1.14", - "defu": "^6.1.1", - "esbuild": "^0.15.14", + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/@nuxt/vite-builder/-/vite-builder-3.6.5.tgz", + "integrity": "sha512-pwSpt257ApCp3XWUs8vrC7X9QHeHUv5PbbIR3+5w0n5f95XPNOQWDJa2fTPX/H6oaRJCPYAsBPqiQhQ7qW/NZQ==", + "requires": { + "@nuxt/kit": "3.6.5", + "@rollup/plugin-replace": "^5.0.2", + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^3.0.1", + "autoprefixer": "^10.4.14", + "clear": "^0.1.0", + "consola": "^3.2.3", + "cssnano": "^6.0.1", + "defu": "^6.1.2", + "esbuild": "^0.18.11", "escape-string-regexp": "^5.0.0", - "estree-walker": "^3.0.1", - "externality": "^1.0.0", - "fs-extra": "^10.1.0", - "get-port-please": "^2.6.1", - "h3": "^1.0.1", + "estree-walker": "^3.0.3", + "externality": "^1.0.2", + "fs-extra": "^11.1.1", + "get-port-please": "^3.0.1", + "h3": "^1.7.1", "knitwork": "^1.0.0", - "magic-string": "^0.26.7", - "mlly": "^1.0.0", - "ohash": "^1.0.0", - "pathe": "^1.0.0", - "perfect-debounce": "^0.1.3", - "pkg-types": "^1.0.1", - "postcss": "^8.4.19", - "postcss-import": "^15.0.0", + "magic-string": "^0.30.1", + "mlly": "^1.4.0", + "ohash": "^1.1.2", + "pathe": "^1.1.1", + "perfect-debounce": "^1.0.0", + "pkg-types": "^1.0.3", + "postcss": "^8.4.24", + "postcss-import": "^15.1.0", "postcss-url": "^10.1.3", - "rollup": "^2.79.1", - "rollup-plugin-visualizer": "^5.8.3", - "ufo": "^1.0.0", - "unplugin": "^1.0.0", - "vite": "~3.2.4", - "vite-node": "^0.25.2", - "vite-plugin-checker": "^0.5.1", - "vue-bundle-renderer": "^1.0.0" + "rollup-plugin-visualizer": "^5.9.2", + "std-env": "^3.3.3", + "strip-literal": "^1.0.1", + "ufo": "^1.1.2", + "unplugin": "^1.3.2", + "vite": "~4.3.9", + "vite-node": "^0.33.0", + "vite-plugin-checker": "^0.6.1", + "vue-bundle-renderer": "^1.0.3" }, "dependencies": { "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==" + }, + "magic-string": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", + "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } } } }, @@ -12577,299 +14652,67 @@ } }, "@nuxtjs/i18n": { - "version": "8.0.0-beta.10", - "resolved": "https://registry.npmjs.org/@nuxtjs/i18n/-/i18n-8.0.0-beta.10.tgz", - "integrity": "sha512-a7xcWKSJvABxF6O7W7MKscyT3OJxaKpBQZ84PGuTop9YrlBFkTV+bUQX3cayQqd0EYVLjgdE9R0uri5JMIVQWQ==", + "version": "8.0.0-beta.13", + "resolved": "https://registry.npmjs.org/@nuxtjs/i18n/-/i18n-8.0.0-beta.13.tgz", + "integrity": "sha512-h0OqoSSdD9MGCXYZIDpYgQNN90r7MQ/sKVtyBQnrpGQLh1pqI7uLXoAVz4l4r09JzE2nNXK5U0thcx7Tq7ONUg==", "dev": true, "requires": { - "@intlify/bundle-utils": "^4.0.0", - "@intlify/shared": "9.3.0-beta.16", - "@intlify/unplugin-vue-i18n": "^0.8.1", - "@nuxt/kit": "^3.1.2", - "@vue/compiler-sfc": "^3.2.47", + "@intlify/bundle-utils": "^7.0.1", + "@intlify/shared": "9.3.0-beta.22", + "@intlify/unplugin-vue-i18n": "^0.12.1", + "@mizchi/sucrase": "^4.1.0", + "@nuxt/kit": "^3.4.1", + "@vue/compiler-sfc": "^3.3.4", "cookie-es": "^0.5.0", "debug": "^4.3.4", - "estree-walker": "^3.0.1", + "defu": "^6.1.2", + "estree-walker": "^3.0.3", "is-https": "^4.0.0", - "js-cookie": "^3.0.1", + "js-cookie": "^3.0.5", "knitwork": "^1.0.0", "magic-string": "^0.27.0", - "mlly": "^1.1.0", - "pathe": "^1.1.0", - "pkg-types": "^1.0.1", - "ufo": "^1.0.1", - "unplugin": "^1.0.1", - "vue-i18n": "9.3.0-beta.16", - "vue-i18n-routing": "^0.12.2" + "mlly": "^1.4.0", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "ufo": "^1.1.2", + "unplugin": "^1.3.2", + "unstorage": "^1.5.0", + "vue-i18n": "9.3.0-beta.22", + "vue-i18n-routing": "^0.13.0" }, "dependencies": { - "@intlify/core-base": { - "version": "9.3.0-beta.16", - "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.3.0-beta.16.tgz", - "integrity": "sha512-BoAxVoPIJoPKCCMdsuNXKaaJxvetvHrW2KA43IpkwgPd2/w6zPebh/+v8e4zpXKjFVSgcF97zP87KeVcM/Lxwg==", - "dev": true, - "requires": { - "@intlify/devtools-if": "9.3.0-beta.16", - "@intlify/message-compiler": "9.3.0-beta.16", - "@intlify/shared": "9.3.0-beta.16", - "@intlify/vue-devtools": "9.3.0-beta.16" - } - }, - "@intlify/devtools-if": { - "version": "9.3.0-beta.16", - "resolved": "https://registry.npmjs.org/@intlify/devtools-if/-/devtools-if-9.3.0-beta.16.tgz", - "integrity": "sha512-9WXn8YMAnL/DHdoWqCy6yLTXcLFxd8eXB9UNsViQA5JJV7neR+yahr+23X1wP0prhG338MruxAu65khRf+AJCw==", - "dev": true, - "requires": { - "@intlify/shared": "9.3.0-beta.16" - } - }, - "@intlify/vue-devtools": { - "version": "9.3.0-beta.16", - "resolved": "https://registry.npmjs.org/@intlify/vue-devtools/-/vue-devtools-9.3.0-beta.16.tgz", - "integrity": "sha512-rQ/jSW0gBciYLBBi+XN65r80B59Ypege9oqUi+EZ2QpOaK54wDcy1xq9w6Zbj6WpY1qgf34KtYawKIF10mMr6w==", - "dev": true, - "requires": { - "@intlify/core-base": "9.3.0-beta.16", - "@intlify/shared": "9.3.0-beta.16" - } - }, - "@nuxt/kit": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-3.2.3.tgz", - "integrity": "sha512-wcsVlQLwGkh1cRhAFWHc3uYHdIxFTRNdRUzNyfqoX9DL0Fuga3K75q/PBY0xg1viA9R6F5BMPhc7KDLSWbXtWg==", - "dev": true, - "requires": { - "@nuxt/schema": "3.2.3", - "c12": "^1.1.2", - "consola": "^2.15.3", - "defu": "^6.1.2", - "globby": "^13.1.3", - "hash-sum": "^2.0.0", - "ignore": "^5.2.4", - "jiti": "^1.17.1", - "knitwork": "^1.0.0", - "lodash.template": "^4.5.0", - "mlly": "^1.1.1", - "pathe": "^1.1.0", - "pkg-types": "^1.0.2", - "scule": "^1.0.0", - "semver": "^7.3.8", - "unctx": "^2.1.2", - "unimport": "^2.2.4", - "untyped": "^1.2.2" - } - }, - "@nuxt/schema": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@nuxt/schema/-/schema-3.2.3.tgz", - "integrity": "sha512-AXzRnBivCwn5RpNFWjUkvOPGPSHl5BM+6GfOpSNglPXi0tiQJ+rawSl7no7BkxGDmQ44Bx9AXwvHTrgjpcuo4g==", - "dev": true, - "requires": { - "c12": "^1.1.2", - "create-require": "^1.1.1", - "defu": "^6.1.2", - "hookable": "^5.4.2", - "jiti": "^1.17.1", - "pathe": "^1.1.0", - "pkg-types": "^1.0.2", - "postcss-import-resolver": "^2.0.0", - "scule": "^1.0.0", - "std-env": "^3.3.2", - "ufo": "^1.1.1", - "unimport": "^2.2.4", - "untyped": "^1.2.2" - } - }, - "@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": { - "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 - } - } - }, - "@vue/compiler-core": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.47.tgz", - "integrity": "sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==", - "dev": true, - "requires": { - "@babel/parser": "^7.16.4", - "@vue/shared": "3.2.47", - "estree-walker": "^2.0.2", - "source-map": "^0.6.1" - }, - "dependencies": { - "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 - } - } - }, - "@vue/compiler-dom": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz", - "integrity": "sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==", - "dev": true, - "requires": { - "@vue/compiler-core": "3.2.47", - "@vue/shared": "3.2.47" - } - }, - "@vue/compiler-sfc": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz", - "integrity": "sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==", - "dev": true, - "requires": { - "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.47", - "@vue/compiler-dom": "3.2.47", - "@vue/compiler-ssr": "3.2.47", - "@vue/reactivity-transform": "3.2.47", - "@vue/shared": "3.2.47", - "estree-walker": "^2.0.2", - "magic-string": "^0.25.7", - "postcss": "^8.1.10", - "source-map": "^0.6.1" - }, - "dependencies": { - "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 - }, - "magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.8" - } - } - } - }, - "@vue/compiler-ssr": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz", - "integrity": "sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==", - "dev": true, - "requires": { - "@vue/compiler-dom": "3.2.47", - "@vue/shared": "3.2.47" - } - }, - "@vue/reactivity-transform": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz", - "integrity": "sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==", - "dev": true, - "requires": { - "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.47", - "@vue/shared": "3.2.47", - "estree-walker": "^2.0.2", - "magic-string": "^0.25.7" - }, - "dependencies": { - "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 - }, - "magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.8" - } - } - } - }, - "@vue/shared": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.47.tgz", - "integrity": "sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==", - "dev": true - }, - "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==", + "@intlify/shared": { + "version": "9.3.0-beta.22", + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.3.0-beta.22.tgz", + "integrity": "sha512-GS+OHgYcHaq7a+zC1dlVvEHUYHVPKPC/tV3OmFyKJ2Lm7qAFmX29MQn9WOG4WtUme86tPp5LRFz6mYL5VQUJqQ==", "dev": true }, - "magic-string": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", - "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", - "dev": true, - "requires": { - "@jridgewell/sourcemap-codec": "^1.4.13" - } - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "unimport": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/unimport/-/unimport-2.2.4.tgz", - "integrity": "sha512-qMgmeEGqqrrmEtm0dqxMG37J6xBtrriqxq9hILvDb+e6l2F0yTnJomLoCCp0eghLR7bYGeBsUU5Y0oyiUYhViw==", + "@intlify/vue-devtools": { + "version": "9.3.0-beta.22", + "resolved": "https://registry.npmjs.org/@intlify/vue-devtools/-/vue-devtools-9.3.0-beta.22.tgz", + "integrity": "sha512-Qd0kKXsWe1DagjdebFgpbSYe2eWi1rs6fROg8pTbCSqyvOMqsscxMu+Tl+MiXYrZxkfXisR0BefONO7Zpi8UbQ==", "dev": true, "requires": { - "@rollup/pluginutils": "^5.0.2", - "escape-string-regexp": "^5.0.0", - "fast-glob": "^3.2.12", - "local-pkg": "^0.4.3", - "magic-string": "^0.27.0", - "mlly": "^1.1.0", - "pathe": "^1.1.0", - "pkg-types": "^1.0.1", - "scule": "^1.0.0", - "strip-literal": "^1.0.0", - "unplugin": "^1.0.1" + "@intlify/core-base": "9.3.0-beta.22", + "@intlify/shared": "9.3.0-beta.22" } }, "vue-i18n": { - "version": "9.3.0-beta.16", - "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.3.0-beta.16.tgz", - "integrity": "sha512-huhBeRB0SEvv2gIgCS7Zo06nb8AAhbPQCoB/vwDfbDNs8F+giv9QCmhEed+TkLTih/54JGnXkxN6tw1VZqVY/w==", + "version": "9.3.0-beta.22", + "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.3.0-beta.22.tgz", + "integrity": "sha512-i/MQ1x5kEXTMzmg5Cg9dnXDaTWv0S+O0ZTf8+qLWhFJDT4ERa5GLh5V+Ya748x1D+kwpStJxIW3kZGESJG7XCg==", "dev": true, "requires": { - "@intlify/core-base": "9.3.0-beta.16", - "@intlify/shared": "9.3.0-beta.16", - "@intlify/vue-devtools": "9.3.0-beta.16", - "@vue/devtools-api": "^6.2.1" + "@intlify/core-base": "9.3.0-beta.22", + "@intlify/shared": "9.3.0-beta.22", + "@intlify/vue-devtools": "9.3.0-beta.22", + "@vue/devtools-api": "^6.5.0" } }, "vue-i18n-routing": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/vue-i18n-routing/-/vue-i18n-routing-0.12.2.tgz", - "integrity": "sha512-VzYUzbUJyPHUP74t973dN42/sJnZUzBwdcYX+TJgr9YHD08+9uouw5Ume2jHO2Pi8Nymu4cz/UiHWDPeMyc/bQ==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/vue-i18n-routing/-/vue-i18n-routing-0.13.1.tgz", + "integrity": "sha512-F+VYikc86UqJSUziXtRvEJM7/ZIusN27hjtbvMKjweznBTVD4FWour+xe4d3zi0ETnajBsldu4FddZN7VlUOyg==", "dev": true, "requires": { "@intlify/shared": "next", @@ -12907,38 +14750,58 @@ } }, "@pkgr/utils": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.3.1.tgz", - "integrity": "sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", + "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==", "dev": true, "requires": { "cross-spawn": "^7.0.3", + "fast-glob": "^3.3.0", "is-glob": "^4.0.3", - "open": "^8.4.0", + "open": "^9.1.0", "picocolors": "^1.0.0", - "tiny-glob": "^0.2.9", - "tslib": "^2.4.0" + "tslib": "^2.6.0" + }, + "dependencies": { + "define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true + }, + "open": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", + "dev": true, + "requires": { + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^2.2.0" + } + } } }, "@rollup/plugin-alias": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-alias/-/plugin-alias-4.0.2.tgz", - "integrity": "sha512-1hv7dBOZZwo3SEupxn4UA2N0EDThqSSS+wI1St1TNTBtOZvUchyIClyHcnDcjjrReTPZ47Faedrhblv4n+T5UQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-alias/-/plugin-alias-5.0.0.tgz", + "integrity": "sha512-l9hY5chSCjuFRPsnRm16twWBiSApl2uYFLsepQYwtBuAxNMQ/1dJqADld40P0Jkqm65GRTLy/AC6hnpVebtLsA==", "requires": { "slash": "^4.0.0" } }, "@rollup/plugin-commonjs": { - "version": "23.0.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-23.0.2.tgz", - "integrity": "sha512-e9ThuiRf93YlVxc4qNIurvv+Hp9dnD+4PjOqQs5vAYfcZ3+AXSrcdzXnVjWxcGQOa6KGJFcRZyUI3ktWLavFjg==", + "version": "25.0.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.3.tgz", + "integrity": "sha512-uBdtWr/H3BVcgm97MUdq2oJmqBR23ny1hOrWe2PKo9FTbjsGqg32jfasJUKYAI5ouqacjRnj65mBB/S79F+GQA==", "requires": { "@rollup/pluginutils": "^5.0.1", "commondir": "^1.0.1", "estree-walker": "^2.0.2", "glob": "^8.0.3", "is-reference": "1.2.1", - "magic-string": "^0.26.4" + "magic-string": "^0.27.0" }, "dependencies": { "@rollup/pluginutils": { @@ -12959,13 +14822,13 @@ } }, "@rollup/plugin-inject": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-5.0.2.tgz", - "integrity": "sha512-zRthPC/sZ2OaQwPh2LvFn0A+3SyMAZR1Vqsp89mWkIuGXKswT8ty1JWj1pf7xdZvft4gHZaCuhdopuiCwjclWg==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-5.0.3.tgz", + "integrity": "sha512-411QlbL+z2yXpRWFXSmw/teQRMkXcAAC8aYTemc15gwJRpvEVDQwoe+N/HTFD8RFG8+88Bme9DK2V9CVm7hJdA==", "requires": { "@rollup/pluginutils": "^5.0.1", "estree-walker": "^2.0.2", - "magic-string": "^0.26.4" + "magic-string": "^0.27.0" }, "dependencies": { "@rollup/pluginutils": { @@ -12986,9 +14849,9 @@ } }, "@rollup/plugin-json": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-5.0.1.tgz", - "integrity": "sha512-QCwhZZLvM8nRcTHyR1vOgyTMiAnjiNj1ebD/BMRvbO1oc/z14lZH6PfxXeegee2B6mky/u9fia4fxRM4TqrUaw==", + "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==", "requires": { "@rollup/pluginutils": "^5.0.1" }, @@ -13011,14 +14874,14 @@ } }, "@rollup/plugin-node-resolve": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.0.1.tgz", - "integrity": "sha512-ReY88T7JhJjeRVbfCyNj+NXAG3IIsVMsX9b5/9jC98dRP8/yxlZdz7mHZbHk5zHr24wZZICS5AcXsFZAXYUQEg==", + "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==", "requires": { "@rollup/pluginutils": "^5.0.1", "@types/resolve": "1.20.2", "deepmerge": "^4.2.2", - "is-builtin-module": "^3.2.0", + "is-builtin-module": "^3.2.1", "is-module": "^1.0.0", "resolve": "^1.22.1" }, @@ -13041,12 +14904,12 @@ } }, "@rollup/plugin-replace": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-5.0.1.tgz", - "integrity": "sha512-Z3MfsJ4CK17BfGrZgvrcp/l6WXoKb0kokULO+zt/7bmcyayokDaQ2K3eDJcRLCTAlp5FPI4/gz9MHAsosz4Rag==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-5.0.2.tgz", + "integrity": "sha512-M9YXNekv/C/iHHK+cvORzfRYfPbq0RDD8r0G+bMiTXjNGKulPnCT9O3Ss46WfhI6ZOCgApOP7xAdmCQJ+U2LAA==", "requires": { "@rollup/pluginutils": "^5.0.1", - "magic-string": "^0.26.4" + "magic-string": "^0.27.0" }, "dependencies": { "@rollup/pluginutils": { @@ -13066,17 +14929,26 @@ } } }, + "@rollup/plugin-terser": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.3.tgz", + "integrity": "sha512-EF0oejTMtkyhrkwCdg0HJ0IpkcaVg1MMSf2olHb2Jp+1mnLM04OhjpJWGma4HobiDTF0WCyViWuvadyE9ch2XA==", + "requires": { + "serialize-javascript": "^6.0.1", + "smob": "^1.0.0", + "terser": "^5.17.4" + } + }, "@rollup/plugin-wasm": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-wasm/-/plugin-wasm-6.0.1.tgz", - "integrity": "sha512-a5yRknFQG/QGhb1xGkazWXgjpsv0hhWlx34irsf5adMEo55NdpzhZLg+jx49u+bzH6ekktuFg2WKA1RAF+WEDQ==", + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-wasm/-/plugin-wasm-6.1.3.tgz", + "integrity": "sha512-7ItTTeyauE6lwdDtQWceEHZ9+txbi4RRy0mYPFn9BW7rD7YdgBDu7HTHsLtHrRzJc313RM/1m6GKgV3np/aEaw==", "requires": {} }, "@rollup/pluginutils": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", - "dev": true, "requires": { "estree-walker": "^2.0.1", "picomatch": "^2.2.2" @@ -13085,20 +14957,24 @@ "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 + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" } } }, + "@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==" + }, "@trysound/sax": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==" }, "@types/chai": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==" + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", + "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==" }, "@types/chai-subset": { "version": "1.3.3", @@ -13109,9 +14985,17 @@ } }, "@types/estree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", - "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" + }, + "@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==", + "requires": { + "@types/node": "*" + } }, "@types/istanbul-lib-coverage": { "version": "2.0.4", @@ -13119,9 +15003,9 @@ "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" }, "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "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/json5": { @@ -13131,9 +15015,9 @@ "dev": true }, "@types/node": { - "version": "18.11.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", - "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==" + "version": "20.4.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.4.tgz", + "integrity": "sha512-CukZhumInROvLq3+b5gLev+vgpsIqC2D0deQr/yS1WnxvmYLlJXZpaQrQiseMY+6xusl79E04UjWoqyr+t1/Ew==" }, "@types/normalize-package-data": { "version": "2.4.1", @@ -13153,92 +15037,108 @@ "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==" }, "@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", "dev": true }, "@types/web-bluetooth": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", - "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==" + "version": "0.0.17", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.17.tgz", + "integrity": "sha512-4p9vcSmxAayx72yn70joFoL44c9MO/0+iVEBIQXe3v2h2SiAsEIo/G5v6ObFWvNKRFjbrVadNf9LqEEZeQPzdA==" }, "@typescript-eslint/eslint-plugin": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.46.1.tgz", - "integrity": "sha512-YpzNv3aayRBwjs4J3oz65eVLXc9xx0PDbIRisHj+dYhvBn02MjYOD96P8YGiWEIFBrojaUjxvkaUpakD82phsA==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.46.1", - "@typescript-eslint/type-utils": "5.46.1", - "@typescript-eslint/utils": "5.46.1", + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", "debug": "^4.3.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", - "regexpp": "^3.2.0", "semver": "^7.3.7", "tsutils": "^3.21.0" }, "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } } }, "@typescript-eslint/parser": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.46.1.tgz", - "integrity": "sha512-RelQ5cGypPh4ySAtfIMBzBGyrNerQcmfA1oJvPj5f+H4jI59rl9xxpn4bonC0tQvUKOEN7eGBFWxFLK3Xepneg==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.46.1", - "@typescript-eslint/types": "5.46.1", - "@typescript-eslint/typescript-estree": "5.46.1", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.46.1.tgz", - "integrity": "sha512-iOChVivo4jpwUdrJZyXSMrEIM/PvsbbDOX1y3UCKjSgWn+W89skxWaYXACQfxmIGhPVpRWK/VWPYc+bad6smIA==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", "dev": true, "requires": { - "@typescript-eslint/types": "5.46.1", - "@typescript-eslint/visitor-keys": "5.46.1" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" } }, "@typescript-eslint/type-utils": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.46.1.tgz", - "integrity": "sha512-V/zMyfI+jDmL1ADxfDxjZ0EMbtiVqj8LUGPAGyBkXXStWmCUErMpW873zEHsyguWCuq2iN4BrlWUkmuVj84yng==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.46.1", - "@typescript-eslint/utils": "5.46.1", + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", "debug": "^4.3.4", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.46.1.tgz", - "integrity": "sha512-Z5pvlCaZgU+93ryiYUwGwLl9AQVB/PQ1TsJ9NZ/gHzZjN7g9IAn6RSDkpCV8hqTwAiaj6fmCcKSQeBPlIpW28w==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.46.1.tgz", - "integrity": "sha512-j9W4t67QiNp90kh5Nbr1w92wzt+toiIsaVPnEblB2Ih2U9fqBTyqV9T3pYWZBRt6QoMh/zVWP59EpuCjc4VRBg==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.46.1", - "@typescript-eslint/visitor-keys": "5.46.1", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -13260,10 +15160,19 @@ "slash": "^3.0.0" } }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -13274,94 +15183,128 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } } }, "@typescript-eslint/utils": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.46.1.tgz", - "integrity": "sha512-RBdBAGv3oEpFojaCYT4Ghn4775pdjvwfDOfQ2P6qzNVgQOVrnSPe5/Pb88kv7xzYQjoio0eKHKB9GJ16ieSxvA==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", "dev": true, "requires": { + "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.46.1", - "@typescript-eslint/types": "5.46.1", - "@typescript-eslint/typescript-estree": "5.46.1", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", "semver": "^7.3.7" }, "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } } }, "@typescript-eslint/visitor-keys": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.46.1.tgz", - "integrity": "sha512-jczZ9noovXwy59KjRTk1OftT78pwygdcmCuBf8yMoWt/8O8l+6x2LSEze0E4TeepXK4MezW3zGSyoDRZK7Y9cg==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.46.1", + "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" }, "dependencies": { "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true } } }, "@unhead/dom": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@unhead/dom/-/dom-1.0.4.tgz", - "integrity": "sha512-Mzkevk50k5xQo6mIcNcKGKJ4R7tYyCg8ZN5NfmiUXIfvjaM4zWEZK8DhZNbQ8/548oO6Eq2Y73+53W8rLsSaoQ==", + "version": "1.1.32", + "resolved": "https://registry.npmjs.org/@unhead/dom/-/dom-1.1.32.tgz", + "integrity": "sha512-AMpHlKEKcm1dxSAvm6GPXhjoZHzXh7ZeR8DAnXVH7Sd9a48xaJhQjmxETweFAcNBSnAn9e7TxTPZVrUcW0ej2w==", "requires": { - "@unhead/schema": "1.0.4" + "@unhead/schema": "1.1.32", + "@unhead/shared": "1.1.32" } }, "@unhead/schema": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@unhead/schema/-/schema-1.0.4.tgz", - "integrity": "sha512-bCkwV+GkAQN5yByelaeASmLVgdXypMC1O3xChW8oAC7ySz/ZqV9nXPt1Gx6jrNX4wL7Vbv3eCQ8jtB3QFH92ag==", + "version": "1.1.32", + "resolved": "https://registry.npmjs.org/@unhead/schema/-/schema-1.1.32.tgz", + "integrity": "sha512-XxrNazZEO9T+r1ORduy6gnKA9rDzRgxr/p5UEPRM+TZVuM8ZEFzYr2/aE5bMgTCXp20z0pjv/2rewpVSXp4pFQ==", "requires": { - "@zhead/schema": "^1.0.4", - "hookable": "^5.4.2" + "hookable": "^5.5.3", + "zhead": "^2.0.9" + } + }, + "@unhead/shared": { + "version": "1.1.32", + "resolved": "https://registry.npmjs.org/@unhead/shared/-/shared-1.1.32.tgz", + "integrity": "sha512-oguyfbwbG4+wNphXQjQ3YrEe4NzabocpTQKNCKdTUPtpK9HYNiI+dffEoSiM3tWcwlG3iYrXj5WvREq3FoACWQ==", + "requires": { + "@unhead/schema": "1.1.32" } }, "@unhead/ssr": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@unhead/ssr/-/ssr-1.0.4.tgz", - "integrity": "sha512-/uyJLBGM3OfemBHt9hWvQOMpbWaMjJCns2WmYcuiOE6EFNy68SjSzHbm0rYkarhZWYZqxy0Sq6zuzVsM0Gi15Q==", + "version": "1.1.32", + "resolved": "https://registry.npmjs.org/@unhead/ssr/-/ssr-1.1.32.tgz", + "integrity": "sha512-3DGh/EvHFuUx9k0M5CN5KmQHEaZMbrwtRlv2aQjicLqeeJGSI+okpRbaEu4A9WWwPmkR0u8FBnv1WCAPMcj3ZA==", "requires": { - "@unhead/schema": "1.0.4" + "@unhead/schema": "1.1.32", + "@unhead/shared": "1.1.32" } }, "@unhead/vue": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@unhead/vue/-/vue-1.0.4.tgz", - "integrity": "sha512-dW4FY4SRNaoGcFXuk6dU2Fp7fFHluBZqdOxpekMKO3q4zn+sOcnqHdzDmSnXPgoqr4huumnG8zNjVsuyRQ0+Mg==", + "version": "1.1.32", + "resolved": "https://registry.npmjs.org/@unhead/vue/-/vue-1.1.32.tgz", + "integrity": "sha512-rpQVxgI/crwlC+z8GnfPV6EwVN/kyeVSvEfzJO9VMIdrWMrh6vAV0WNv3v+BFd0bVLiRyNzhvbY76yhmAX4Zvw==", "requires": { - "@unhead/schema": "1.0.4", - "hookable": "^5.4.2" + "@unhead/schema": "1.1.32", + "@unhead/shared": "1.1.32", + "hookable": "^5.5.3", + "unhead": "1.1.32" } }, "@vercel/nft": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-0.22.1.tgz", - "integrity": "sha512-lYYZIoxRurqDOSoVIdBicGnpUIpfyaS5qVjdPq+EfI285WqtZK3NK/dyCkiyBul+X2U2OEhRyeMdXPCHGJbohw==", + "version": "0.22.6", + "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-0.22.6.tgz", + "integrity": "sha512-gTsFnnT4mGxodr4AUlW3/urY+8JKKB452LwF3m477RFUJTAaDmcz2JqFuInzvdybYIeyIv1sSONEJxsxnbQ5JQ==", "requires": { "@mapbox/node-pre-gyp": "^1.0.5", + "@rollup/pluginutils": "^4.0.0", "acorn": "^8.6.0", "async-sema": "^3.1.1", "bindings": "^1.4.0", @@ -13370,8 +15313,7 @@ "graceful-fs": "^4.2.9", "micromatch": "^4.0.2", "node-gyp-build": "^4.2.2", - "resolve-from": "^5.0.0", - "rollup-pluginutils": "^2.8.2" + "resolve-from": "^5.0.0" }, "dependencies": { "estree-walker": { @@ -13400,49 +15342,61 @@ } }, "@vitejs/plugin-vue": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-3.2.0.tgz", - "integrity": "sha512-E0tnaL4fr+qkdCNxJ+Xd0yM31UwMkQje76fsDVBBUCoGOUPexu2VDUYHL8P4CwV+zMvWw6nlRw19OnRKmYAJpw==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.2.3.tgz", + "integrity": "sha512-R6JDUfiZbJA9cMiguQ7jxALsgiprjBeHL5ikpXfJCH62pPHtI+JdJ5xWj6Ev73yXSlYl86+blXn1kZHQ7uElxw==", "requires": {} }, "@vitejs/plugin-vue-jsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-2.1.1.tgz", - "integrity": "sha512-JgDhxstQlwnHBvZ1BSnU5mbmyQ14/t5JhREc6YH5kWyu2QdAAOsLF6xgHoIWarj8tddaiwFrNzLbWJPudpXKYA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-3.0.1.tgz", + "integrity": "sha512-+Jb7ggL48FSPS1uhPnJbJwWa9Sr90vQ+d0InW+AhBM22n+cfuYqJZDckBc+W3QSHe1WDvewMZfa4wZOtk5pRgw==", "requires": { - "@babel/core": "^7.19.6", - "@babel/plugin-transform-typescript": "^7.20.0", + "@babel/core": "^7.20.7", + "@babel/plugin-transform-typescript": "^7.20.7", "@vue/babel-plugin-jsx": "^1.1.1" } }, "@vitest/coverage-c8": { - "version": "0.29.8", - "resolved": "https://registry.npmjs.org/@vitest/coverage-c8/-/coverage-c8-0.29.8.tgz", - "integrity": "sha512-y+sEMQMctWokjnSqm3FCQEYFkjLrYaznsxEZHxcx8z2aftpYg3A5tvI1S5himfdEFo7o+OeHzh40bPSWZHW4oQ==", + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/coverage-c8/-/coverage-c8-0.33.0.tgz", + "integrity": "sha512-DaF1zJz4dcOZS4k/neiQJokmOWqsGXwhthfmUdPGorXIQHjdPvV6JQSYhQDI41MyI8c+IieQUdIDs5XAMHtDDw==", "requires": { - "c8": "^7.13.0", + "@ampproject/remapping": "^2.2.1", + "c8": "^7.14.0", + "magic-string": "^0.30.1", "picocolors": "^1.0.0", - "std-env": "^3.3.1" + "std-env": "^3.3.3" + }, + "dependencies": { + "magic-string": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", + "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + } } }, "@vitest/expect": { - "version": "0.29.8", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.29.8.tgz", - "integrity": "sha512-xlcVXn5I5oTq6NiZSY3ykyWixBxr5mG8HYtjvpgg6KaqHm0mvhX18xuwl5YGxIRNt/A5jidd7CWcNHrSvgaQqQ==", + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.33.0.tgz", + "integrity": "sha512-sVNf+Gla3mhTCxNJx+wJLDPp/WcstOe0Ksqz4Vec51MmgMth/ia0MGFEkIZmVGeTL5HtjYR4Wl/ZxBxBXZJTzQ==", "requires": { - "@vitest/spy": "0.29.8", - "@vitest/utils": "0.29.8", + "@vitest/spy": "0.33.0", + "@vitest/utils": "0.33.0", "chai": "^4.3.7" } }, "@vitest/runner": { - "version": "0.29.8", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.29.8.tgz", - "integrity": "sha512-FzdhnRDwEr/A3Oo1jtIk/B952BBvP32n1ObMEb23oEJNO+qO5cBet6M2XWIDQmA7BDKGKvmhUf2naXyp/2JEwQ==", + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.33.0.tgz", + "integrity": "sha512-UPfACnmCB6HKRHTlcgCoBh6ppl6fDn+J/xR8dTufWiKt/74Y9bHci5CKB8tESSV82zKYtkBJo9whU3mNvfaisg==", "requires": { - "@vitest/utils": "0.29.8", + "@vitest/utils": "0.33.0", "p-limit": "^4.0.0", - "pathe": "^1.1.0" + "pathe": "^1.1.1" }, "dependencies": { "p-limit": { @@ -13460,130 +15414,131 @@ } } }, + "@vitest/snapshot": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.33.0.tgz", + "integrity": "sha512-tJjrl//qAHbyHajpFvr8Wsk8DIOODEebTu7pgBrP07iOepR5jYkLFiqLq2Ltxv+r0uptUb4izv1J8XBOwKkVYA==", + "requires": { + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "pretty-format": "^29.5.0" + }, + "dependencies": { + "magic-string": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", + "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + } + } + }, "@vitest/spy": { - "version": "0.29.8", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.29.8.tgz", - "integrity": "sha512-VdjBe9w34vOMl5I5mYEzNX8inTxrZ+tYUVk9jxaZJmHFwmDFC/GV3KBFTA/JKswr3XHvZL+FE/yq5EVhb6pSAw==", + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.33.0.tgz", + "integrity": "sha512-Kv+yZ4hnH1WdiAkPUQTpRxW8kGtH8VRTnus7ZTGovFYM1ZezJpvGtb9nPIjPnptHbsyIAxYZsEpVPYgtpjGnrg==", "requires": { - "tinyspy": "^1.0.2" + "tinyspy": "^2.1.1" } }, "@vitest/utils": { - "version": "0.29.8", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.29.8.tgz", - "integrity": "sha512-qGzuf3vrTbnoY+RjjVVIBYfuWMjn3UMUqyQtdGNZ6ZIIyte7B37exj6LaVkrZiUTvzSadVvO/tJm8AEgbGCBPg==", + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.33.0.tgz", + "integrity": "sha512-pF1w22ic965sv+EN6uoePkAOTkAPWM03Ri/jXNyMIKBb/XHLDPfhLvf/Fa9g0YECevAIz56oVYXhodLvLQ/awA==", "requires": { - "cli-truncate": "^3.1.0", - "diff": "^5.1.0", + "diff-sequences": "^29.4.3", "loupe": "^2.3.6", - "pretty-format": "^27.5.1" + "pretty-format": "^29.5.0" } }, "@volar/language-core": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.0.13.tgz", - "integrity": "sha512-aJhRiNjKFgLLB3nRJOfAeyle4StnEQgOKa0UpJU+k5EZd3QdiMfQmekXjxYeQj7NOZNQU7zCBEIvQ3gy15I7tA==", - "dev": true, + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.9.1.tgz", + "integrity": "sha512-FlllCDE0HdUYh66zS1S4u8WobqKFStOwkd3OCXCOhPmalfm4Fte3gHNXzqs+R8VlbjK7ZvBxrG9MSiaRGXZygg==", + "devOptional": true, "requires": { - "@volar/source-map": "1.0.13", - "@vue/reactivity": "^3.2.45", - "muggle-string": "^0.1.0" + "@volar/source-map": "1.9.1" } }, "@volar/source-map": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.0.13.tgz", - "integrity": "sha512-dU0plR9BS+bLs7u4chWay+VEIFTrLF15rG2634lGcu7o+z01bRO1U2cegZuIPy46SNkN3ONErLHwS09NBM+Ucg==", - "dev": true, + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.9.1.tgz", + "integrity": "sha512-KIttDVrbr3ACLzEP891uj+XdVaCnNErFNRGjNQio+gW2a9fDdz407usAJu6DHgIkJU1l18HyOxMU2VX1l2+D5g==", + "devOptional": true, "requires": { - "muggle-string": "^0.1.0" + "muggle-string": "^0.3.1" } }, "@volar/typescript": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.0.13.tgz", - "integrity": "sha512-CfJ4higRZrLDAHVGY84gZ444ZUcA3ktPqVMW0fM3mgHDbzYViB3/tsvXOtZk76D3HK2ap6n4cDwBSv3cY4xqlg==", - "dev": true, + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.9.1.tgz", + "integrity": "sha512-UO8bhflYMNuOpXeGYHSm3xItU4kEVhJQNGjwgw1ZqLr/sm1C7Y+pVQ/S01NpsojhFC8S+P6/p+jOTK6DO214kQ==", + "devOptional": true, "requires": { - "@volar/language-core": "1.0.13" + "@volar/language-core": "1.9.1" } }, - "@volar/vue-language-core": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/@volar/vue-language-core/-/vue-language-core-1.0.13.tgz", - "integrity": "sha512-DRUg7yk4w2+5XFk8LS1dbXEM0na2uAddOj3KWHROPQmn78pfgXEH3r0NGDCnxElWJX5Y16iameisOjtOhevxog==", - "dev": true, + "@vue-macros/common": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vue-macros/common/-/common-1.6.0.tgz", + "integrity": "sha512-sgDo9qN5DI0y7FJ+E0qOxhcsrBlVNp0erW5mfLzYtGYRFfuuIS5hEanNao7QZWVmK39kvmNOPbPOV1oiWBMrng==", "requires": { - "@volar/language-core": "1.0.13", - "@volar/source-map": "1.0.13", - "@vue/compiler-dom": "^3.2.45", - "@vue/compiler-sfc": "^3.2.45", - "@vue/reactivity": "^3.2.45", - "@vue/shared": "^3.2.45", - "minimatch": "^5.1.0", - "vue-template-compiler": "^2.7.14" + "@babel/types": "^7.22.5", + "@rollup/pluginutils": "^5.0.2", + "@vue/compiler-sfc": "^3.3.4", + "ast-kit": "^0.9.4", + "local-pkg": "^0.4.3", + "magic-string-ast": "^0.2.0" }, "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, + "@rollup/pluginutils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", + "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", "requires": { - "balanced-match": "^1.0.0" + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" } }, - "minimatch": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.1.tgz", - "integrity": "sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } + "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==" } } }, - "@volar/vue-typescript": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/@volar/vue-typescript/-/vue-typescript-1.0.13.tgz", - "integrity": "sha512-iEdkF5l6G10fv/G5hs7WcvtT48AT6y/Pm7pvafnB6SxPhm2uHQ+130x3zeWLMaUel5t6h5LBw2pFsF5Bh85QAQ==", - "dev": true, - "requires": { - "@volar/typescript": "1.0.13", - "@volar/vue-language-core": "1.0.13" - } - }, "@vue/babel-helper-vue-transform-on": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.0.2.tgz", - "integrity": "sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA==" + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.1.5.tgz", + "integrity": "sha512-SgUymFpMoAyWeYWLAY+MkCK3QEROsiUnfaw5zxOVD/M64KQs8D/4oK6Q5omVA2hnvEOE0SCkH2TZxs/jnnUj7w==" }, "@vue/babel-plugin-jsx": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.1.tgz", - "integrity": "sha512-j2uVfZjnB5+zkcbc/zsOc0fSNGCMMjaEXP52wdwdIfn0qjFfEYpYZBFKFg+HHnQeJCVrjOeO0YxgaL7DMrym9w==", - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.0.0", - "@babel/template": "^7.0.0", - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "@vue/babel-helper-vue-transform-on": "^1.0.2", - "camelcase": "^6.0.0", - "html-tags": "^3.1.0", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.5.tgz", + "integrity": "sha512-nKs1/Bg9U1n3qSWnsHhCVQtAzI6aQXqua8j/bZrau8ywT1ilXQbK4FwEJGmU8fV7tcpuFvWmmN7TMmV1OBma1g==", + "requires": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5", + "@vue/babel-helper-vue-transform-on": "^1.1.5", + "camelcase": "^6.3.0", + "html-tags": "^3.3.1", "svg-tags": "^1.0.0" } }, "@vue/compiler-core": { - "version": "3.2.45", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.45.tgz", - "integrity": "sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.4.tgz", + "integrity": "sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==", "requires": { - "@babel/parser": "^7.16.4", - "@vue/shared": "3.2.45", + "@babel/parser": "^7.21.3", + "@vue/shared": "3.3.4", "estree-walker": "^2.0.2", - "source-map": "^0.6.1" + "source-map-js": "^1.0.2" }, "dependencies": { "estree-walker": { @@ -13594,29 +15549,29 @@ } }, "@vue/compiler-dom": { - "version": "3.2.45", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.45.tgz", - "integrity": "sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz", + "integrity": "sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==", "requires": { - "@vue/compiler-core": "3.2.45", - "@vue/shared": "3.2.45" + "@vue/compiler-core": "3.3.4", + "@vue/shared": "3.3.4" } }, "@vue/compiler-sfc": { - "version": "3.2.45", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.45.tgz", - "integrity": "sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q==", - "requires": { - "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.45", - "@vue/compiler-dom": "3.2.45", - "@vue/compiler-ssr": "3.2.45", - "@vue/reactivity-transform": "3.2.45", - "@vue/shared": "3.2.45", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz", + "integrity": "sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==", + "requires": { + "@babel/parser": "^7.20.15", + "@vue/compiler-core": "3.3.4", + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-ssr": "3.3.4", + "@vue/reactivity-transform": "3.3.4", + "@vue/shared": "3.3.4", "estree-walker": "^2.0.2", - "magic-string": "^0.25.7", + "magic-string": "^0.30.0", "postcss": "^8.1.10", - "source-map": "^0.6.1" + "source-map-js": "^1.0.2" }, "dependencies": { "estree-walker": { @@ -13625,47 +15580,83 @@ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" }, "magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", + "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", "requires": { - "sourcemap-codec": "^1.4.8" + "@jridgewell/sourcemap-codec": "^1.4.15" } } } }, "@vue/compiler-ssr": { - "version": "3.2.45", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.45.tgz", - "integrity": "sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz", + "integrity": "sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==", "requires": { - "@vue/compiler-dom": "3.2.45", - "@vue/shared": "3.2.45" + "@vue/compiler-dom": "3.3.4", + "@vue/shared": "3.3.4" } }, "@vue/devtools-api": { - "version": "6.4.5", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.4.5.tgz", - "integrity": "sha512-JD5fcdIuFxU4fQyXUu3w2KpAJHzTVdN+p4iOX2lMWSHMOoQdMAcpFLZzm9Z/2nmsoZ1a96QEhZ26e50xLBsgOQ==" + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz", + "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==" + }, + "@vue/language-core": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-1.8.6.tgz", + "integrity": "sha512-PyYDMArbR7hnhqw9OEupr0s4ut0/ZfITp7WEjigF58cd2R0lRLNM1HPvzFMuULpy3ImBEOZI11KRIDirqOe+tQ==", + "devOptional": true, + "requires": { + "@volar/language-core": "~1.9.0", + "@volar/source-map": "~1.9.0", + "@vue/compiler-dom": "^3.3.0", + "@vue/reactivity": "^3.3.0", + "@vue/shared": "^3.3.0", + "minimatch": "^9.0.0", + "muggle-string": "^0.3.1", + "vue-template-compiler": "^2.7.14" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "devOptional": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "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" + } + } + } }, "@vue/reactivity": { - "version": "3.2.45", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.45.tgz", - "integrity": "sha512-PRvhCcQcyEVohW0P8iQ7HDcIOXRjZfAsOds3N99X/Dzewy8TVhTCT4uXpAHfoKjVTJRA0O0K+6QNkDIZAxNi3A==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.4.tgz", + "integrity": "sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==", "requires": { - "@vue/shared": "3.2.45" + "@vue/shared": "3.3.4" } }, "@vue/reactivity-transform": { - "version": "3.2.45", - "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.45.tgz", - "integrity": "sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz", + "integrity": "sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==", "requires": { - "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.45", - "@vue/shared": "3.2.45", + "@babel/parser": "^7.20.15", + "@vue/compiler-core": "3.3.4", + "@vue/shared": "3.3.4", "estree-walker": "^2.0.2", - "magic-string": "^0.25.7" + "magic-string": "^0.30.0" }, "dependencies": { "estree-walker": { @@ -13674,142 +15665,137 @@ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" }, "magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", + "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", "requires": { - "sourcemap-codec": "^1.4.8" + "@jridgewell/sourcemap-codec": "^1.4.15" } } } }, "@vue/runtime-core": { - "version": "3.2.45", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.45.tgz", - "integrity": "sha512-gzJiTA3f74cgARptqzYswmoQx0fIA+gGYBfokYVhF8YSXjWTUA2SngRzZRku2HbGbjzB6LBYSbKGIaK8IW+s0A==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.4.tgz", + "integrity": "sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==", "requires": { - "@vue/reactivity": "3.2.45", - "@vue/shared": "3.2.45" + "@vue/reactivity": "3.3.4", + "@vue/shared": "3.3.4" } }, "@vue/runtime-dom": { - "version": "3.2.45", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.45.tgz", - "integrity": "sha512-cy88YpfP5Ue2bDBbj75Cb4bIEZUMM/mAkDMfqDTpUYVgTf/kuQ2VQ8LebuZ8k6EudgH8pYhsGWHlY0lcxlvTwA==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.4.tgz", + "integrity": "sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==", "requires": { - "@vue/runtime-core": "3.2.45", - "@vue/shared": "3.2.45", - "csstype": "^2.6.8" + "@vue/runtime-core": "3.3.4", + "@vue/shared": "3.3.4", + "csstype": "^3.1.1" } }, "@vue/server-renderer": { - "version": "3.2.45", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.45.tgz", - "integrity": "sha512-ebiMq7q24WBU1D6uhPK//2OTR1iRIyxjF5iVq/1a5I1SDMDyDu4Ts6fJaMnjrvD3MqnaiFkKQj+LKAgz5WIK3g==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.4.tgz", + "integrity": "sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==", "requires": { - "@vue/compiler-ssr": "3.2.45", - "@vue/shared": "3.2.45" + "@vue/compiler-ssr": "3.3.4", + "@vue/shared": "3.3.4" } }, "@vue/shared": { - "version": "3.2.45", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.45.tgz", - "integrity": "sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==" + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.4.tgz", + "integrity": "sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==" + }, + "@vue/typescript": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@vue/typescript/-/typescript-1.8.6.tgz", + "integrity": "sha512-sDQ5tltrSVS3lAkE3JtMRGJo91CLIxcWPy7yms/DT+ssxXpwxbVRD5Gok68HenEZBA4Klq7nW99sG/nTRnpPuQ==", + "devOptional": true, + "requires": { + "@volar/typescript": "~1.9.0", + "@vue/language-core": "1.8.6" + } }, "@vuetify/loader-shared": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@vuetify/loader-shared/-/loader-shared-1.7.0.tgz", - "integrity": "sha512-Db4K67wMhduDsbvdRBYkrYuomti+j0E/1vlz1lnDng5F9LYYBcXa60qypIazVGI6GX/CuY1vshN6XGtGQI4FKg==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@vuetify/loader-shared/-/loader-shared-1.7.1.tgz", + "integrity": "sha512-kLUvuAed6RCvkeeTNJzuy14pqnkur8lTuner7v7pNE/kVhPR97TuyXwBSBMR1cJeiLiOfu6SF5XlCYbXByEx1g==", "requires": { "find-cache-dir": "^3.3.2", "upath": "^2.0.1" } }, "@vueuse/core": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.6.0.tgz", - "integrity": "sha512-qGUcjKQXHgN+jqXEgpeZGoxdCbIDCdVPz3QiF1uyecVGbMuM63o96I1GjYx5zskKgRI0FKSNsVWM7rwrRMTf6A==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.2.1.tgz", + "integrity": "sha512-c441bfMbkAwTNwVRHQ0zdYZNETK//P84rC01aP2Uy/aRFCiie9NE/k9KdIXbno0eDYP5NPUuWv0aA/I4Unr/7w==", "requires": { - "@types/web-bluetooth": "^0.0.16", - "@vueuse/metadata": "9.6.0", - "@vueuse/shared": "9.6.0", - "vue-demi": "*" + "@types/web-bluetooth": "^0.0.17", + "@vueuse/metadata": "10.2.1", + "@vueuse/shared": "10.2.1", + "vue-demi": ">=0.14.5" }, "dependencies": { "vue-demi": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz", - "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==", + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.5.tgz", + "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==", "requires": {} } } }, - "@vueuse/head": { - "version": "1.0.18", - "resolved": "https://registry.npmjs.org/@vueuse/head/-/head-1.0.18.tgz", - "integrity": "sha512-V3EuLoZFrMgvCQYSE0pJupYglZ0ID3rr/8ATIgnZNn+fjRrIEn8oAwAe8FRFAUKgBb0rZt+QY94PaDF6/HOLOQ==", - "requires": { - "@unhead/dom": "^1.0.4", - "@unhead/schema": "^1.0.4", - "@unhead/ssr": "^1.0.4", - "@unhead/vue": "^1.0.4" - } - }, "@vueuse/metadata": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.6.0.tgz", - "integrity": "sha512-sIC8R+kWkIdpi5X2z2Gk8TRYzmczDwHRhEFfCu2P+XW2JdPoXrziqsGpDDsN7ykBx4ilwieS7JUIweVGhvZ93w==" + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.2.1.tgz", + "integrity": "sha512-3Gt68mY/i6bQvFqx7cuGBzrCCQu17OBaGWS5JdwISpMsHnMKKjC2FeB5OAfMcCQ0oINfADP3i9A4PPRo0peHdQ==" }, "@vueuse/nuxt": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/@vueuse/nuxt/-/nuxt-9.6.0.tgz", - "integrity": "sha512-r+ngzHijvrfn89KnwlFCSe/xzFCiuskwmxbDdzFtpcZ57RHqLPdUS34YYrDxt7XasM0vlD3dmLIKEH//btf7sw==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/@vueuse/nuxt/-/nuxt-10.2.1.tgz", + "integrity": "sha512-01iDXnjZFDaGZnEL0nvlmSTNV0EG6WY+VSFyWnBji9lbxdQwOn4DHvLou3ePe8ipaoQVtY58WcL0OHIFa4+fBA==", "requires": { - "@nuxt/kit": "^3.0.0-rc.13", - "@vueuse/core": "9.6.0", - "@vueuse/metadata": "9.6.0", - "local-pkg": "^0.4.2", - "vue-demi": "*" + "@nuxt/kit": "^3.6.1", + "@vueuse/core": "10.2.1", + "@vueuse/metadata": "10.2.1", + "local-pkg": "^0.4.3", + "nuxt": "^3.6.1", + "vue-demi": ">=0.14.5" }, "dependencies": { "vue-demi": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz", - "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==", + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.5.tgz", + "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==", "requires": {} } } }, "@vueuse/shared": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.6.0.tgz", - "integrity": "sha512-/eDchxYYhkHnFyrb00t90UfjCx94kRHxc7J1GtBCqCG4HyPMX+krV9XJgVtWIsAMaxKVU4fC8NSUviG1JkwhUQ==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.2.1.tgz", + "integrity": "sha512-QWHq2bSuGptkcxx4f4M/fBYC3Y8d3M2UYyLsyzoPgEoVzJURQ0oJeWXu79OiLlBb8gTKkqe4mO85T/sf39mmiw==", "requires": { - "vue-demi": "*" + "vue-demi": ">=0.14.5" }, "dependencies": { "vue-demi": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz", - "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==", + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.5.tgz", + "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==", "requires": {} } } }, - "@zhead/schema": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@zhead/schema/-/schema-1.0.4.tgz", - "integrity": "sha512-v/CM22nH0TW9VU5IcRXlshwrMtsZPnFQWhcLBvpZjOJvfEmjl8cUb6OIJQJRR2WESNjjPW2Cji8mgL9XSVLjxA==" - }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, "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==" }, "acorn-jsx": { "version": "5.3.2", @@ -13843,12 +15829,24 @@ "uri-js": "^4.2.2" } }, + "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==" + }, "ansi-escapes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.0.0.tgz", - "integrity": "sha512-IG23inYII3dWlU2EyiAiGj6Bwal5GzsgPMwjYGvc1HPE2dgbj4ZB5ToWBKSquKw74nB3TIuOwaI6/jSULzfgrw==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "requires": { - "type-fest": "^3.0.0" + "type-fest": "^0.21.3" + }, + "dependencies": { + "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==" + } } }, "ansi-regex": { @@ -13927,10 +15925,15 @@ "path-is-absolute": "^1.0.0" } }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -13941,11 +15944,6 @@ "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==" - }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -13968,8 +15966,17 @@ "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "devOptional": true + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + } }, "array-includes": { "version": "3.1.6", @@ -14002,11 +16009,73 @@ "es-shim-unscopables": "^1.0.0" } }, + "array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + } + }, + "arraybuffer.prototype.slice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + } + }, "assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" }, + "ast-kit": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/ast-kit/-/ast-kit-0.9.4.tgz", + "integrity": "sha512-UrZHsdj87OS6NM+IXRii+asdAUA/P0SMa4r1NrZvsUy72hDvCYwk8c9PsbKf1MvJ0BvP+rF1B8tFP54eT370Tg==", + "requires": { + "@babel/parser": "^7.22.7", + "@rollup/pluginutils": "^5.0.2", + "pathe": "^1.1.1" + }, + "dependencies": { + "@rollup/pluginutils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", + "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", + "requires": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + } + }, + "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==" + } + } + }, + "ast-walker-scope": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/ast-walker-scope/-/ast-walker-scope-0.4.2.tgz", + "integrity": "sha512-vdCU9JvpsrxWxvJiRHAr8If8cu07LWJXDPhkqLiP4ErbN1fu/mK623QGmU4Qbn2Nq4Mx0vR/Q017B6+HcHg1aQ==", + "requires": { + "@babel/parser": "^7.22.4", + "@babel/types": "^7.22.4" + } + }, "async": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", @@ -14023,22 +16092,28 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "autoprefixer": { - "version": "10.4.13", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", - "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", "requires": { - "browserslist": "^4.21.4", - "caniuse-lite": "^1.0.30001426", + "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" } }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true + }, "axios": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.1.3.tgz", - "integrity": "sha512-00tXVRwKx/FZr/IDVFt4C+f9FYairX517WoGCL6dpOntqLkZofjhu43F/Xl44UOpqa+9sLFDrG/XAnFsUYgkDA==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", + "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", "requires": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -14055,6 +16130,20 @@ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, + "basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "dev": true + }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -14069,11 +16158,11 @@ } }, "bl": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", - "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "requires": { - "buffer": "^6.0.3", + "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } @@ -14083,6 +16172,15 @@ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, + "bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dev": true, + "requires": { + "big-integer": "^1.6.44" + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -14101,23 +16199,23 @@ } }, "browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", "requires": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" + "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==", + "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.2.1" + "ieee754": "^1.1.13" } }, "buffer-crc32": { @@ -14144,136 +16242,78 @@ "semver": "^7.0.0" }, "dependencies": { - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "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": { - "lru-cache": "^6.0.0" - } - } - } - }, - "busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "requires": { - "streamsearch": "^1.1.0" - } - }, - "c12": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/c12/-/c12-1.1.2.tgz", - "integrity": "sha512-fHT5HDEHNMb2oImnqJ88/UlpEOkY/chdyYxSd3YCpvBqBvU0IDlHTkNc7GnjObDMxdis2lL+rwlQcNq8VeZESA==", - "requires": { - "defu": "^6.1.2", - "dotenv": "^16.0.3", - "giget": "^1.1.0", - "jiti": "^1.17.1", - "mlly": "^1.1.1", - "pathe": "^1.1.0", - "pkg-types": "^1.0.2", - "rc9": "^2.0.1" - } - }, - "c8": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/c8/-/c8-7.13.0.tgz", - "integrity": "sha512-/NL4hQTv1gBL6J6ei80zu3IiTrmePDKXKXOTLpHvcIWZTVYQlDhVWjjWvkhICylE8EwwnMVzDZugCvdx0/DIIA==", - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@istanbuljs/schema": "^0.1.3", - "find-up": "^5.0.0", - "foreground-child": "^2.0.0", - "istanbul-lib-coverage": "^3.2.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-reports": "^3.1.4", - "rimraf": "^3.0.2", - "test-exclude": "^6.0.0", - "v8-to-istanbul": "^9.0.0", - "yargs": "^16.2.0", - "yargs-parser": "^20.2.9" - }, - "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": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.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==" - }, - "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==" - }, - "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==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "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==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "yallist": "^4.0.0" } }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "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==", + "dev": true, "requires": { - "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" + "lru-cache": "^6.0.0" } }, - "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==" + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } } }, + "bundle-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", + "dev": true, + "requires": { + "run-applescript": "^5.0.0" + } + }, + "c12": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/c12/-/c12-1.4.2.tgz", + "integrity": "sha512-3IP/MuamSVRVw8W8+CHWAz9gKN4gd+voF2zm/Ln6D25C2RhytEZ1ABbC8MjKr4BR9rhoV1JQ7jJA158LDiTkLg==", + "requires": { + "chokidar": "^3.5.3", + "defu": "^6.1.2", + "dotenv": "^16.3.1", + "giget": "^1.1.2", + "jiti": "^1.18.2", + "mlly": "^1.4.0", + "ohash": "^1.1.2", + "pathe": "^1.1.1", + "perfect-debounce": "^1.0.0", + "pkg-types": "^1.0.3", + "rc9": "^2.1.1" + } + }, + "c8": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/c8/-/c8-7.14.0.tgz", + "integrity": "sha512-i04rtkkcNcCf7zsQcSv/T9EbUn4RXQ6mropeMcjFOsQXQ0iGLAr/xT6TImQg4+U9hmNpN9XdvPkjUL1IzbgxJw==", + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@istanbuljs/schema": "^0.1.3", + "find-up": "^5.0.0", + "foreground-child": "^2.0.0", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-reports": "^3.1.4", + "rimraf": "^3.0.2", + "test-exclude": "^6.0.0", + "v8-to-istanbul": "^9.0.0", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9" + } + }, "cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", @@ -14311,9 +16351,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001434", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz", - "integrity": "sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA==" + "version": "1.0.30001517", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz", + "integrity": "sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==" }, "chai": { "version": "4.3.7", @@ -14339,11 +16379,6 @@ "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==" - }, "check-error": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", @@ -14362,16 +16397,6 @@ "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "requires": { - "is-glob": "^4.0.1" - } - } } }, "chownr": { @@ -14380,9 +16405,17 @@ "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" }, "ci-info": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.6.1.tgz", - "integrity": "sha512-up5ggbaDqOqJ4UqLKZ2naVkyqSJQgJi5lwD6b6mM748ysrghDBX0bx/qJTUHzw7zu6Mq4gycviSF5hJnwceD8w==" + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==" + }, + "citty": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.2.tgz", + "integrity": "sha512-Me9nf0/BEmMOnuQzMOVXgpzkMUNbd0Am8lTl/13p0aRGAoLGk5T5sdet/42CrIGmWdG67BgHUhcKK1my1ujUEg==", + "requires": { + "consola": "^3.2.3" + } }, "clean-regexp": { "version": "1.0.0", @@ -14393,32 +16426,10 @@ "escape-string-regexp": "^1.0.5" } }, - "cli-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", - "requires": { - "restore-cursor": "^4.0.0" - } - }, - "cli-spinners": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", - "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==" - }, - "cli-truncate": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", - "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", - "requires": { - "slice-ansi": "^5.0.0", - "string-width": "^5.0.0" - } - }, - "cli-width": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.0.0.tgz", - "integrity": "sha512-ZksGS2xpa/bYkNzN3BAw1wEjsLV/ZKOf/CCrJ/QOBsxx6fOARIkwTutxp1XIOIohi6HKmOFjMoK/XaqDVUpEEw==" + "clear": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/clear/-/clear-0.1.0.tgz", + "integrity": "sha512-qMjRnoL+JDPJHeLePZJuao6+8orzHMGP04A8CdwCNsKhRbOnKRjefxONR7bwILT3MHecxKBjHkKL/tkZ8r4Uzw==" }, "clipboardy": { "version": "3.0.0", @@ -14431,68 +16442,15 @@ } }, "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==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "requires": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", + "strip-ansi": "^6.0.0", "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==", - "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==", - "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==" - }, - "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==" - }, - "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==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "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==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - } } }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==" - }, "cluster-key-slot": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", @@ -14522,9 +16480,9 @@ "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" }, "colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" }, "combined-stream": { "version": "1.0.8", @@ -14561,9 +16519,9 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "consola": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", - "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", + "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==" }, "console-control-strings": { "version": "1.1.0", @@ -14578,7 +16536,8 @@ "cookie-es": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-0.5.0.tgz", - "integrity": "sha512-RyZrFi6PNpBFbIaQjXDlFIhFVqV42QeKSZX1yQIl6ihImq6vcHNGMtqQ/QzY3RMPuYSkvsRwtnt5M9NeYxKt0g==" + "integrity": "sha512-RyZrFi6PNpBFbIaQjXDlFIhFVqV42QeKSZX1yQIl6ihImq6vcHNGMtqQ/QzY3RMPuYSkvsRwtnt5M9NeYxKt0g==", + "dev": true }, "core-util-is": { "version": "1.0.3", @@ -14615,30 +16574,30 @@ } }, "css-declaration-sorter": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz", - "integrity": "sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", + "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", "requires": {} }, "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==", "requires": { "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" } }, "css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", "requires": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" } }, "css-what": { @@ -14651,70 +16610,90 @@ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" }, + "cssfilter": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz", + "integrity": "sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==" + }, "cssnano": { - "version": "5.1.14", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.14.tgz", - "integrity": "sha512-Oou7ihiTocbKqi0J1bB+TRJIQX5RMR3JghA8hcWSw9mjBLQ5Y3RWqEDoYG3sRNlAbCIXpqMoZGbq5KDR3vdzgw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.0.1.tgz", + "integrity": "sha512-fVO1JdJ0LSdIGJq68eIxOqFpIJrZqXUsBt8fkrBcztCQqAjQD51OhZp7tc0ImcbwXD4k7ny84QTV90nZhmqbkg==", "requires": { - "cssnano-preset-default": "^5.2.13", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" + "cssnano-preset-default": "^6.0.1", + "lilconfig": "^2.1.0" } }, "cssnano-preset-default": { - "version": "5.2.13", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.13.tgz", - "integrity": "sha512-PX7sQ4Pb+UtOWuz8A1d+Rbi+WimBIxJTRyBdgGp1J75VU0r/HFQeLnMYgHiCAp6AR4rqrc7Y4R+1Rjk3KJz6DQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.0.1.tgz", + "integrity": "sha512-7VzyFZ5zEB1+l1nToKyrRkuaJIx0zi/1npjvZfbBwbtNTzhLtlvYraK/7/uqmX2Wb2aQtd983uuGw79jAjLSuQ==", "requires": { "css-declaration-sorter": "^6.3.1", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.3", - "postcss-discard-comments": "^5.1.2", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.7", - "postcss-merge-rules": "^5.1.3", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.4", - "postcss-minify-selectors": "^5.2.1", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.1", - "postcss-normalize-repeat-style": "^5.1.1", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.1", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.1", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" + "cssnano-utils": "^4.0.0", + "postcss-calc": "^9.0.0", + "postcss-colormin": "^6.0.0", + "postcss-convert-values": "^6.0.0", + "postcss-discard-comments": "^6.0.0", + "postcss-discard-duplicates": "^6.0.0", + "postcss-discard-empty": "^6.0.0", + "postcss-discard-overridden": "^6.0.0", + "postcss-merge-longhand": "^6.0.0", + "postcss-merge-rules": "^6.0.1", + "postcss-minify-font-values": "^6.0.0", + "postcss-minify-gradients": "^6.0.0", + "postcss-minify-params": "^6.0.0", + "postcss-minify-selectors": "^6.0.0", + "postcss-normalize-charset": "^6.0.0", + "postcss-normalize-display-values": "^6.0.0", + "postcss-normalize-positions": "^6.0.0", + "postcss-normalize-repeat-style": "^6.0.0", + "postcss-normalize-string": "^6.0.0", + "postcss-normalize-timing-functions": "^6.0.0", + "postcss-normalize-unicode": "^6.0.0", + "postcss-normalize-url": "^6.0.0", + "postcss-normalize-whitespace": "^6.0.0", + "postcss-ordered-values": "^6.0.0", + "postcss-reduce-initial": "^6.0.0", + "postcss-reduce-transforms": "^6.0.0", + "postcss-svgo": "^6.0.0", + "postcss-unique-selectors": "^6.0.0" } }, "cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.0.tgz", + "integrity": "sha512-Z39TLP+1E0KUcd7LGyF4qMfu8ZufI0rDzhdyAMsa/8UyNUU8wpS0fhdBxbQbv32r64ea00h4878gommRVg2BHw==", "requires": {} }, "csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", "requires": { - "css-tree": "^1.1.2" + "css-tree": "~2.2.0" + }, + "dependencies": { + "css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "requires": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + } + }, + "mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==" + } } }, "csstype": { - "version": "2.6.21", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", - "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" }, "cuint": { "version": "0.2.2", @@ -14722,15 +16701,15 @@ "integrity": "sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==" }, "data-uri-to-buffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz", - "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==" + "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==" }, "de-indent": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", - "dev": true + "devOptional": true }, "debug": { "version": "4.3.4", @@ -14755,16 +16734,97 @@ "devOptional": true }, "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + "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==" }, - "defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "default-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", + "dev": true, "requires": { - "clone": "^1.0.2" + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^7.1.1", + "titleize": "^3.0.0" + }, + "dependencies": { + "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" + } + }, + "human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true + }, + "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 + }, + "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 + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "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 + } + } + }, + "default-browser-id": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", + "dev": true, + "requires": { + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" } }, "define-lazy-prop": { @@ -14773,9 +16833,9 @@ "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==" }, "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "dev": true, "requires": { "has-property-descriptors": "^1.0.0", @@ -14808,9 +16868,9 @@ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" }, "destr": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/destr/-/destr-1.2.2.tgz", - "integrity": "sha512-lrbCJwD9saUQrqUfXvl6qoM+QN3W7tLV5pAOs+OqOmopCCz/JkE05MHedJR1xfk4IAnZuJXPVuN5+7jNA2ZCiA==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.0.tgz", + "integrity": "sha512-FJ9RDpf3GicEBvzI3jxc2XhHzbqD8p4ANw/1kPsFBfTvP1b7Gn/Lg1vO7R9J4IVgoMbyUmFrFGZafJ1hPZpvlg==" }, "destroy": { "version": "1.2.0", @@ -14818,14 +16878,19 @@ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" }, "detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==" }, - "diff": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==" + "devalue": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-4.3.2.tgz", + "integrity": "sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==" + }, + "diff-sequences": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", + "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==" }, "dir-glob": { "version": "3.0.1", @@ -14845,13 +16910,13 @@ } }, "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==", "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" } }, "domelementtype": { @@ -14860,21 +16925,21 @@ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" }, "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==", "requires": { - "domelementtype": "^2.2.0" + "domelementtype": "^2.3.0" } }, "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==", "requires": { - "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" } }, "dot-prop": { @@ -14883,44 +16948,32 @@ "integrity": "sha512-Ol/IPXUARn9CSbkrdV4VJo7uCy1I3VuSiWCaFSg+8BdUOzF9n3jefIpcgAydvUZbTdEBZs2vEiTiS9m61ssiDA==", "requires": { "type-fest": "^2.11.2" - }, - "dependencies": { - "type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==" - } } }, "dotenv": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", - "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==" + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==" }, "duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" }, - "eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" - }, "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==" }, "electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==" + "version": "1.4.468", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.468.tgz", + "integrity": "sha512-6M1qyhaJOt7rQtNti1lBA0GwclPH+oKCmsra/hkcWs5INLxfXXD/dtdnaKUYQu/pjOBP/8Osoe4mAcNvvzoFag==" }, "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "encodeurl": { "version": "1.0.2", @@ -14936,18 +16989,18 @@ } }, "enhanced-resolve": { - "version": "5.11.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.11.0.tgz", - "integrity": "sha512-0Gcraf7gAJSQoPg+bTSXNhuzAYtXqLc4C011vb8S3B8XUSEkGYNBk20c68X9291VF4vvsCD8SPkr6Mza+DwU+g==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", "requires": { - "graceful-fs": "^4.2.9", + "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==" + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" }, "errno": { "version": "0.1.8", @@ -14967,36 +17020,61 @@ } }, "es-abstract": { - "version": "1.20.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz", - "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", "dev": true, "requires": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", + "get-intrinsic": "^1.2.1", "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", "gopd": "^1.0.1", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", + "object-inspect": "^1.12.3", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", "string.prototype.trimend": "^1.0.6", "string.prototype.trimstart": "^1.0.6", - "unbox-primitive": "^1.0.2" + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" + } + }, + "es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" } }, "es-shim-unscopables": { @@ -15020,39 +17098,33 @@ } }, "esbuild": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.15.tgz", - "integrity": "sha512-TEw/lwK4Zzld9x3FedV6jy8onOUHqcEX3ADFk4k+gzPUwrxn8nWV62tH0udo8jOtjFodlEfc4ypsqX3e+WWO6w==", - "requires": { - "@esbuild/android-arm": "0.15.15", - "@esbuild/linux-loong64": "0.15.15", - "esbuild-android-64": "0.15.15", - "esbuild-android-arm64": "0.15.15", - "esbuild-darwin-64": "0.15.15", - "esbuild-darwin-arm64": "0.15.15", - "esbuild-freebsd-64": "0.15.15", - "esbuild-freebsd-arm64": "0.15.15", - "esbuild-linux-32": "0.15.15", - "esbuild-linux-64": "0.15.15", - "esbuild-linux-arm": "0.15.15", - "esbuild-linux-arm64": "0.15.15", - "esbuild-linux-mips64le": "0.15.15", - "esbuild-linux-ppc64le": "0.15.15", - "esbuild-linux-riscv64": "0.15.15", - "esbuild-linux-s390x": "0.15.15", - "esbuild-netbsd-64": "0.15.15", - "esbuild-openbsd-64": "0.15.15", - "esbuild-sunos-64": "0.15.15", - "esbuild-windows-32": "0.15.15", - "esbuild-windows-64": "0.15.15", - "esbuild-windows-arm64": "0.15.15" - } - }, - "esbuild-linux-64": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.15.tgz", - "integrity": "sha512-217KPmWMirkf8liO+fj2qrPwbIbhNTGNVtvqI1TnOWJgcMjUWvd677Gq3fTzXEjilkx2yWypVnTswM2KbXgoAg==", - "optional": true + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.16.tgz", + "integrity": "sha512-1xLsOXrDqwdHxyXb/x/SOyg59jpf/SH7YMvU5RNSU7z3TInaASNJWNFJ6iRvLvLETZMasF3d1DdZLg7sgRimRQ==", + "requires": { + "@esbuild/android-arm": "0.18.16", + "@esbuild/android-arm64": "0.18.16", + "@esbuild/android-x64": "0.18.16", + "@esbuild/darwin-arm64": "0.18.16", + "@esbuild/darwin-x64": "0.18.16", + "@esbuild/freebsd-arm64": "0.18.16", + "@esbuild/freebsd-x64": "0.18.16", + "@esbuild/linux-arm": "0.18.16", + "@esbuild/linux-arm64": "0.18.16", + "@esbuild/linux-ia32": "0.18.16", + "@esbuild/linux-loong64": "0.18.16", + "@esbuild/linux-mips64el": "0.18.16", + "@esbuild/linux-ppc64": "0.18.16", + "@esbuild/linux-riscv64": "0.18.16", + "@esbuild/linux-s390x": "0.18.16", + "@esbuild/linux-x64": "0.18.16", + "@esbuild/netbsd-x64": "0.18.16", + "@esbuild/openbsd-x64": "0.18.16", + "@esbuild/sunos-x64": "0.18.16", + "@esbuild/win32-arm64": "0.18.16", + "@esbuild/win32-ia32": "0.18.16", + "@esbuild/win32-x64": "0.18.16" + } }, "escalade": { "version": "3.1.1", @@ -15069,14 +17141,37 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" }, + "escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "source-map": "~0.6.1" + }, + "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 + } + } + }, "eslint": { - "version": "8.28.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.28.0.tgz", - "integrity": "sha512-S27Di+EVyMxcHiwDrFzk8dJYAaD+/5SoWKxL1ri/71CRHsnJnRDPNt2Kzj24+MT9FDupf4aqqyqPrvI8MvQ4VQ==", + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz", + "integrity": "sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==", "devOptional": true, "requires": { - "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.11.6", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.1.0", + "@eslint/js": "8.44.0", + "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", @@ -15085,34 +17180,29 @@ "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.6.0", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.15.0", - "grapheme-splitter": "^1.0.4", + "globals": "^13.19.0", + "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "dependencies": { @@ -15157,9 +17247,9 @@ "devOptional": true }, "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.1.tgz", + "integrity": "sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==", "devOptional": true, "requires": { "esrecurse": "^4.3.0", @@ -15167,9 +17257,9 @@ } }, "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "devOptional": true }, "estraverse": { @@ -15178,10 +17268,19 @@ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "devOptional": true }, + "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==", + "devOptional": true, + "requires": { + "is-glob": "^4.0.3" + } + }, "globals": { - "version": "13.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz", - "integrity": "sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==", + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "devOptional": true, "requires": { "type-fest": "^0.20.2" @@ -15211,27 +17310,28 @@ } }, "eslint-config-prettier": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", - "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", + "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", "dev": true, "requires": {} }, "eslint-config-standard": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.0.0.tgz", - "integrity": "sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==", + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", + "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", "dev": true, "requires": {} }, "eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", "dev": true, "requires": { "debug": "^3.2.7", - "resolve": "^1.20.0" + "is-core-module": "^2.11.0", + "resolve": "^1.22.1" }, "dependencies": { "debug": { @@ -15246,24 +17346,25 @@ } }, "eslint-import-resolver-typescript": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.2.tgz", - "integrity": "sha512-zX4ebnnyXiykjhcBvKIf5TNvt8K7yX6bllTRZ14MiurKPjDpCAZujlszTdB8pcNXhZcOf+god4s9SjQa5GnytQ==", + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.5.tgz", + "integrity": "sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==", "dev": true, "requires": { "debug": "^4.3.4", - "enhanced-resolve": "^5.10.0", - "get-tsconfig": "^4.2.0", - "globby": "^13.1.2", - "is-core-module": "^2.10.0", + "enhanced-resolve": "^5.12.0", + "eslint-module-utils": "^2.7.4", + "get-tsconfig": "^4.5.0", + "globby": "^13.1.3", + "is-core-module": "^2.11.0", "is-glob": "^4.0.3", - "synckit": "^0.8.4" + "synckit": "^0.8.5" } }, "eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", "dev": true, "requires": { "debug": "^3.2.7" @@ -15308,33 +17409,35 @@ } }, "eslint-plugin-import": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", - "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", + "version": "2.27.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", + "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", "dev": true, "requires": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.3", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.7.4", "has": "^1.0.3", - "is-core-module": "^2.8.1", + "is-core-module": "^2.11.0", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", + "object.values": "^1.1.6", + "resolve": "^1.22.1", + "semver": "^6.3.0", "tsconfig-paths": "^3.14.1" }, "dependencies": { "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "doctrine": { @@ -15345,19 +17448,13 @@ "requires": { "esutils": "^2.0.2" } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true } } }, "eslint-plugin-n": { - "version": "15.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.6.0.tgz", - "integrity": "sha512-Hd/F7wz4Mj44Jp0H6Jtty13NcE69GNTY0rVlgTIj1XBnGGVI6UTdDrpE6vqu3AHo07bygq/N+7OH/lgz1emUJw==", + "version": "15.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz", + "integrity": "sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==", "dev": true, "requires": { "builtins": "^5.0.1", @@ -15370,14 +17467,29 @@ "semver": "^7.3.8" }, "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } } }, @@ -15433,24 +17545,40 @@ "vue-eslint-parser": "^9.0.3" }, "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } } }, "eslint-plugin-prettier": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.0.tgz", + "integrity": "sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==", "dev": true, "requires": { - "prettier-linter-helpers": "^1.0.0" + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.5" } }, "eslint-plugin-promise": { @@ -15482,40 +17610,70 @@ "strip-indent": "^3.0.0" }, "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } } }, "eslint-plugin-vue": { - "version": "9.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.7.0.tgz", - "integrity": "sha512-DrOO3WZCZEwcLsnd3ohFwqCoipGRSTKTBTnLwdhqAbYZtzWl0o7D+D8ZhlmiZvABKTEl8AFsqH1GHGdybyoQmw==", + "version": "9.15.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.15.1.tgz", + "integrity": "sha512-CJE/oZOslvmAR9hf8SClTdQ9JLweghT6JCBQNrT2Iel1uVw0W0OLJxzvPd6CxmABKCvLrtyDnqGV37O7KQv6+A==", "dev": true, "requires": { - "eslint-utils": "^3.0.0", + "@eslint-community/eslint-utils": "^4.3.0", "natural-compare": "^1.4.0", "nth-check": "^2.0.1", "postcss-selector-parser": "^6.0.9", "semver": "^7.3.5", - "vue-eslint-parser": "^9.0.1", + "vue-eslint-parser": "^9.3.0", "xml-name-validator": "^4.0.0" }, "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } } }, @@ -15533,7 +17691,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "devOptional": true, + "dev": true, "requires": { "eslint-visitor-keys": "^2.0.0" } @@ -15542,31 +17700,37 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "devOptional": true + "dev": true }, "espree": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", - "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "devOptional": true, "requires": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.1" }, "dependencies": { "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "devOptional": true } } }, + "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 + }, "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "devOptional": true, "requires": { "estraverse": "^5.1.0" @@ -15604,9 +17768,12 @@ "dev": true }, "estree-walker": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.1.tgz", - "integrity": "sha512-woY0RUD87WzMBUiZLx8NsYr23N5BKsOMZHhu2hoNRVh6NXGfoiT1KOL8G3UHlJAnEDGmfa5ubNA/AacfG+Kb0g==" + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "requires": { + "@types/estree": "^1.0.0" + } }, "esutils": { "version": "2.0.3", @@ -15640,25 +17807,15 @@ "strip-final-newline": "^2.0.0" } }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, "externality": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/externality/-/externality-1.0.0.tgz", - "integrity": "sha512-MAU9ci3XdpqOX1aoIoyL2DMzW97P8LYeJxIUkfXhOfsrkH4KLHFaYDwKN0B2l6tqedVJWiTIJtWmxmZfa05vOQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/externality/-/externality-1.0.2.tgz", + "integrity": "sha512-LyExtJWKxtgVzmgtEHyQtLFpw1KFhQphF9nTG8TpAIVkiI/xQ3FJh75tRFLYl4hkn7BNIIdLJInuDAavX35pMw==", "requires": { - "enhanced-resolve": "^5.10.0", - "mlly": "^1.0.0", - "pathe": "^1.0.0", - "ufo": "^1.0.0" + "enhanced-resolve": "^5.14.1", + "mlly": "^1.3.0", + "pathe": "^1.1.1", + "ufo": "^1.1.2" } }, "fast-deep-equal": { @@ -15668,31 +17825,21 @@ "devOptional": true }, "fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", "dev": true }, "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.4" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "requires": { - "is-glob": "^4.0.1" - } - } } }, "fast-json-stable-stringify": { @@ -15708,9 +17855,9 @@ "devOptional": true }, "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "requires": { "reusify": "^1.0.4" } @@ -15724,22 +17871,6 @@ "web-streams-polyfill": "^3.0.3" } }, - "figures": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", - "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", - "requires": { - "escape-string-regexp": "^5.0.0", - "is-unicode-supported": "^1.2.0" - }, - "dependencies": { - "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==" - } - } - }, "file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -15807,6 +17938,15 @@ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, "foreground-child": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", @@ -15850,20 +17990,15 @@ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" }, "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", "requires": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, - "fs-memo": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fs-memo/-/fs-memo-1.2.0.tgz", - "integrity": "sha512-YEexkCpL4j03jn5SxaMHqcO6IuWuqm8JFUYhyCep7Ao89JIYmB8xoKhK7zXXJ9cCaNXpyNH5L3QtAmoxjoHW2w==" - }, "fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", @@ -15879,6 +18014,11 @@ "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==" } } }, @@ -15930,23 +18070,6 @@ "string-width": "^4.2.3", "strip-ansi": "^6.0.1", "wide-align": "^1.1.2" - }, - "dependencies": { - "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==" - }, - "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==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - } } }, "gensync": { @@ -15960,27 +18083,25 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==" }, "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3" } }, "get-port-please": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/get-port-please/-/get-port-please-2.6.1.tgz", - "integrity": "sha512-4PDSrL6+cuMM1xs6w36ZIkaKzzE0xzfVBCfebHIJ3FE8iB9oic/ECwPw3iNiD4h1AoJ5XLLBhEviFAVrZsDC5A==", - "requires": { - "fs-memo": "^1.2.0" - } + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/get-port-please/-/get-port-please-3.0.1.tgz", + "integrity": "sha512-R5pcVO8Z1+pVDu8Ml3xaJCEkBiiy1VQN9za0YqH8GIi1nIqD4IzQhzY6dDzMRtdS1lyiGlucRzm8IN8wtLIXng==" }, "get-stream": { "version": "6.0.1", @@ -15998,10 +18119,13 @@ } }, "get-tsconfig": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.2.0.tgz", - "integrity": "sha512-X8u8fREiYOE6S8hLbq99PeykTDoLVnxvF4DjWKJmz9xy2nNRdUcV8ZN9tniJFeKyTU3qnC9lL8n4Chd6LmVKHg==", - "dev": true + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.6.2.tgz", + "integrity": "sha512-E5XrT4CbbXcXWy+1jChlZmrmCwd5KGx502kDCXJJ7y898TtWW9FwoG5HfOLVRKmlmDGkWN2HM9Ho+/Y8F0sJDg==", + "dev": true, + "requires": { + "resolve-pkg-maps": "^1.0.0" + } }, "giget": { "version": "1.1.2", @@ -16040,9 +18164,9 @@ } }, "glob": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -16060,9 +18184,9 @@ } }, "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "requires": { "brace-expansion": "^2.0.1" } @@ -16070,12 +18194,11 @@ } }, "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==", - "devOptional": true, + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "requires": { - "is-glob": "^4.0.3" + "is-glob": "^4.0.1" } }, "globals": { @@ -16083,30 +18206,27 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, - "globalyzer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", - "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==", - "dev": true + "globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3" + } }, "globby": { - "version": "13.1.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz", - "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==", + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "requires": { "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" } }, - "globrex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", - "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", - "dev": true - }, "gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -16117,14 +18237,14 @@ } }, "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + "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==" }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "devOptional": true }, "gzip-size": { @@ -16136,14 +18256,24 @@ } }, "h3": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/h3/-/h3-1.0.1.tgz", - "integrity": "sha512-gDCGpRvjchZW2JBlTqbJ9IOs+mdkXXuwSQkSye+jubHAv/UhdamKqoQvd4RFgyBNjHSId8Y+b10UdTcPlP/V+w==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/h3/-/h3-1.7.1.tgz", + "integrity": "sha512-A9V2NEDNHet7v1gCg7CMwerSigLi0SRbhTy7C3lGb0N4YKIpPmLDjedTUopqp4dnn7COHfqUjjaz3zbtz4QduA==", "requires": { - "cookie-es": "^0.5.0", - "destr": "^1.2.1", - "radix3": "^1.0.0", - "ufo": "^1.0.0" + "cookie-es": "^1.0.0", + "defu": "^6.1.2", + "destr": "^2.0.0", + "iron-webcrypto": "^0.7.0", + "radix3": "^1.0.1", + "ufo": "^1.1.2", + "uncrypto": "^0.1.3" + }, + "dependencies": { + "cookie-es": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.0.0.tgz", + "integrity": "sha512-mWYvfOLrfEc996hlKcdABeIiPHUPC6DM2QYZdGGOvhOTbA3tjm2eBwqlJpoFdjC89NI4Qt6h0Pu06Mp+1Pj5OQ==" + } } }, "has": { @@ -16174,6 +18304,11 @@ "get-intrinsic": "^1.1.1" } }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -16202,12 +18337,12 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true + "devOptional": true }, "hookable": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.4.2.tgz", - "integrity": "sha512-6rOvaUiNKy9lET1X0ECnyZ5O5kSV0PJbtA5yZUgdEF7fGJEVwSLSislltyt7nFwVVALYHQJtfGeAR2Y0A0uJkg==" + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==" }, "hosted-git-info": { "version": "2.8.9", @@ -16221,9 +18356,9 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" }, "html-tags": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", - "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==" + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==" }, "http-errors": { "version": "2.0.0", @@ -16237,6 +18372,14 @@ "toidentifier": "1.0.1" } }, + "http-graceful-shutdown": { + "version": "3.1.13", + "resolved": "https://registry.npmjs.org/http-graceful-shutdown/-/http-graceful-shutdown-3.1.13.tgz", + "integrity": "sha512-Ci5LRufQ8AtrQ1U26AevS8QoMXDOhnAHCJI3eZu1com7mZGHxREmw3dNj85ftpQokQCvak8nI2pnFS8zyM1M+Q==", + "requires": { + "debug": "^4.3.4" + } + }, "http-proxy": { "version": "1.18.1", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", @@ -16266,14 +18409,6 @@ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" }, - "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", @@ -16285,9 +18420,9 @@ "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==" }, "immutable": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", - "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==" + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.1.tgz", + "integrity": "sha512-lj9cnmB/kVS0QHsJnYKD1uo3o39nrbKxszjnqS9Fr6NB7bZzW45U6WSGBPKXDL/CvDKqDNPA4r3DoDQ8GTxo2A==" }, "import-fresh": { "version": "3.3.0", @@ -16330,68 +18465,26 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, - "inquirer": { - "version": "9.1.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.1.4.tgz", - "integrity": "sha512-9hiJxE5gkK/cM2d1mTEnuurGTAoHebbkX0BYl3h7iEg7FYfuNIom+nDfBCSWtvSnoSrWCeBxqqBZu26xdlJlXA==", - "requires": { - "ansi-escapes": "^6.0.0", - "chalk": "^5.1.2", - "cli-cursor": "^4.0.0", - "cli-width": "^4.0.0", - "external-editor": "^3.0.3", - "figures": "^5.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^6.1.2", - "run-async": "^2.4.0", - "rxjs": "^7.5.7", - "string-width": "^5.1.2", - "strip-ansi": "^7.0.1", - "through": "^2.3.6", - "wrap-ansi": "^8.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" - }, - "chalk": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.1.2.tgz", - "integrity": "sha512-E5CkT4jWURs1Vy5qGJye+XwCkNj7Od3Af7CP6SujMetSMkLs8Do2RWJK5yx1wamHV/op8Rz+9rltjaTQWDnEFQ==" - }, - "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "requires": { - "ansi-regex": "^6.0.1" - } - } - } - }, "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", "dev": true, "requires": { - "get-intrinsic": "^1.1.0", + "get-intrinsic": "^1.2.0", "has": "^1.0.3", "side-channel": "^1.0.4" } }, "ioredis": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.2.4.tgz", - "integrity": "sha512-qIpuAEt32lZJQ0XyrloCRdlEdUUNGG9i0UOk6zgzK6igyudNWqEBxfH6OlbnOOoBBvr1WB02mm8fR55CnikRng==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.3.2.tgz", + "integrity": "sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==", "requires": { "@ioredis/commands": "^1.1.1", "cluster-key-slot": "^1.1.0", "debug": "^4.3.4", - "denque": "^2.0.1", + "denque": "^2.1.0", "lodash.defaults": "^4.2.0", "lodash.isarguments": "^3.1.0", "redis-errors": "^1.2.0", @@ -16399,10 +18492,21 @@ "standard-as-callback": "^2.1.0" } }, - "ip-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-5.0.0.tgz", - "integrity": "sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw==" + "iron-webcrypto": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-0.7.1.tgz", + "integrity": "sha512-K/UmlEhPCPXEHV5hAtH5C0tI5JnFuOrv4yO/j7ODPl3HaiiHBLbOLTde+ieUaAyfCATe4LoAnclyF+hmSCOVmQ==" + }, + "is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + } }, "is-arrayish": { "version": "0.2.1", @@ -16438,9 +18542,9 @@ } }, "is-builtin-module": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.0.tgz", - "integrity": "sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", + "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", "requires": { "builtin-modules": "^3.3.0" } @@ -16452,9 +18556,9 @@ "dev": true }, "is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", "requires": { "has": "^1.0.3" } @@ -16497,10 +18601,14 @@ "integrity": "sha512-FeMLiqf8E5g6SdiVJsPcNZX8k4h2fBs1wp5Bb6uaNxn58ufK1axBqQZdmAQsqh0t9BuwFObybrdVJh6MKyPlyg==", "dev": true }, - "is-interactive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==" + "is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "requires": { + "is-docker": "^3.0.0" + } }, "is-module": { "version": "1.0.0", @@ -16601,10 +18709,14 @@ "has-symbols": "^1.0.2" } }, - "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==" + "is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, + "requires": { + "which-typed-array": "^1.1.11" + } }, "is-weakref": { "version": "1.0.2", @@ -16631,9 +18743,10 @@ } }, "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true }, "isexe": { "version": "2.0.0", @@ -16679,48 +18792,17 @@ "istanbul-lib-report": "^3.0.0" } }, - "jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.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==" - }, - "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" - } - } - } - }, "jiti": { - "version": "1.17.2", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.17.2.tgz", - "integrity": "sha512-Xf0nU8+8wuiQpLcqdb2HRyHqYwGk2Pd+F7kstyp20ZuqTyCmB9dqpX2NxaxFc1kovraa2bG6c1RL3W7XfapiZg==" + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.19.1.tgz", + "integrity": "sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==" }, "js-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.1.tgz", - "integrity": "sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", + "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==", "dev": true }, - "js-sdsl": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", - "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==", - "devOptional": true - }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -16730,7 +18812,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "devOptional": true, "requires": { "argparse": "^2.0.1" } @@ -16824,10 +18905,20 @@ "universalify": "^2.0.0" } }, + "just-performance": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/just-performance/-/just-performance-4.3.0.tgz", + "integrity": "sha512-L7RjvtJsL0QO8xFs5wEoDDzzJwoiowRw6Rn/GnvldlchS2JQr9wFYPiwZcDfrbbujEKqKN0tvENdbjXdYhDp5Q==" + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" + }, "klona": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", - "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==" + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==" }, "knitwork": { "version": "1.0.0", @@ -16842,10 +18933,15 @@ "readable-stream": "^2.0.5" }, "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -16856,11 +18952,6 @@ "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==" - }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -16882,9 +18973,17 @@ } }, "lilconfig": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", - "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==" + }, + "limiter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-2.1.0.tgz", + "integrity": "sha512-361TYz6iay6n+9KvUUImqdLuFigK+K79qrUtBsXhJTLdH4rIt/r1y8r1iozwh8KbZNpujbFTSh74mJ7bwbAMOw==", + "requires": { + "just-performance": "4.3.0" + } }, "lines-and-columns": { "version": "1.2.4", @@ -16893,18 +18992,21 @@ "dev": true }, "listhen": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/listhen/-/listhen-1.0.0.tgz", - "integrity": "sha512-frdf7TVqT/JSHzRjEuo/vWIgbBYzEuY3oeTq8Yv1XkQVTKDPs2M4yotXICqYZYj2QxbkqKssSo8Wa6QCtBnFhg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/listhen/-/listhen-1.1.2.tgz", + "integrity": "sha512-rLX5V57oonazmc6zoZ2LzfbSOfGzDOLdQ/eTEh/d3f1xYMACH1yIU8nr0YGl2WiR+l31o3QCN4/VH2dUNyYvTA==", "requires": { + "citty": "^0.1.2", "clipboardy": "^3.0.0", - "colorette": "^2.0.19", - "defu": "^6.1.1", - "get-port-please": "^2.6.1", + "consola": "^3.2.3", + "defu": "^6.1.2", + "get-port-please": "^3.0.1", "http-shutdown": "^1.2.2", - "ip-regex": "^5.0.0", + "jiti": "^1.19.1", + "mlly": "^1.4.0", "node-forge": "^1.3.1", - "ufo": "^1.0.0" + "pathe": "^1.1.1", + "ufo": "^1.1.2" } }, "local-pkg": { @@ -16923,12 +19025,8 @@ "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==" + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true }, "lodash.debounce": { "version": "4.0.8", @@ -16976,48 +19074,15 @@ "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==" }, - "lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "lodash.templatesettings": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", - "requires": { - "lodash._reinterpolate": "^3.0.0" - } - }, "lodash.union": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==" }, "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" - }, - "log-symbols": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", - "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", - "requires": { - "chalk": "^5.0.0", - "is-unicode-supported": "^1.1.0" - }, - "dependencies": { - "chalk": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.1.2.tgz", - "integrity": "sha512-E5CkT4jWURs1Vy5qGJye+XwCkNj7Od3Af7CP6SujMetSMkLs8Do2RWJK5yx1wamHV/op8Rz+9rltjaTQWDnEFQ==" - } - } + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" }, "loupe": { "version": "2.3.6", @@ -17028,19 +19093,37 @@ } }, "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==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "requires": { - "yallist": "^4.0.0" + "yallist": "^3.0.2" } }, "magic-string": { - "version": "0.26.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz", - "integrity": "sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.13" + } + }, + "magic-string-ast": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/magic-string-ast/-/magic-string-ast-0.2.0.tgz", + "integrity": "sha512-GHev7SFZZrIFy+ZyNJOJpK88KoGSn6FUOhGJXSdHhPt7Q6htJKTiKkdGcJFKp9Tt3P4SIL/P+ro0jZ7BSV8KMw==", "requires": { - "sourcemap-codec": "^1.4.8" + "magic-string": "^0.30.1" + }, + "dependencies": { + "magic-string": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", + "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + } } }, "make-dir": { @@ -17052,9 +19135,14 @@ } }, "mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==" + }, + "memory-cache": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/memory-cache/-/memory-cache-0.2.0.tgz", + "integrity": "sha512-OcjA+jzjOYzKmKS6IQVALHLVz+rNTMPoJvCztFaZxwG14wtAW7VRZjwTQu06vKCYOxh4jVnik7ya0SXTB0W+xA==" }, "memory-fs": { "version": "0.5.0", @@ -17065,10 +19153,15 @@ "readable-stream": "^2.0.1" }, "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -17079,11 +19172,6 @@ "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==" - }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -17151,15 +19239,15 @@ } }, "minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true }, "minipass": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.4.tgz", - "integrity": "sha512-lwycX3cBMTvcejsHITUgYj6Gy6A7Nh4Q6h9NP4sTHY1ccJlC7yKzDmiShEHsJ16Jf1nKGDEaiHxiltsJEvk0nQ==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==" }, "minizlib": { "version": "2.1.2", @@ -17177,28 +19265,28 @@ "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==" } } }, - "mkdir": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/mkdir/-/mkdir-0.0.2.tgz", - "integrity": "sha512-98OnjcWaNEIRUJJe9rFoWlbkQ5n9z8F86wIPCrI961YEViiVybTuJln919WuuSHSnlrqXy0ELKCntoPy8C7lqg==" - }, "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" }, "mlly": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.1.1.tgz", - "integrity": "sha512-Jnlh4W/aI4GySPo6+DyTN17Q75KKbLTyFK8BrGhjNP4rxuUjbRWhE6gHg3bs33URWAF44FRm7gdQA348i3XxRw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.0.tgz", + "integrity": "sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==", "requires": { - "acorn": "^8.8.2", - "pathe": "^1.1.0", - "pkg-types": "^1.0.1", - "ufo": "^1.1.0" + "acorn": "^8.9.0", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "ufo": "^1.1.2" } }, "mri": { @@ -17212,20 +19300,15 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "muggle-string": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.1.0.tgz", - "integrity": "sha512-Tr1knR3d2mKvvWthlk7202rywKbiOm4rVFLsfAaSIhJ6dt9o47W4S+JMtWhd/PW9Wrdew2/S2fSvhz3E2gkfEg==", - "dev": true - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.3.1.tgz", + "integrity": "sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==", + "devOptional": true }, "nanoid": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.0.tgz", - "integrity": "sha512-IgBP8piMxe/gf73RTQx7hmnhwz0aaEXYakvqZyE302IXW3HyVNhdNGC+O2MwMAVhLEnvXlvKtGbtJf6wvHihCg==" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz", + "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==" }, "natural-compare": { "version": "1.4.0", @@ -17240,68 +19323,74 @@ "dev": true }, "nitropack": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/nitropack/-/nitropack-1.0.0.tgz", - "integrity": "sha512-788lHgNgC+NKqecwFgMkAQTuTXwuh2hEgOk2sLwV3qPVUogxrl6P3m5eKdt6Mtzx+mlXIw0G/P90B5TNWEqDSQ==", - "requires": { - "@cloudflare/kv-asset-handler": "^0.2.0", - "@netlify/functions": "^1.3.0", - "@rollup/plugin-alias": "^4.0.2", - "@rollup/plugin-commonjs": "^23.0.2", - "@rollup/plugin-inject": "^5.0.2", - "@rollup/plugin-json": "^5.0.1", - "@rollup/plugin-node-resolve": "^15.0.1", - "@rollup/plugin-replace": "^5.0.1", - "@rollup/plugin-wasm": "^6.0.1", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/nitropack/-/nitropack-2.5.2.tgz", + "integrity": "sha512-hXEHY9NJmOOETFFTPCBB9PB0+txoAbU/fB2ovUF6UMRo4ucQZztYnZdX+YSxa6FVz6eONvcxXvf9/9s6t08KWw==", + "requires": { + "@cloudflare/kv-asset-handler": "^0.3.0", + "@netlify/functions": "^1.6.0", + "@rollup/plugin-alias": "^5.0.0", + "@rollup/plugin-commonjs": "^25.0.2", + "@rollup/plugin-inject": "^5.0.3", + "@rollup/plugin-json": "^6.0.0", + "@rollup/plugin-node-resolve": "^15.1.0", + "@rollup/plugin-replace": "^5.0.2", + "@rollup/plugin-terser": "^0.4.3", + "@rollup/plugin-wasm": "^6.1.3", "@rollup/pluginutils": "^5.0.2", - "@vercel/nft": "^0.22.1", + "@types/http-proxy": "^1.17.11", + "@vercel/nft": "^0.22.6", "archiver": "^5.3.1", - "c12": "^1.0.1", - "chalk": "^5.1.2", + "c12": "^1.4.2", + "chalk": "^5.2.0", "chokidar": "^3.5.3", - "consola": "^2.15.3", - "cookie-es": "^0.5.0", - "defu": "^6.1.1", - "destr": "^1.2.1", + "citty": "^0.1.1", + "consola": "^3.2.2", + "cookie-es": "^1.0.0", + "defu": "^6.1.2", + "destr": "^2.0.0", "dot-prop": "^7.2.0", - "esbuild": "^0.15.14", + "esbuild": "^0.18.10", "escape-string-regexp": "^5.0.0", "etag": "^1.8.1", - "fs-extra": "^10.1.0", - "globby": "^13.1.2", + "fs-extra": "^11.1.1", + "globby": "^13.2.0", "gzip-size": "^7.0.0", - "h3": "^1.0.1", - "hookable": "^5.4.2", + "h3": "^1.7.1", + "hookable": "^5.5.3", + "http-graceful-shutdown": "^3.1.13", "http-proxy": "^1.18.1", "is-primitive": "^3.0.1", - "jiti": "^1.16.0", - "klona": "^2.0.5", + "jiti": "^1.18.2", + "klona": "^2.0.6", "knitwork": "^1.0.0", - "listhen": "^1.0.0", + "listhen": "^1.0.4", + "magic-string": "^0.30.0", "mime": "^3.0.0", - "mlly": "^1.0.0", + "mlly": "^1.4.0", "mri": "^1.2.0", - "node-fetch-native": "^1.0.1", - "ofetch": "^1.0.0", - "ohash": "^1.0.0", - "pathe": "^1.0.0", - "perfect-debounce": "^0.1.3", - "pkg-types": "^1.0.1", - "pretty-bytes": "^6.0.0", - "radix3": "^1.0.0", - "rollup": "^2.79.1", - "rollup-plugin-terser": "^7.0.2", - "rollup-plugin-visualizer": "^5.8.3", + "node-fetch-native": "^1.2.0", + "ofetch": "^1.1.1", + "ohash": "^1.1.2", + "openapi-typescript": "^6.2.8", + "pathe": "^1.1.1", + "perfect-debounce": "^1.0.0", + "pkg-types": "^1.0.3", + "pretty-bytes": "^6.1.0", + "radix3": "^1.0.1", + "rollup": "^3.25.3", + "rollup-plugin-visualizer": "^5.9.2", "scule": "^1.0.0", - "semver": "^7.3.8", + "semver": "^7.5.3", "serve-placeholder": "^2.0.1", "serve-static": "^1.15.0", "source-map-support": "^0.5.21", - "std-env": "^3.3.1", - "ufo": "^1.0.0", - "unenv": "^1.0.0", - "unimport": "^1.0.0", - "unstorage": "^1.0.1" + "std-env": "^3.3.3", + "ufo": "^1.1.2", + "uncrypto": "^0.1.3", + "unenv": "^1.5.1", + "unimport": "^3.0.11", + "unstorage": "^1.7.0" }, "dependencies": { "@rollup/pluginutils": { @@ -17315,9 +19404,14 @@ } }, "chalk": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.1.2.tgz", - "integrity": "sha512-E5CkT4jWURs1Vy5qGJye+XwCkNj7Od3Af7CP6SujMetSMkLs8Do2RWJK5yx1wamHV/op8Rz+9rltjaTQWDnEFQ==" + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==" + }, + "cookie-es": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.0.0.tgz", + "integrity": "sha512-mWYvfOLrfEc996hlKcdABeIiPHUPC6DM2QYZdGGOvhOTbA3tjm2eBwqlJpoFdjC89NI4Qt6h0Pu06Mp+1Pj5OQ==" }, "escape-string-regexp": { "version": "5.0.0", @@ -17329,13 +19423,34 @@ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "magic-string": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", + "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "requires": { "lru-cache": "^6.0.0" } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, @@ -17345,9 +19460,9 @@ "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==" }, "node-fetch": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.0.tgz", - "integrity": "sha512-BKwRP/O0UvoMKp7GNdwPlObhYGB5DQqwhEDQlNKuoqwVYSxkSZCSbHjnFFmUEtwSKRPU4kNK8PbDYYitwaE3QA==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.1.tgz", + "integrity": "sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==", "requires": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", @@ -17355,9 +19470,9 @@ } }, "node-fetch-native": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.0.2.tgz", - "integrity": "sha512-KIkvH1jl6b3O7es/0ShyCgWLcfXxlBrLBbP3rOr23WArC66IMcU4DeZEeYEOwnopYhawLTn7/y+YtmASe8DFVQ==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.2.0.tgz", + "integrity": "sha512-5IAMBTl9p6PaAjYCnMv5FmqIF6GcZnawAVnzaCG0rX2aYZJ4CxEkZNtVPuTRug7fL7wyM5BQYTlAzcyMPi6oTQ==" }, "node-forge": { "version": "1.3.1", @@ -17365,14 +19480,14 @@ "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" }, "node-gyp-build": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", - "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==" + "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==" }, "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" + "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==" }, "nopt": { "version": "5.0.0", @@ -17395,9 +19510,9 @@ }, "dependencies": { "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 } } @@ -17412,11 +19527,6 @@ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==" }, - "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" - }, "npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -17445,79 +19555,279 @@ } }, "nuxi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/nuxi/-/nuxi-3.0.0.tgz", - "integrity": "sha512-VWh1kKFffxD2yadZWcQSd6eTf9okXRr7d3HsjLiI4B3Q1/8iKdIUiodGo7X71OZ+gPVnX6Oh/XFzcb7mr+8TbQ==", + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/nuxi/-/nuxi-3.6.5.tgz", + "integrity": "sha512-4XEXYz71UiWWiKC1/cJCzqRSUEImYRmjcvKpSsBKMU58ALYVSx5KIoas5SwLO8tEKO5BS4DAe4u7MYix7hfuHQ==", "requires": { "fsevents": "~2.3.2" } }, "nuxt": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/nuxt/-/nuxt-3.0.0.tgz", - "integrity": "sha512-RNlD78uv04ZiXWmlx9f1tnJfrqsYAWHU+4gbgOTQpIBmQzHWPWiox+fm/1m93iKfEd5sJi9TJUoXX5yBObVZYw==", - "requires": { - "@nuxt/devalue": "^2.0.0", - "@nuxt/kit": "3.0.0", - "@nuxt/schema": "3.0.0", - "@nuxt/telemetry": "^2.1.8", - "@nuxt/ui-templates": "^1.0.0", - "@nuxt/vite-builder": "3.0.0", - "@unhead/ssr": "^1.0.0", - "@vue/reactivity": "^3.2.45", - "@vue/shared": "^3.2.45", - "@vueuse/head": "^1.0.15", + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/nuxt/-/nuxt-3.6.5.tgz", + "integrity": "sha512-0A7V8B1HrIXX9IlqPc2w+5ZPXi+7MYa9QVhtuGYuLvjRKoSFANhCoMPRP6pKdoxigM1MBxhLue2VmHA/VbtJCw==", + "requires": { + "@nuxt/devalue": "^2.0.2", + "@nuxt/kit": "3.6.5", + "@nuxt/schema": "3.6.5", + "@nuxt/telemetry": "^2.3.0", + "@nuxt/ui-templates": "^1.2.0", + "@nuxt/vite-builder": "3.6.5", + "@unhead/ssr": "^1.1.30", + "@unhead/vue": "^1.1.30", + "@vue/shared": "^3.3.4", + "acorn": "8.10.0", + "c12": "^1.4.2", "chokidar": "^3.5.3", - "cookie-es": "^0.5.0", - "defu": "^6.1.1", - "destr": "^1.2.1", + "cookie-es": "^1.0.0", + "defu": "^6.1.2", + "destr": "^2.0.0", + "devalue": "^4.3.2", + "esbuild": "^0.18.11", "escape-string-regexp": "^5.0.0", - "estree-walker": "^3.0.1", - "fs-extra": "^10.1.0", - "globby": "^13.1.2", - "h3": "^1.0.1", - "hash-sum": "^2.0.0", - "hookable": "^5.4.2", + "estree-walker": "^3.0.3", + "fs-extra": "^11.1.1", + "globby": "^13.2.2", + "h3": "^1.7.1", + "hookable": "^5.5.3", + "jiti": "^1.19.1", + "klona": "^2.0.6", "knitwork": "^1.0.0", - "magic-string": "^0.26.7", - "mlly": "^1.0.0", - "nitropack": "^1.0.0", - "nuxi": "3.0.0", - "ofetch": "^1.0.0", - "ohash": "^1.0.0", - "pathe": "^1.0.0", - "perfect-debounce": "^0.1.3", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.1", + "mlly": "^1.4.0", + "nitropack": "^2.5.2", + "nuxi": "3.6.5", + "nypm": "^0.2.2", + "ofetch": "^1.1.1", + "ohash": "^1.1.2", + "pathe": "^1.1.1", + "perfect-debounce": "^1.0.0", + "prompts": "^2.4.2", "scule": "^1.0.0", - "strip-literal": "^1.0.0", - "ufo": "^1.0.0", - "ultrahtml": "^1.0.0", - "unctx": "^2.1.0", - "unenv": "^1.0.0", - "unhead": "^1.0.0", - "unimport": "^1.0.1", - "unplugin": "^1.0.0", - "untyped": "^1.0.0", - "vue": "^3.2.45", - "vue-bundle-renderer": "^1.0.0", + "strip-literal": "^1.0.1", + "ufo": "^1.1.2", + "ultrahtml": "^1.2.0", + "uncrypto": "^0.1.3", + "unctx": "^2.3.1", + "unenv": "^1.5.1", + "unimport": "^3.0.14", + "unplugin": "^1.3.2", + "unplugin-vue-router": "^0.6.4", + "untyped": "^1.3.2", + "vue": "^3.3.4", + "vue-bundle-renderer": "^1.0.3", "vue-devtools-stub": "^0.1.0", - "vue-router": "^4.1.6" + "vue-router": "^4.2.4" }, "dependencies": { + "cookie-es": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.0.0.tgz", + "integrity": "sha512-mWYvfOLrfEc996hlKcdABeIiPHUPC6DM2QYZdGGOvhOTbA3tjm2eBwqlJpoFdjC89NI4Qt6h0Pu06Mp+1Pj5OQ==" + }, "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==" + }, + "magic-string": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", + "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } } } }, + "nuxt-csurf": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/nuxt-csurf/-/nuxt-csurf-1.2.0.tgz", + "integrity": "sha512-sO8Hm3fR+GB3DMc0y1Slzt+f9LiUKpvF/qvUUZBWz1ZknfTRTYemZkfSNcoYf0/hoL2Wb9O0c8pFtzj0hs8Spw==", + "requires": { + "@nuxt/kit": "^3.1.0", + "defu": "^6.1.1" + } + }, "nuxt-icon": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/nuxt-icon/-/nuxt-icon-0.1.8.tgz", - "integrity": "sha512-oPFlLOZCy80MN+hf49+mBkOIHWVF3sOqZREQZw3qD0N6wGlR15QeRQtKQC8qGeQcc+xvpLQm0GvrdJ8FxFOPYg==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/nuxt-icon/-/nuxt-icon-0.4.2.tgz", + "integrity": "sha512-yFpvDA+FuUz+ixtt1eRzctTfR4sl7egZoXu7LL+CUc42qFlzCMaTZJ9eqFR2FTW8zu9tfLIZ83RJmUa1jNEWgg==", + "dev": true, + "requires": { + "@iconify/vue": "^4.1.1", + "@nuxt/kit": "^3.6.1" + } + }, + "nuxt-security": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/nuxt-security/-/nuxt-security-0.14.2.tgz", + "integrity": "sha512-2AmOxwmJOgOBYnYxy8QapIJx98DnLq6EAAvH24l6jMx7wSPJEtT/bb6i3VGy7EticHZkfJFM7H3eD2LxgxJ16Q==", + "requires": { + "@nuxt/kit": "^3.2.2", + "basic-auth": "^2.0.1", + "defu": "^6.1.1", + "limiter": "^2.1.0", + "memory-cache": "^0.2.0", + "nuxt-csurf": "^1.1.0", + "pathe": "^1.0.0", + "xss": "^1.0.14" + } + }, + "nuxt-simple-sitemap": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/nuxt-simple-sitemap/-/nuxt-simple-sitemap-3.1.4.tgz", + "integrity": "sha512-rP2ZxiaEyrz1S16zOb6mmtVyxTgmUAErsy0QRaxIIEMJvnZ/0oFEgH6IbpnZchjw0dxlKCAhYgNof3QDF5VQ9Q==", + "dev": true, + "requires": { + "@nuxt/devtools-kit": "^0.7.4", + "@nuxt/kit": "^3.6.5", + "chalk": "^5.3.0", + "defu": "^6.1.2", + "escape-string-regexp": "^5.0.0", + "fast-glob": "^3.3.1", + "knitwork": "^1.0.0", + "nuxt-site-config": "^1.0.10", + "nuxt-site-config-kit": "^1.0.10", + "pathe": "^1.1.1", + "radix3": "^1.0.1", + "semver": "^7.5.4", + "site-config-stack": "^1.0.10", + "ufo": "^1.2.0" + }, + "dependencies": { + "chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true + }, + "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 + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "nuxt-site-config": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nuxt-site-config/-/nuxt-site-config-1.0.10.tgz", + "integrity": "sha512-rXiyDMeJTn32EBSZ5sSLAPrGOee2aacCCbCSFOlLfcQD3uXxNk25FZWFJbNO9RGVaSajY3qcNKcqa5vRKEy35A==", + "dev": true, + "requires": { + "@nuxt/kit": "^3.6.5", + "@nuxt/schema": "^3.6.5", + "nuxt-site-config-kit": "1.0.10", + "pathe": "^1.1.1", + "site-config-stack": "1.0.10", + "ufo": "^1.2.0" + } + }, + "nuxt-site-config-kit": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nuxt-site-config-kit/-/nuxt-site-config-kit-1.0.10.tgz", + "integrity": "sha512-LvuXp2mWLONdB3biY4GmUPHu47XBZvoPIy2yDceWiGWa4tfwdCp/jVBJwgyFYVqwiXNZ7uJxG0omjNRPafXkqw==", "dev": true, "requires": { - "@iconify/vue": "^4.0.1", - "@nuxt/kit": "^3.0.0" + "@nuxt/kit": "^3.6.5", + "@nuxt/schema": "^3.6.5", + "defu": "^6.1.2", + "pkg-types": "^1.0.3", + "site-config-stack": "1.0.10", + "ufo": "^1.2.0" + } + }, + "nypm": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.2.2.tgz", + "integrity": "sha512-O7bumfWgUXlJefT1Y41SF4vsCvzeUYmnKABuOKStheCObzrkWPDmqJc+RJVU+57oFu9bITcrUq8sKFIHgjCnTg==", + "requires": { + "execa": "^7.1.1" + }, + "dependencies": { + "execa": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", + "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", + "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" + } + }, + "human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==" + }, + "is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==" + }, + "mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==" + }, + "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==", + "requires": { + "path-key": "^4.0.0" + } + }, + "onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "requires": { + "mimic-fn": "^4.0.0" + } + }, + "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==" + }, + "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==" + } } }, "object-assign": { @@ -17526,9 +19836,9 @@ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" }, "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" }, "object-keys": { "version": "1.1.1", @@ -17560,42 +19870,19 @@ } }, "ofetch": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.0.0.tgz", - "integrity": "sha512-d40aof8czZFSQKJa4+F7Ch3UC5D631cK1TTUoK+iNEut9NoiCL+u0vykl/puYVUS2df4tIQl5upQcolIcEzQjQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.1.1.tgz", + "integrity": "sha512-SSMoktrp9SNLi20BWfB/BnnKcL0RDigXThD/mZBeQxkIRv1xrd9183MtLdsqRYLYSqW0eTr5t8w8MqjNhvoOQQ==", "requires": { - "destr": "^1.2.1", - "node-fetch-native": "^1.0.1", - "ufo": "^1.0.0" + "destr": "^2.0.0", + "node-fetch-native": "^1.2.0", + "ufo": "^1.1.2" } }, "ohash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ohash/-/ohash-1.0.0.tgz", - "integrity": "sha512-kxSyzq6tt+6EE/xCnD1XaFhCCjUNUaz3X30rJp6mnjGLXAAvuPFqohMdv0aScWzajR45C29HyBaXZ8jXBwnh9A==" - }, - "ohmyfetch": { - "version": "0.4.21", - "resolved": "https://registry.npmjs.org/ohmyfetch/-/ohmyfetch-0.4.21.tgz", - "integrity": "sha512-VG7f/JRvqvBOYvL0tHyEIEG7XHWm7OqIfAs6/HqwWwDfjiJ1g0huIpe5sFEmyb+7hpFa1EGNH2aERWR72tlClw==", - "requires": { - "destr": "^1.2.0", - "node-fetch-native": "^0.1.8", - "ufo": "^0.8.6", - "undici": "^5.12.0" - }, - "dependencies": { - "node-fetch-native": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-0.1.8.tgz", - "integrity": "sha512-ZNaury9r0NxaT2oL65GvdGDy+5PlSaHTovT6JV5tOW07k1TQmgC0olZETa4C9KZg0+6zBr99ctTYa3Utqj9P/Q==" - }, - "ufo": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-0.8.6.tgz", - "integrity": "sha512-fk6CmUgwKCfX79EzcDQQpSCMxrHstvbLswFChHS0Vump+kFkw7nJBfTZoC1j0bOGoY9I7R3n2DGek5ajbcYnOw==" - } - } + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-1.1.2.tgz", + "integrity": "sha512-9CIOSq5945rI045GFtcO3uudyOkYVY1nyfFxVQp+9BRgslr8jPNiSSrsFGg/BNTUFOLqx0P5tng6G32brIPw0w==" }, "on-finished": { "version": "2.4.1", @@ -17622,9 +19909,9 @@ } }, "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==", "requires": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", @@ -17638,61 +19925,45 @@ } } }, + "openapi-typescript": { + "version": "6.3.7", + "resolved": "https://registry.npmjs.org/openapi-typescript/-/openapi-typescript-6.3.7.tgz", + "integrity": "sha512-hZKa43Ii/N8tbz1fc0cyyyWBEY4CARXeEmmUwI7D5Z+pfwQz1oei94IRJH3D/ZhGTHn74ETXZWmRO5AJI0cKuA==", + "requires": { + "ansi-colors": "^4.1.3", + "fast-glob": "^3.3.0", + "js-yaml": "^4.1.0", + "supports-color": "^9.4.0", + "undici": "^5.22.1", + "yargs-parser": "^21.1.1" + }, + "dependencies": { + "supports-color": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz", + "integrity": "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==" + }, + "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==" + } + } + }, "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "devOptional": true, "requires": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "ora": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/ora/-/ora-6.1.2.tgz", - "integrity": "sha512-EJQ3NiP5Xo94wJXIzAyOtSb0QEIAUu7m8t6UZ9krbz0vAJqr92JpcK/lEXg91q6B9pEGqrykkd2EQplnifDSBw==", - "requires": { - "bl": "^5.0.0", - "chalk": "^5.0.0", - "cli-cursor": "^4.0.0", - "cli-spinners": "^2.6.1", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^1.1.0", - "log-symbols": "^5.1.0", - "strip-ansi": "^7.0.1", - "wcwidth": "^1.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" - }, - "chalk": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.1.2.tgz", - "integrity": "sha512-E5CkT4jWURs1Vy5qGJye+XwCkNj7Od3Af7CP6SujMetSMkLs8Do2RWJK5yx1wamHV/op8Rz+9rltjaTQWDnEFQ==" - }, - "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "requires": { - "ansi-regex": "^6.0.1" - } - } + "type-check": "^0.4.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==" - }, "p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -17791,9 +20062,9 @@ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" }, "pathe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.0.tgz", - "integrity": "sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", + "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==" }, "pathval": { "version": "1.1.1", @@ -17801,9 +20072,9 @@ "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==" }, "perfect-debounce": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-0.1.3.tgz", - "integrity": "sha512-NOT9AcKiDGpnV/HBhI22Str++XWcErO/bALvHCuhv33owZW/CjH8KAFLZDCmu3727sihe0wTxpDhyGc6M8qacQ==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==" }, "picocolors": { "version": "1.0.0", @@ -17864,12 +20135,12 @@ } }, "pkg-types": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.2.tgz", - "integrity": "sha512-hM58GKXOcj8WTqUXnsQyJYXdeAPbythQgEF3nTcEo+nkD49chjQ9IKm/QJy9xf6JakXptz86h7ecP2024rrLaQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", + "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", "requires": { "jsonc-parser": "^3.2.0", - "mlly": "^1.1.1", + "mlly": "^1.2.0", "pathe": "^1.1.0" } }, @@ -17880,79 +20151,79 @@ "dev": true }, "postcss": { - "version": "8.4.19", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.19.tgz", - "integrity": "sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==", + "version": "8.4.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", + "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==", "requires": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.7", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, "dependencies": { "nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==" } } }, "postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", + "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", "requires": { - "postcss-selector-parser": "^6.0.9", + "postcss-selector-parser": "^6.0.11", "postcss-value-parser": "^4.2.0" } }, "postcss-colormin": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", - "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.0.0.tgz", + "integrity": "sha512-EuO+bAUmutWoZYgHn2T1dG1pPqHU6L4TjzPlu4t1wZGXQ/fxV16xg2EJmYi0z+6r+MGV1yvpx1BHkUaRrPa2bw==", "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", "colord": "^2.9.1", "postcss-value-parser": "^4.2.0" } }, "postcss-convert-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", - "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.0.0.tgz", + "integrity": "sha512-U5D8QhVwqT++ecmy8rnTb+RL9n/B806UVaS3m60lqle4YDFcpbS3ae5bTQIh3wOGUSDHSEtMYLs/38dNG7EYFw==", "requires": { "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" } }, "postcss-discard-comments": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", - "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.0.tgz", + "integrity": "sha512-p2skSGqzPMZkEQvJsgnkBhCn8gI7NzRH2683EEjrIkoMiwRELx68yoUJ3q3DGSGuQ8Ug9Gsn+OuDr46yfO+eFw==", "requires": {} }, "postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.0.tgz", + "integrity": "sha512-bU1SXIizMLtDW4oSsi5C/xHKbhLlhek/0/yCnoMQany9k3nPBq+Ctsv/9oMmyqbR96HYHxZcHyK2HR5P/mqoGA==", "requires": {} }, "postcss-discard-empty": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.0.tgz", + "integrity": "sha512-b+h1S1VT6dNhpcg+LpyiUrdnEZfICF0my7HAKgJixJLW7BnNmpRH34+uw/etf5AhOlIhIAuXApSzzDzMI9K/gQ==", "requires": {} }, "postcss-discard-overridden": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.0.tgz", + "integrity": "sha512-4VELwssYXDFigPYAZ8vL4yX4mUepF/oCBeeIT4OXsJPYOtvJumyz9WflmJWTfDwCUcpDR+z0zvCWBXgTx35SVw==", "requires": {} }, "postcss-import": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.0.0.tgz", - "integrity": "sha512-Y20shPQ07RitgBGv2zvkEAu9bqvrD77C9axhj/aA1BQj4czape2MdClCExvB27EwYEJdGgKZBpKanb0t1rK2Kg==", + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", "requires": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", @@ -17985,181 +20256,180 @@ } }, "postcss-merge-longhand": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", - "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.0.tgz", + "integrity": "sha512-4VSfd1lvGkLTLYcxFuISDtWUfFS4zXe0FpF149AyziftPFQIWxjvFSKhA4MIxMe4XM3yTDgQMbSNgzIVxChbIg==", "requires": { "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.1" + "stylehacks": "^6.0.0" } }, "postcss-merge-rules": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.3.tgz", - "integrity": "sha512-LbLd7uFC00vpOuMvyZop8+vvhnfRGpp2S+IMQKeuOZZapPRY4SMq5ErjQeHbHsjCUgJkRNrlU+LmxsKIqPKQlA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.0.1.tgz", + "integrity": "sha512-a4tlmJIQo9SCjcfiCcCMg/ZCEe0XTkl/xK0XHBs955GWg9xDX3NwP9pwZ78QUOWB8/0XCjZeJn98Dae0zg6AAw==", "requires": { "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", + "cssnano-utils": "^4.0.0", "postcss-selector-parser": "^6.0.5" } }, "postcss-minify-font-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", - "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.0.0.tgz", + "integrity": "sha512-zNRAVtyh5E8ndZEYXA4WS8ZYsAp798HiIQ1V2UF/C/munLp2r1UGHwf1+6JFu7hdEhJFN+W1WJQKBrtjhFgEnA==", "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-minify-gradients": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", - "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.0.tgz", + "integrity": "sha512-wO0F6YfVAR+K1xVxF53ueZJza3L+R3E6cp0VwuXJQejnNUH0DjcAFe3JEBeTY1dLwGa0NlDWueCA1VlEfiKgAA==", "requires": { "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", + "cssnano-utils": "^4.0.0", "postcss-value-parser": "^4.2.0" } }, "postcss-minify-params": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", - "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.0.0.tgz", + "integrity": "sha512-Fz/wMQDveiS0n5JPcvsMeyNXOIMrwF88n7196puSuQSWSa+/Ofc1gDOSY2xi8+A4PqB5dlYCKk/WfqKqsI+ReQ==", "requires": { "browserslist": "^4.21.4", - "cssnano-utils": "^3.1.0", + "cssnano-utils": "^4.0.0", "postcss-value-parser": "^4.2.0" } }, "postcss-minify-selectors": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", - "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.0.tgz", + "integrity": "sha512-ec/q9JNCOC2CRDNnypipGfOhbYPuUkewGwLnbv6omue/PSASbHSU7s6uSQ0tcFRVv731oMIx8k0SP4ZX6be/0g==", "requires": { "postcss-selector-parser": "^6.0.5" } }, "postcss-normalize-charset": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.0.tgz", + "integrity": "sha512-cqundwChbu8yO/gSWkuFDmKrCZ2vJzDAocheT2JTd0sFNA4HMGoKMfbk2B+J0OmO0t5GUkiAkSM5yF2rSLUjgQ==", "requires": {} }, "postcss-normalize-display-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", - "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.0.tgz", + "integrity": "sha512-Qyt5kMrvy7dJRO3OjF7zkotGfuYALETZE+4lk66sziWSPzlBEt7FrUshV6VLECkI4EN8Z863O6Nci4NXQGNzYw==", "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-positions": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", - "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.0.tgz", + "integrity": "sha512-mPCzhSV8+30FZyWhxi6UoVRYd3ZBJgTRly4hOkaSifo0H+pjDYcii/aVT4YE6QpOil15a5uiv6ftnY3rm0igPg==", "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-repeat-style": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", - "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.0.tgz", + "integrity": "sha512-50W5JWEBiOOAez2AKBh4kRFm2uhrT3O1Uwdxz7k24aKtbD83vqmcVG7zoIwo6xI2FZ/HDlbrCopXhLeTpQib1A==", "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", - "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.0.tgz", + "integrity": "sha512-KWkIB7TrPOiqb8ZZz6homet2KWKJwIlysF5ICPZrXAylGe2hzX/HSf4NTX2rRPJMAtlRsj/yfkrWGavFuB+c0w==", "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-timing-functions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", - "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.0.tgz", + "integrity": "sha512-tpIXWciXBp5CiFs8sem90IWlw76FV4oi6QEWfQwyeREVwUy39VSeSqjAT7X0Qw650yAimYW5gkl2Gd871N5SQg==", "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-unicode": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", - "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.0.0.tgz", + "integrity": "sha512-ui5crYkb5ubEUDugDc786L/Me+DXp2dLg3fVJbqyAl0VPkAeALyAijF2zOsnZyaS1HyfPuMH0DwyY18VMFVNkg==", "requires": { "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", - "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.0.tgz", + "integrity": "sha512-98mvh2QzIPbb02YDIrYvAg4OUzGH7s1ZgHlD3fIdTHLgPLRpv1ZTKJDnSAKr4Rt21ZQFzwhGMXxpXlfrUBKFHw==", "requires": { - "normalize-url": "^6.0.1", "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-whitespace": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", - "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.0.tgz", + "integrity": "sha512-7cfE1AyLiK0+ZBG6FmLziJzqQCpTQY+8XjMhMAz8WSBSCsCNNUKujgIgjCAmDT3cJ+3zjTXFkoD15ZPsckArVw==", "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-ordered-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", - "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.0.tgz", + "integrity": "sha512-K36XzUDpvfG/nWkjs6d1hRBydeIxGpKS2+n+ywlKPzx1nMYDYpoGbcjhj5AwVYJK1qV2/SDoDEnHzlPD6s3nMg==", "requires": { - "cssnano-utils": "^3.1.0", + "cssnano-utils": "^4.0.0", "postcss-value-parser": "^4.2.0" } }, "postcss-reduce-initial": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.1.tgz", - "integrity": "sha512-//jeDqWcHPuXGZLoolFrUXBDyuEGbr9S2rMo19bkTIjBQ4PqkaO+oI8wua5BOUxpfi97i3PCoInsiFIEBfkm9w==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.0.0.tgz", + "integrity": "sha512-s2UOnidpVuXu6JiiI5U+fV2jamAw5YNA9Fdi/GRK0zLDLCfXmSGqQtzpUPtfN66RtCbb9fFHoyZdQaxOB3WxVA==", "requires": { "browserslist": "^4.21.4", "caniuse-api": "^3.0.0" } }, "postcss-reduce-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", - "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.0.tgz", + "integrity": "sha512-FQ9f6xM1homnuy1wLe9lP1wujzxnwt1EwiigtWwuyf8FsqqXUDUp2Ulxf9A5yjlUOTdCJO6lonYjg1mgqIIi2w==", "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-selector-parser": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", - "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", + "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==", "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "postcss-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", - "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.0.tgz", + "integrity": "sha512-r9zvj/wGAoAIodn84dR/kFqwhINp5YsJkLoujybWG59grR/IHx+uQ2Zo+IcOwM0jskfYX3R0mo+1Kip1VSNcvw==", "requires": { "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" + "svgo": "^3.0.2" } }, "postcss-unique-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", - "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.0.tgz", + "integrity": "sha512-EPQzpZNxOxP7777t73RQpZE5e9TrnCrkvp7AH7a0l89JmZiPnS82y216JowHXwpBCQitfyxrof9TK3rYbi7/Yw==", "requires": { "postcss-selector-parser": "^6.0.5" } @@ -18202,9 +20472,9 @@ "devOptional": true }, "prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz", + "integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==", "dev": true, "peer": true }, @@ -18218,18 +20488,18 @@ } }, "pretty-bytes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.0.0.tgz", - "integrity": "sha512-6UqkYefdogmzqAZWzJ7laYeJnaXDy2/J+ZqiiMtS7t7OfpXWTlaeGMwX8U6EFvPV/YWWEKRkS8hKS4k60WHTOg==" + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.1.1.tgz", + "integrity": "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==" }, "pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "requires": { - "ansi-regex": "^5.0.1", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" + "react-is": "^18.0.0" }, "dependencies": { "ansi-styles": { @@ -18244,6 +20514,15 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, + "prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, "protocols": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", @@ -18260,15 +20539,15 @@ "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==" }, "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "devOptional": true }, "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", "requires": { "side-channel": "^1.0.4" } @@ -18279,9 +20558,9 @@ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" }, "radix3": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.0.0.tgz", - "integrity": "sha512-6n3AEXth91ASapMVKiEh2wrbFJmI+NBilrWE0AbiGgfm0xet0QXC8+a3K19r1UVYjUjctUgB053c3V/J6V0kCQ==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.0.1.tgz", + "integrity": "sha512-y+AcwZ3HcUIGc9zGsNVf5+BY/LxL+z+4h4J3/pp8jxSmy1STaCocPS3qrj4tA5ehUSzqtqK+0Aygvz/r/8vy4g==" }, "randombytes": { "version": "2.1.0", @@ -18297,19 +20576,19 @@ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "rc9": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.0.1.tgz", - "integrity": "sha512-9EfjLgNmzP9255YX8bGnILQcmdtOXKtUlFTu8bOZPJVtaUDZ2imswcUdpK51tMjTRQyB7r5RebNijrzuyGXcVA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.1.tgz", + "integrity": "sha512-lNeOl38Ws0eNxpO3+wD1I9rkHGQyj1NU1jlzv4go2CtEnEQEUfqnIvZG7W+bC/aXdJ27n5x/yUjb6RoT9tko+Q==", "requires": { "defu": "^6.1.2", - "destr": "^1.2.2", + "destr": "^2.0.0", "flat": "^5.0.2" } }, "react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" }, "read-cache": { "version": "1.0.0", @@ -18396,9 +20675,9 @@ } }, "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -18406,9 +20685,9 @@ } }, "readdir-glob": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.2.tgz", - "integrity": "sha512-6RLVvwJtVwEDfPdn6X6Ille4/lxGl0ATOY4FN/B9nxQcgOazvvI0nodiD19ScKq0PvA/29VpaOQML36o5IzZWA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", "requires": { "minimatch": "^5.1.0" }, @@ -18422,9 +20701,9 @@ } }, "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "requires": { "brace-expansion": "^2.0.1" } @@ -18453,27 +20732,27 @@ } }, "regexp-tree": { - "version": "0.1.24", - "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.24.tgz", - "integrity": "sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==", + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", + "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", "dev": true }, "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" } }, "regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "devOptional": true + "dev": true }, "require-directory": { "version": "2.1.1", @@ -18486,11 +20765,11 @@ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "requires": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.11.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -18501,14 +20780,11 @@ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "devOptional": true }, - "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==", - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } + "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 }, "reusify": { "version": "1.0.4", @@ -18539,61 +20815,69 @@ } }, "rollup": { - "version": "2.79.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "version": "3.26.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.3.tgz", + "integrity": "sha512-7Tin0C8l86TkpcMtXvQu6saWH93nhG3dGQ1/+l5V2TDMceTxO7kDiK6GzbfLWNNxqJXm591PcEZUozZm51ogwQ==", "requires": { "fsevents": "~2.3.2" } }, - "rollup-plugin-terser": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", - "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", - "requires": { - "@babel/code-frame": "^7.10.4", - "jest-worker": "^26.2.1", - "serialize-javascript": "^4.0.0", - "terser": "^5.0.0" - } - }, "rollup-plugin-visualizer": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.8.3.tgz", - "integrity": "sha512-QGJk4Bqe4AOat5AjipOh8esZH1nck5X2KFpf4VytUdSUuuuSwvIQZjMGgjcxe/zXexltqaXp5Vx1V3LmnQH15Q==", + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.9.2.tgz", + "integrity": "sha512-waHktD5mlWrYFrhOLbti4YgQCn1uR24nYsNuXxg7LkPH8KdTXVWR9DNY1WU0QqokyMixVXJS4J04HNrVTMP01A==", "requires": { "open": "^8.4.0", + "picomatch": "^2.3.1", "source-map": "^0.7.4", "yargs": "^17.5.1" }, "dependencies": { + "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==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, "source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==" + }, + "yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "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.1.1" + } + }, + "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==" } } }, - "rollup-pluginutils": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "run-applescript": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "dev": true, "requires": { - "estree-walker": "^0.6.1" - }, - "dependencies": { - "estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==" - } + "execa": "^5.0.0" } }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" - }, "run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -18602,18 +20886,22 @@ "queue-microtask": "^1.2.2" } }, - "rxjs": { - "version": "7.5.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz", - "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==", + "safe-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "dev": true, "requires": { - "tslib": "^2.1.0" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" } }, "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==" + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "safe-regex": { "version": "2.1.1", @@ -18635,15 +20923,10 @@ "is-regex": "^1.1.4" } }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, "sass": { - "version": "1.56.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.56.1.tgz", - "integrity": "sha512-VpEyKpyBPCxE7qGDtOcdJ6fFbcpOM+Emu7uZLxVrkX8KVU/Dp5UF7WLvzqRuUhB6mqqQt1xffLoG+AndxTZrCQ==", + "version": "1.64.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.64.1.tgz", + "integrity": "sha512-16rRACSOFEE8VN7SCgBu1MpYCyN7urj9At898tyzdXFhC+a+yOX5dXwAR7L8/IdPJ1NB8OYoXmD55DM30B2kEQ==", "requires": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", @@ -18656,9 +20939,9 @@ "integrity": "sha512-4AsO/FrViE/iDNEPaAQlb77tf0csuq27EsVpy6ett584EcRTp6pTDLoGWVxCD77y5iU5FauOvhsI4o1APwPoSQ==" }, "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==" }, "send": { "version": "0.18.0", @@ -18708,9 +20991,9 @@ } }, "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "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==", "requires": { "randombytes": "^2.1.0" } @@ -18777,31 +21060,32 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "site-config-stack": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/site-config-stack/-/site-config-stack-1.0.10.tgz", + "integrity": "sha512-sEKECSkg9XYrzs6ykKWbelxj/P/K8kUgKtWZdETTfLlnKl7e/0JsTS0UZf2Gu4aNEXWUwHrOxtZcvIa3ASYhHA==", + "dev": true, + "requires": { + "@nuxt/kit": "^3.6.5", + "defu": "^6.1.2", + "pkg-types": "^1.0.3", + "ufo": "^1.2.0" + } + }, "slash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==" }, - "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==", - "requires": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" - }, - "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==" - } - } + "smob": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/smob/-/smob-1.4.0.tgz", + "integrity": "sha512-MqR3fVulhjWuRNSMydnTlweu38UhQ0HXM4buStD/S3mc/BzX3CuM9OmhyQpmtYCvoYdl5ris6TI0ZqH355Ymqg==" }, "source-map": { "version": "0.6.1", @@ -18822,15 +21106,10 @@ "source-map": "^0.6.0" } }, - "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" - }, "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", @@ -18854,16 +21133,11 @@ } }, "spdx-license-ids": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", - "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", + "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==", "dev": true }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" - }, "stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", @@ -18880,14 +21154,9 @@ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" }, "std-env": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.2.tgz", - "integrity": "sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==" - }, - "streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==" + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.3.tgz", + "integrity": "sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==" }, "string_decoder": { "version": "1.3.0", @@ -18895,31 +21164,34 @@ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "requires": { "safe-buffer": "~5.2.0" + }, + "dependencies": { + "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==" + } } }, "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" - }, - "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "requires": { - "ansi-regex": "^6.0.1" - } - } + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "string.prototype.trimend": { @@ -18979,17 +21251,17 @@ "devOptional": true }, "strip-literal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.0.0.tgz", - "integrity": "sha512-5o4LsH1lzBzO9UFH63AJ2ad2/S2AVx6NtjOcaz+VTT2h1RiRvbipW72z8M/lxEhcPHDBQwpDrnTF7sXy/7OwCQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.0.1.tgz", + "integrity": "sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==", "requires": { - "acorn": "^8.8.1" + "acorn": "^8.8.2" } }, "stylehacks": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", - "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.0.0.tgz", + "integrity": "sha512-+UT589qhHPwz6mTlCLSt/vMNTJx8dopeJlZAlBMJPWA3ORqu6wmQY7FBXf+qD+FsqoBJODyqNxOUP3jdntFRdw==", "requires": { "browserslist": "^4.21.4", "postcss-selector-parser": "^6.0.4" @@ -19014,27 +21286,26 @@ "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==" }, "svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.0.2.tgz", + "integrity": "sha512-Z706C1U2pb1+JGP48fbazf3KxHrWOsLme6Rv7imFBn5EnuanDW1GPaA/P1/dvObE670JDePC3mnj0k0B7P0jjQ==", "requires": { "@trysound/sax": "0.2.0", "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" + "css-select": "^5.1.0", + "css-tree": "^2.2.1", + "csso": "^5.0.5", + "picocolors": "^1.0.0" } }, "synckit": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.4.tgz", - "integrity": "sha512-Dn2ZkzMdSX827QbowGbU/4yjWuvNaCoScLLoMo/yKbu+P4GBR6cRGKZH27k6a9bRzdqcyd1DE96pQtQ6uNkmyw==", + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", + "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", "dev": true, "requires": { "@pkgr/utils": "^2.3.1", - "tslib": "^2.4.0" + "tslib": "^2.5.0" } }, "tapable": { @@ -19043,16 +21314,23 @@ "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" }, "tar": { - "version": "6.1.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", - "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", "requires": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", - "minipass": "^4.0.0", + "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" + }, + "dependencies": { + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } } }, "tar-stream": { @@ -19065,36 +21343,15 @@ "fs-constants": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.1.1" - }, - "dependencies": { - "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" - } - }, - "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" - } - } } }, "terser": { - "version": "5.15.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.1.tgz", - "integrity": "sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==", + "version": "5.19.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", + "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -19137,48 +21394,31 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "devOptional": true }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" - }, - "tiny-glob": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", - "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", - "dev": true, - "requires": { - "globalyzer": "0.1.0", - "globrex": "^0.1.2" - } - }, "tiny-invariant": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" }, "tinybench": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.4.0.tgz", - "integrity": "sha512-iyziEiyFxX4kyxSp+MtY1oCH/lvjH3PxFN8PGCDeqcZWAJ/i+9y+nL85w99PxVzrIvew/GSkSbDYtiGVa85Afg==" + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.0.tgz", + "integrity": "sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==" }, "tinypool": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.4.0.tgz", - "integrity": "sha512-2ksntHOKf893wSAH4z/+JbPpi92esw8Gn9N2deXX+B0EO92hexAVI9GIZZPx7P5aYo5KULfeOSt3kMOmSOy6uA==" + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.6.0.tgz", + "integrity": "sha512-FdswUUo5SxRizcBc6b1GSuLpLjisa8N8qMyYoP3rl+bym+QauhtJP5bvZY1ytt8krKGmMLYIRl36HBZfeAoqhQ==" }, "tinyspy": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-1.1.1.tgz", - "integrity": "sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.1.1.tgz", + "integrity": "sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==" }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "requires": { - "os-tmpdir": "~1.0.2" - } + "titleize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", + "dev": true }, "to-fast-properties": { "version": "2.0.0", @@ -19204,13 +21444,13 @@ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", "dev": true, "requires": { "@types/json5": "^0.0.29", - "json5": "^1.0.1", + "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" }, @@ -19227,9 +21467,10 @@ } }, "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==", + "dev": true }, "tsutils": { "version": "3.21.0", @@ -19263,25 +21504,72 @@ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" }, "type-fest": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.2.0.tgz", - "integrity": "sha512-Il3wdLRzWvbAEtocgxGQA9YOoRVeVUGOMBtel5LdEpNeEAol6GJTLw8GbX6Z8EIMfvfhoOXs2bwOijtAZdK5og==" + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==" + }, + "typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + } }, "typescript": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", - "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", "devOptional": true }, "ufo": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.1.1.tgz", - "integrity": "sha512-MvlCc4GHrmZdAllBc0iUDowff36Q9Ndw/UzqmEKyrfSzokTd9ZCy1i+IIk5hrYKkjoYVQyNbrw7/F8XJ2rEwTg==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.2.0.tgz", + "integrity": "sha512-RsPyTbqORDNDxqAdQPQBpgqhWle1VcTSou/FraClYlHf6TZnQcGslpLcAphNR+sQW4q5lLWLbOsRlh9j24baQg==" }, "ultrahtml": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.0.1.tgz", - "integrity": "sha512-VDt8gmBR5DPrsfdLS4GQqncojcsLTKMW6iHKVN9l6TohU5bdn/OPv8AmV/0/PBR7Z3qBmMpJHqxRdQFaFA8B9g==" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.3.0.tgz", + "integrity": "sha512-xmXvE8tC8t4PVqy0/g1fe7H9USY/Brr425q4dD/0QbQMQit7siCtb06+SCqE4GfU24nwsZz8Th1g7L7mm1lL5g==" }, "unbox-primitive": { "version": "1.0.2", @@ -19295,80 +21583,79 @@ "which-boxed-primitive": "^1.0.2" } }, + "uncrypto": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz", + "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==" + }, "unctx": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/unctx/-/unctx-2.1.2.tgz", - "integrity": "sha512-KK18aLRKe3OlbPyHbXAkIWSU3xK8GInomXfA7fzDMGFXQ1crX1UWrCzKesVXeUyHIayHUrnTvf87IPCKMyeKTg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unctx/-/unctx-2.3.1.tgz", + "integrity": "sha512-PhKke8ZYauiqh3FEMVNm7ljvzQiph0Mt3GBRve03IJm7ukfaON2OBK795tLwhbyfzknuRRkW0+Ze+CQUmzOZ+A==", "requires": { "acorn": "^8.8.2", "estree-walker": "^3.0.3", - "magic-string": "^0.27.0", - "unplugin": "^1.0.1" + "magic-string": "^0.30.0", + "unplugin": "^1.3.1" }, "dependencies": { - "estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "requires": { - "@types/estree": "^1.0.0" - } - }, "magic-string": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", - "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", + "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", "requires": { - "@jridgewell/sourcemap-codec": "^1.4.13" + "@jridgewell/sourcemap-codec": "^1.4.15" } } } }, "undici": { - "version": "5.20.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.20.0.tgz", - "integrity": "sha512-J3j60dYzuo6Eevbawwp1sdg16k5Tf768bxYK4TUJRH7cBM4kFCbf3mOnM/0E3vQYXvpxITbbWmBafaDbxLDz3g==", + "version": "5.28.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.2.tgz", + "integrity": "sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==", "requires": { - "busboy": "^1.6.0" + "@fastify/busboy": "^2.0.0" } }, "unenv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unenv/-/unenv-1.0.0.tgz", - "integrity": "sha512-vlyi2Rzj4CNlA1JsEXufX+ItkGr3Z5DfLzKniYEneMlBVtuxS+57f1LwTPj2eiBPSPaGHMUVzEnjSCGE7l8JQg==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/unenv/-/unenv-1.5.2.tgz", + "integrity": "sha512-fpQW0nx3hGx0q0wq/35+ng9Dm4m1/2V00UmU5Jxdr1woyrMbT4RydQn5eh/hZyM81HKAPzaf50TKX0XfYpBaqg==", "requires": { - "defu": "^6.1.1", + "consola": "^3.2.3", + "defu": "^6.1.2", "mime": "^3.0.0", - "node-fetch-native": "^1.0.1", - "pathe": "^1.0.0" + "node-fetch-native": "^1.2.0", + "pathe": "^1.1.1" } }, "unhead": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unhead/-/unhead-1.0.4.tgz", - "integrity": "sha512-d6qQR9fOjbi287DwEZyqECdHny7/z/1hpaARyhSj/zT2vScIsafWSlSJEpLiJQ/LrjhK7LQeSpgZi/cUYllzBA==", + "version": "1.1.32", + "resolved": "https://registry.npmjs.org/unhead/-/unhead-1.1.32.tgz", + "integrity": "sha512-WO1NTmljMZZzZjzmkcgZpYKpbEGGB3HC+2DIJxAZd0++WCPT9jD6o0MIgpA71UvueOCqLhIlyfGsa9Hgn0Gnog==", "requires": { - "@unhead/dom": "1.0.4", - "@unhead/schema": "1.0.4", - "hookable": "^5.4.2" + "@unhead/dom": "1.1.32", + "@unhead/schema": "1.1.32", + "@unhead/shared": "1.1.32", + "hookable": "^5.5.3" } }, "unimport": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unimport/-/unimport-1.0.1.tgz", - "integrity": "sha512-SEPKl3uyqUvi6c0MnyCmUF9H07CuC9j9p2p33F03LmegU0sxjpnjL0fLKAhh7BTfcKaJKj+1iOiAFtg7P3m5mQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/unimport/-/unimport-3.1.0.tgz", + "integrity": "sha512-ybK3NVWh30MdiqSyqakrrQOeiXyu5507tDA0tUf7VJHrsq4DM6S43gR7oAsZaFojM32hzX982Lqw02D3yf2aiA==", "requires": { "@rollup/pluginutils": "^5.0.2", "escape-string-regexp": "^5.0.0", - "fast-glob": "^3.2.12", - "local-pkg": "^0.4.2", - "magic-string": "^0.26.7", - "mlly": "^1.0.0", - "pathe": "^1.0.0", - "pkg-types": "^1.0.1", + "fast-glob": "^3.3.0", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.1", + "mlly": "^1.4.0", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", "scule": "^1.0.0", - "strip-literal": "^1.0.0", - "unplugin": "^1.0.0" + "strip-literal": "^1.0.1", + "unplugin": "^1.4.0" }, "dependencies": { "@rollup/pluginutils": { @@ -19390,6 +21677,14 @@ "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==" + }, + "magic-string": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", + "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } } } }, @@ -19399,42 +21694,100 @@ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" }, "unplugin": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.1.0.tgz", - "integrity": "sha512-I8obQ8Rs/hnkxokRV6g8JKOQFgYNnTd9DL58vcSt5IJ9AkK8wbrtsnzD5hi4BJlvcY536JzfEXj9L6h7j559/A==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.4.0.tgz", + "integrity": "sha512-5x4eIEL6WgbzqGtF9UV8VEC/ehKptPXDS6L2b0mv4FRMkJxRtjaJfOWDd6a8+kYbqsjklix7yWP0N3SUepjXcg==", "requires": { - "acorn": "^8.8.2", + "acorn": "^8.9.0", "chokidar": "^3.5.3", "webpack-sources": "^3.2.3", "webpack-virtual-modules": "^0.5.0" } }, + "unplugin-vue-router": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/unplugin-vue-router/-/unplugin-vue-router-0.6.4.tgz", + "integrity": "sha512-9THVhhtbVFxbsIibjK59oPwMI1UCxRWRPX7azSkTUABsxovlOXJys5SJx0kd/0oKIqNJuYgkRfAgPuO77SqCOg==", + "requires": { + "@babel/types": "^7.21.5", + "@rollup/pluginutils": "^5.0.2", + "@vue-macros/common": "^1.3.1", + "ast-walker-scope": "^0.4.1", + "chokidar": "^3.5.3", + "fast-glob": "^3.2.12", + "json5": "^2.2.3", + "local-pkg": "^0.4.3", + "mlly": "^1.2.0", + "pathe": "^1.1.0", + "scule": "^1.0.0", + "unplugin": "^1.3.1", + "yaml": "^2.2.2" + }, + "dependencies": { + "@rollup/pluginutils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", + "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", + "requires": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + } + }, + "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==" + }, + "yaml": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==" + } + } + }, "unstorage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.0.1.tgz", - "integrity": "sha512-J1c4b8K2KeihHrQtdgl/ybIapArUbPaPb+TyJy/nGSauDwDYqciZsEKdkee568P3c8SSH4TIgnGRHDWMPGw+Lg==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.8.0.tgz", + "integrity": "sha512-Wl6a0fYIIPx8yWIHAVNzsNRcIpagVnBV05UXeIFCNqPZ5tu0w0MPE+eTjpRe/yxCD60K7qX55K5Px/PeKvNntw==", "requires": { - "anymatch": "^3.1.2", + "anymatch": "^3.1.3", "chokidar": "^3.5.3", - "destr": "^1.2.1", - "h3": "^1.0.1", - "ioredis": "^5.2.4", - "listhen": "^1.0.0", - "mkdir": "^0.0.2", + "destr": "^2.0.0", + "h3": "^1.7.1", + "ioredis": "^5.3.2", + "listhen": "^1.0.4", + "lru-cache": "^10.0.0", "mri": "^1.2.0", - "ofetch": "^1.0.0", - "ufo": "^1.0.0", - "ws": "^8.11.0" + "node-fetch-native": "^1.2.0", + "ofetch": "^1.1.1", + "ufo": "^1.1.2" + }, + "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==" + } } }, + "untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true + }, "untyped": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/untyped/-/untyped-1.2.2.tgz", - "integrity": "sha512-EANYd5L6AdpgfldlgMcmvOOnj092nWhy0ybhc7uhEH12ipytDYz89EOegBQKj8qWL3u1wgYnmFjADhsuCJs5Aw==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/untyped/-/untyped-1.3.2.tgz", + "integrity": "sha512-z219Z65rOGD6jXIvIhpZFfwWdqQckB8sdZec2NO+TkcH1Bph7gL0hwLzRJs1KsOo4Jz4mF9guBXhsEnyEBGVfw==", "requires": { - "@babel/core": "^7.20.12", - "@babel/standalone": "^7.20.12", - "@babel/types": "^7.20.7", + "@babel/core": "^7.21.3", + "@babel/standalone": "^7.21.3", + "@babel/types": "^7.21.3", + "defu": "^6.1.2", + "jiti": "^1.18.2", + "mri": "^1.2.0", "scule": "^1.0.0" } }, @@ -19444,9 +21797,9 @@ "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==" }, "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==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", "requires": { "escalade": "^3.1.1", "picocolors": "^1.0.0" @@ -19487,41 +21840,196 @@ } }, "vite": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.7.tgz", - "integrity": "sha512-29pdXjk49xAP0QBr0xXqu2s5jiQIXNvE/xwd0vUizYT2Hzqe4BksNNoWllFVXJf4eLZ+UlVQmXfB4lWrc+t18g==", + "version": "4.3.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz", + "integrity": "sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==", "requires": { - "esbuild": "^0.15.9", + "esbuild": "^0.17.5", "fsevents": "~2.3.2", - "postcss": "^8.4.18", - "resolve": "^1.22.1", - "rollup": "^2.79.1" + "postcss": "^8.4.23", + "rollup": "^3.21.0" + }, + "dependencies": { + "@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "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==", + "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==", + "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==", + "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==", + "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==", + "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==", + "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==", + "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==", + "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==", + "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==", + "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==", + "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==", + "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==", + "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==", + "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==", + "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==", + "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==", + "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==", + "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==", + "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==", + "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==", + "optional": true + }, + "esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "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" + } + } } }, "vite-node": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.25.3.tgz", - "integrity": "sha512-0TyDFASTLJUOPRE5e5isyXXgM/fbTD6D37NKduk718l+Ih9FSwqaaHT5f0pIkJMXzyYT6zo4b4FA6pnGdoky3A==", + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.33.0.tgz", + "integrity": "sha512-19FpHYbwWWxDr73ruNahC+vtEdza52kA90Qb3La98yZ0xULqV8A5JLNPUff0f5zID4984tW7l3DH2przTJUZSw==", "requires": { + "cac": "^6.7.14", "debug": "^4.3.4", - "mlly": "^1.0.0", - "pathe": "^0.2.0", - "source-map": "^0.6.1", - "source-map-support": "^0.5.21", - "vite": "^3.0.0" - }, - "dependencies": { - "pathe": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-0.2.0.tgz", - "integrity": "sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==" - } + "mlly": "^1.4.0", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^3.0.0 || ^4.0.0" } }, "vite-plugin-checker": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/vite-plugin-checker/-/vite-plugin-checker-0.5.1.tgz", - "integrity": "sha512-NFiO1PyK9yGuaeSnJ7Whw9fnxLc1AlELnZoyFURnauBYhbIkx9n+PmIXxSFUuC9iFyACtbJQUAEuQi6yHs2Adg==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/vite-plugin-checker/-/vite-plugin-checker-0.6.1.tgz", + "integrity": "sha512-4fAiu3W/IwRJuJkkUZlWbLunSzsvijDf0eDN6g/MGh6BUK4SMclOTGbLJCPvdAcMOQvVmm8JyJeYLYd4//8CkA==", "requires": { "@babel/code-frame": "^7.12.13", "ansi-escapes": "^4.3.0", @@ -19529,9 +22037,11 @@ "chokidar": "^3.5.1", "commander": "^8.0.0", "fast-glob": "^3.2.7", + "fs-extra": "^11.1.0", "lodash.debounce": "^4.0.8", "lodash.pick": "^4.4.0", "npm-run-path": "^4.0.1", + "semver": "^7.5.0", "strip-ansi": "^6.0.0", "tiny-invariant": "^1.1.0", "vscode-languageclient": "^7.0.0", @@ -19540,14 +22050,6 @@ "vscode-uri": "^3.0.2" }, "dependencies": { - "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==", - "requires": { - "type-fest": "^0.21.3" - } - }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -19588,6 +22090,22 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "requires": { + "lru-cache": "^6.0.0" + } + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -19596,65 +22114,60 @@ "has-flag": "^4.0.0" } }, - "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==" + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, "vite-plugin-vuetify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vite-plugin-vuetify/-/vite-plugin-vuetify-1.0.0.tgz", - "integrity": "sha512-30+W6H//wjOegKCha4wQ3IS+JyXDE6IayL5cK5S4IrM7WIceV/WitnxljbPZHER+Jyl3BGIuYV6nofjMOfRO1g==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/vite-plugin-vuetify/-/vite-plugin-vuetify-1.0.2.tgz", + "integrity": "sha512-MubIcKD33O8wtgQXlbEXE7ccTEpHZ8nPpe77y9Wy3my2MWw/PgehP9VqTp92BLqr0R1dSL970Lynvisx3UxBFw==", "requires": { - "@vuetify/loader-shared": "^1.7.0", + "@vuetify/loader-shared": "^1.7.1", "debug": "^4.3.3", "upath": "^2.0.1" } }, "vitest": { - "version": "0.29.8", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.29.8.tgz", - "integrity": "sha512-JIAVi2GK5cvA6awGpH0HvH/gEG9PZ0a/WoxdiV3PmqK+3CjQMf8c+J/Vhv4mdZ2nRyXFw66sAg6qz7VNkaHfDQ==", + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.33.0.tgz", + "integrity": "sha512-1CxaugJ50xskkQ0e969R/hW47za4YXDUfWJDxip1hwbnhUjYolpfUn2AMOulqG/Dtd9WYAtkHmM/m3yKVrEejQ==", "requires": { - "@types/chai": "^4.3.4", + "@types/chai": "^4.3.5", "@types/chai-subset": "^1.3.3", "@types/node": "*", - "@vitest/expect": "0.29.8", - "@vitest/runner": "0.29.8", - "@vitest/spy": "0.29.8", - "@vitest/utils": "0.29.8", - "acorn": "^8.8.1", + "@vitest/expect": "0.33.0", + "@vitest/runner": "0.33.0", + "@vitest/snapshot": "0.33.0", + "@vitest/spy": "0.33.0", + "@vitest/utils": "0.33.0", + "acorn": "^8.9.0", "acorn-walk": "^8.2.0", "cac": "^6.7.14", "chai": "^4.3.7", "debug": "^4.3.4", - "local-pkg": "^0.4.2", - "pathe": "^1.1.0", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.1", + "pathe": "^1.1.1", "picocolors": "^1.0.0", - "source-map": "^0.6.1", - "std-env": "^3.3.1", - "strip-literal": "^1.0.0", - "tinybench": "^2.3.1", - "tinypool": "^0.4.0", - "tinyspy": "^1.0.2", + "std-env": "^3.3.3", + "strip-literal": "^1.0.1", + "tinybench": "^2.5.0", + "tinypool": "^0.6.0", "vite": "^3.0.0 || ^4.0.0", - "vite-node": "0.29.8", + "vite-node": "0.33.0", "why-is-node-running": "^2.2.2" }, "dependencies": { - "vite-node": { - "version": "0.29.8", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.29.8.tgz", - "integrity": "sha512-b6OtCXfk65L6SElVM20q5G546yu10/kNrhg08afEoWlFRJXFq9/6glsvSVY+aI6YeC1tu2TtAqI2jHEQmOmsFw==", + "magic-string": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", + "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", "requires": { - "cac": "^6.7.14", - "debug": "^4.3.4", - "mlly": "^1.1.0", - "pathe": "^1.1.0", - "picocolors": "^1.0.0", - "vite": "^3.0.0 || ^4.0.0" + "@jridgewell/sourcemap-codec": "^1.4.15" } } } @@ -19674,13 +22187,26 @@ "vscode-languageserver-protocol": "3.16.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==", + "requires": { + "yallist": "^4.0.0" + } + }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "requires": { "lru-cache": "^6.0.0" } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, @@ -19702,9 +22228,9 @@ } }, "vscode-languageserver-textdocument": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.7.tgz", - "integrity": "sha512-bFJH7UQxlXT8kKeyiyu41r22jCZXG8kuuVVA33OEJn1diWOZK5n8zBSPZFHVBOu8kXZ6h0LIRhf5UnCo61J4Hg==" + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz", + "integrity": "sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==" }, "vscode-languageserver-types": { "version": "3.16.0", @@ -19712,28 +22238,28 @@ "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==" }, "vscode-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.6.tgz", - "integrity": "sha512-fmL7V1eiDBFRRnu+gfRWTzyPpNIHJTc4mWnFkwBUmO9U3KPgJAmTx7oxi2bl/Rh6HLdU7+4C9wlj0k2E4AdKFQ==" + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.7.tgz", + "integrity": "sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==" }, "vue": { - "version": "3.2.45", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.45.tgz", - "integrity": "sha512-9Nx/Mg2b2xWlXykmCwiTUCWHbWIj53bnkizBxKai1g61f2Xit700A1ljowpTIM11e3uipOeiPcSqnmBg6gyiaA==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.4.tgz", + "integrity": "sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==", "requires": { - "@vue/compiler-dom": "3.2.45", - "@vue/compiler-sfc": "3.2.45", - "@vue/runtime-dom": "3.2.45", - "@vue/server-renderer": "3.2.45", - "@vue/shared": "3.2.45" + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-sfc": "3.3.4", + "@vue/runtime-dom": "3.3.4", + "@vue/server-renderer": "3.3.4", + "@vue/shared": "3.3.4" } }, "vue-bundle-renderer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vue-bundle-renderer/-/vue-bundle-renderer-1.0.0.tgz", - "integrity": "sha512-43vCqTgaMXfHhtR8/VcxxWD1DgtzyvNc4wNyG5NKCIH19O1z5G9ZCRXTGEA2wifVec5PU82CkRLD2sTK9NkTdA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/vue-bundle-renderer/-/vue-bundle-renderer-1.0.3.tgz", + "integrity": "sha512-EfjX+5TTUl70bki9hPuVp+54JiZOvFIfoWBcfXsSwLzKEiDYyHNi5iX8srnqLIv3YRnvxgbntdcG1WPq0MvffQ==", "requires": { - "ufo": "^1.0.0" + "ufo": "^1.1.1" } }, "vue-devtools-stub": { @@ -19742,9 +22268,9 @@ "integrity": "sha512-RutnB7X8c5hjq39NceArgXg28WZtZpGc3+J16ljMiYnFhKvd8hITxSWQSQ5bvldxMDU6gG5mkxl1MTQLXckVSQ==" }, "vue-eslint-parser": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.1.0.tgz", - "integrity": "sha512-NGn/iQy8/Wb7RrRa4aRkokyCZfOUWk19OP5HP6JEozQFX5AoS/t+Z0ZN7FY4LlmWc4FNI922V7cvX28zctN8dQ==", + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.3.1.tgz", + "integrity": "sha512-Clr85iD2XFZ3lJ52/ppmUDG/spxQu6+MAeHXjjyI4I1NUYZ9xmenQp4N0oaHJhrA8OOxltCVxMRfANGa70vU0g==", "dev": true, "requires": { "debug": "^4.3.4", @@ -19757,9 +22283,9 @@ }, "dependencies": { "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.1.tgz", + "integrity": "sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==", "dev": true, "requires": { "esrecurse": "^4.3.0", @@ -19767,9 +22293,9 @@ } }, "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true }, "estraverse": { @@ -19778,14 +22304,29 @@ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } } }, @@ -19800,6 +22341,34 @@ "@vue/devtools-api": "^6.2.1" }, "dependencies": { + "@intlify/core-base": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.2.2.tgz", + "integrity": "sha512-JjUpQtNfn+joMbrXvpR4hTF8iJQ2sEFzzK3KIESOx+f+uwIjgw20igOyaIdhfsVVBCds8ZM64MoeNSx+PHQMkA==", + "requires": { + "@intlify/devtools-if": "9.2.2", + "@intlify/message-compiler": "9.2.2", + "@intlify/shared": "9.2.2", + "@intlify/vue-devtools": "9.2.2" + } + }, + "@intlify/devtools-if": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@intlify/devtools-if/-/devtools-if-9.2.2.tgz", + "integrity": "sha512-4ttr/FNO29w+kBbU7HZ/U0Lzuh2cRDhP8UlWOtV9ERcjHzuyXVZmjyleESK6eVP60tGC9QtQW9yZE+JeRhDHkg==", + "requires": { + "@intlify/shared": "9.2.2" + } + }, + "@intlify/message-compiler": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.2.2.tgz", + "integrity": "sha512-IUrQW7byAKN2fMBe8z6sK6riG1pue95e5jfokn8hA5Q3Bqy4MBJ5lJAofUsawQJYHeoPJ7svMDyBaVJ4d0GTtA==", + "requires": { + "@intlify/shared": "9.2.2", + "source-map": "0.6.1" + } + }, "@intlify/shared": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.2.2.tgz", @@ -19813,47 +22382,66 @@ "integrity": "sha512-m5hCw7LH3wPDcERaF4sp/ojR9sEx7Rl8TpOyH/4jjQxMF2DuY/q5pO+i9o5Dx+BXLSa9+IQ0qhAbWYRyESQXmA==" }, "vue-router": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.1.6.tgz", - "integrity": "sha512-DYWYwsG6xNPmLq/FmZn8Ip+qrhFEzA14EI12MsMgVxvHFDYvlr4NXpVF5hrRH1wVcDP8fGi5F4rxuJSl8/r+EQ==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.2.4.tgz", + "integrity": "sha512-9PISkmaCO02OzPVOMq2w82ilty6+xJmQrarYZDkjZBfl4RvYAlt4PKnEX21oW4KTtWfa9OuO/b3qk1Od3AEdCQ==", "requires": { - "@vue/devtools-api": "^6.4.5" + "@vue/devtools-api": "^6.5.0" } }, "vue-template-compiler": { "version": "2.7.14", "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz", "integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==", - "dev": true, + "devOptional": true, "requires": { "de-indent": "^1.0.2", "he": "^1.2.0" } }, "vue-tsc": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.0.13.tgz", - "integrity": "sha512-DORISA3Fu9595xbg5HQqUj4XZVvkyRkcZFJCkCt1CeN7tIMgVRQ8ow07AKcbuHoEkqg7OI4qLu1wyC/VH3o5Ug==", - "dev": true, + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.8.6.tgz", + "integrity": "sha512-8ffD4NGfwyATjw/s40Lw2EgB7L2/PAqnGlJBaVQLgblr3SU4EYdhJ67TNXXuDD8NMbDAFSM24V8i3ZIJgTs32Q==", + "devOptional": true, "requires": { - "@volar/vue-language-core": "1.0.13", - "@volar/vue-typescript": "1.0.13" + "@vue/language-core": "1.8.6", + "@vue/typescript": "1.8.6", + "semver": "^7.3.8" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "devOptional": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "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, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "devOptional": true + } } }, "vuetify": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-3.0.1.tgz", - "integrity": "sha512-Vl4wYB4mCm6GFK6Q9KZDK+HM3YKI7md7BoUPwbgqZj4bkofjQ/8NVSRQQpTcwk0YoQrgw6qj0QaOtP5zitkS1Q==", + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-3.3.9.tgz", + "integrity": "sha512-Oh7iLYvhd99MyVqH8nrK5rai7t2R9ivuiZAZKE0sfP4x0MSYthXRPBqXi4Vy98R7MggNFaoMBDJ/hPscuRxnQA==", "requires": {} }, - "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" - } - }, "web-streams-polyfill": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", @@ -19904,6 +22492,19 @@ "is-symbol": "^1.0.3" } }, + "which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + } + }, "why-is-node-running": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", @@ -19919,58 +22520,38 @@ "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "requires": { "string-width": "^1.0.2 || 2 || 3 || 4" - }, - "dependencies": { - "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==" - }, - "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==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - } } }, - "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==", - "devOptional": true - }, "wrap-ansi": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.0.1.tgz", - "integrity": "sha512-QFF+ufAqhoYHvoHdajT/Po7KoXVBPXS2bgjIam5isfWJPfIOnQZ50JtUiVvCv/sjgacf3yRrt2ZKUZ/V4itN4g==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "requires": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.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==" - }, "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" + "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" + } }, - "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "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": { - "ansi-regex": "^6.0.1" + "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==" } } }, @@ -19979,18 +22560,28 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, - "ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "requires": {} - }, "xml-name-validator": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", "dev": true }, + "xss": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.14.tgz", + "integrity": "sha512-og7TEJhXvn1a7kzZGQ7ETjdQVS2UfZyTlsEdDOqvQF7GoxNfY+0YLCzBy1kPdsDDx4QuNAonQPddpsn6Xl/7sw==", + "requires": { + "commander": "^2.20.3", + "cssfilter": "0.0.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==" + } + } + }, "xxhashjs": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz", @@ -20005,14 +22596,15 @@ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" }, "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "yaml": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true }, "yaml-eslint-parser": { "version": "0.3.2", @@ -20034,46 +22626,34 @@ } }, "yargs": { - "version": "17.6.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", - "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "requires": { - "cliui": "^8.0.1", + "cliui": "^7.0.2", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "string-width": "^4.2.3", + "string-width": "^4.2.0", "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "dependencies": { - "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==" - }, - "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==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - } + "yargs-parser": "^20.2.2" } }, "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==" + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" }, "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==" }, + "zhead": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/zhead/-/zhead-2.0.10.tgz", + "integrity": "sha512-irug8fXNKjqazkA27cFQs7C6/ZD3qNiEzLC56kDyzQART/Z9GMGfg8h2i6fb9c8ZWnIx/QgOgFJxK3A/CYHG0g==" + }, "zip-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", diff --git a/frontend/package.json b/frontend/package.json index 8c4eea7b..caa44042 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -12,32 +12,36 @@ "typecheck": "nuxt typecheck" }, "dependencies": { - "@vitest/coverage-c8": "^0.29.2", - "@vueuse/core": "^9.6.0", - "@vueuse/nuxt": "^9.6.0", - "axios": "^1.1.3", - "qs": "^6.11.0", - "sass": "^1.56.1", - "vite-plugin-vuetify": "^1.0.0", - "vitest": "^0.29.2", + "@intlify/core-base": "^9.3.0-beta.22", + "@intlify/shared": "^9.3.0-beta.24", + "@vitest/coverage-c8": "^0.33.0", + "@vueuse/core": "^10.2.1", + "@vueuse/nuxt": "^10.2.1", + "axios": "^1.4.0", + "nuxt-security": "^0.14.2", + "qs": "^6.11.2", + "sass": "^1.64.1", + "vite-plugin-vuetify": "^1.0.2", + "vitest": "^0.33.0", "vue-i18n": "^9.2.2", "vue-matomo": "^4.2.0", - "vuetify": "^3.0.1" + "vuetify": "^3.3.9" }, "devDependencies": { - "@babel/eslint-parser": "^7.19.1", - "@intlify/unplugin-vue-i18n": "^0.8.0", - "@mdi/font": "^7.0.96", + "@babel/eslint-parser": "^7.22.9", + "@intlify/unplugin-vue-i18n": "^0.12.2", + "@mdi/font": "^7.2.96", "@nuxtjs/eslint-config-typescript": "^12.0.0", - "@nuxtjs/i18n": "^8.0.0-beta.10", + "@nuxtjs/i18n": "^8.0.0-beta.13", "@types/qs": "^6.9.7", - "eslint": "^8.28.0", - "eslint-config-prettier": "^8.5.0", + "eslint": "^8.45.0", + "eslint-config-prettier": "^8.8.0", "eslint-plugin-nuxt": "^4.0.0", - "eslint-plugin-prettier": "^4.2.1", - "nuxt": "3.0.0", - "nuxt-icon": "^0.1.8", - "typescript": "^4.9.4", - "vue-tsc": "^1.0.13" + "eslint-plugin-prettier": "^5.0.0", + "nuxt": "3.6.5", + "nuxt-icon": "^0.4.2", + "nuxt-simple-sitemap": "^3.1.4", + "typescript": "^5.1.6", + "vue-tsc": "^1.8.6" } } \ No newline at end of file diff --git a/frontend/pages/algoritme/[lars].vue b/frontend/pages/algoritme/[lars].vue index a1d70f74..d46f54ac 100644 --- a/frontend/pages/algoritme/[lars].vue +++ b/frontend/pages/algoritme/[lars].vue @@ -1,16 +1,33 @@